📗 오늘 학습한 내용

프로그래머스 LEVEL.1 1문제 풀이

  • 콜라 문제
    • 쉬운 문제였지만 while문의 조건을 잘 못 작성해서 실패를 많이했다.

프로그래머스 LEVEL.2 3문제 풀이

  • 2진 변환 반복하기
  • 올바른 괄호
  • 숫자의 표현

기술면접, 일반면접 준비

TypeScript 학습

  • tsconfig.json 설정 방법
  • 모듈관련 학습

📘 추가로 공부할 내용

TypeScript 

Next.js

Redux Query

  • server와 client 사이 비동기 로직들을 쉽게 사용할 수 있기 때문에 학습해야한다.

STRAPI

  • 이전에 작업했던 프론트엔드 팀 프로젝트를 TS로 리팩토링할 때, 파이어베이스 대신 STRAPI를 사용하여 작업할 예정이기 때문에 학습해봐야겠다.

📝 중요한 내용

  • 코딩테스트 준비
    • 문제가 쉬울 것이라는 자만심을 버리고 하나하나 다시 꼼꼼히 풀어보는 것이 성공률을 올릴 수 있고, 나만의 빠른 해법을 찾을 수 있도록 노력해야 겠다.
  • TypeScript
    • tsconfig.json 설정 방법
    • ts모듈의 코드변환 방법

'Daily > Today I Learned' 카테고리의 다른 글

22.10.27_TIL  (0) 2022.10.27
22.10.26_TIL  (0) 2022.10.26
22.10.24_TIL  (0) 2022.10.25
22.10.23_TIL  (0) 2022.10.23
22.10.22_TIL  (0) 2022.10.22

Vite란?

공식문서에 따르면 프랑스어로 빠르다를 의미하고, 빠르고 간결한 모던 웹 프로젝트 개발 경험에 초점을 맞춰 탄생한 빌드 도구이다.

  • 개발 시 네이티브 ES Module을 넘어 더욱 다양한 기능을 제공한다.
  • 번들링 시, Rollup 기반의 다양한 빌드 커맨드를 사용할 수 있습니다. 이는 높은 수준으로 최적화된 정적(static) 리소스들을 배포할 수 있게끔 하며, 미리 정의된 설정(Pre-configured)을 제공합니다.

Create React App대신 사용하는 이유

CRA는 JavaScript로 구성된 Webpack을 사용하는데 속도가 느린편입니다. 평소에는 못느낄 수 있지만 처리해야 할 코드의 양이 많아질 수록 느린 속도를 채감할 수 있습니다.
위와 같은 단점을 해결하기 위해 Esbuild를 기반으로 만들어진 빌드툴인 Vite를 사용하게 됩니다.

*Esbuild: Go 언어로 작성된 JavaScript 빌드툴로 속도가 빠르다.

지원중인 템플릿

  • vanilla
  • vue
  • react
  • preact
  • lit
  • svelte

Vite 설치하기

아래와 같은 명령어를 입력하여 설치할 수 있습니다.
Vite를 사용하기 위해서는 14.18+, 16+의 Node.js를 요구하며 템플릿에 따라 더 높은 버전의 Node.js를 요구할 수 있습니다.

npm create vite@latest

yarn create vite

템플릿 생성하기

React로 작성을 할 것이기 때문에 템플릿 명으로 react를 작성하면 됩니다.
TypeScript의 경우 템플릿-ts를 붙여작성하게 됩니다.

# npm 6.x
npm create vite@latest ${디렉터리 명} --template ${템플릿 명}

# npm 7+
npm create vite@latest ${디렉터리 명} -- --template ${템플릿 명}

# JavaScript react 템플릿 생성
npm create vite@latest vite-test -- --template react

# TypeScript react-ts 템플릿 생성
npm create vite@latest vite-test -- --template react-ts

Vite 실행

npm run dev

참고자료

'Coding > React & React-native' 카테고리의 다른 글

[RN] React Native란?  (0) 2023.12.22
[React] React Hook Form과 yup을 사용한 유효성 검사  (0) 2022.11.21
[React] Portals  (0) 2022.07.16
[React] Fragment  (0) 2022.07.12
[React] React 디버깅  (0) 2022.07.08

📗 오늘 학습한 내용

프로그래머스 LEVEL.1 1문제 풀이

프로그래머스 LEVEL.2 1문제 풀이

기술면접, 일반면접 준비

TypeScript 강의

  • React TypeScript 생성
  • 기존 JavaScript로 구성된 React TypeScript로 리팩토링

Vite

  • CRA(Create React App)을 대신해 사용할 수 있는 빌드 도구

📘 추가로 공부할 내용

TypeScript 

Next.js

Redux Query

STRAPI

📝 중요한 내용

  • TypeScript
    • 타입스크립트로 리액트 프로젝트 생성하는 방법
    • 자바스크립트로 구성된 리액트 프로젝트 타입스크립트로 리팩토링 하는 방법

'Daily > Today I Learned' 카테고리의 다른 글

22.10.26_TIL  (0) 2022.10.26
22.10.25_TIL  (0) 2022.10.25
22.10.23_TIL  (0) 2022.10.23
22.10.22_TIL  (0) 2022.10.22
22.10.21_TIL  (0) 2022.10.21

Redux?

상태를 전역적으로 관리하기 위해서 사용되는 상태관리 도구이며, Redux 외에도 MobX, React Context, Recoil 등이 있습니다.
상태관리 도구를 사용하여 Props drilling 이슈를 해결할 수 있습니다.

Props drilling?
상태가 존재하는 컴포넌트에서 자식 컴포넌트로 이동을 할 때, 수많은 props를 계속해서 내려야하는 경우를 말하며, 코드의 가독성이 나빠지고 유지보수 또한 힘들어집니다.

Action

상태에 어떤 Action(행동)을 취할 것인지 정해놓는 객체입니다.
Action이 많아질 경우 ActionTypes 파일을 생성하여 타입을 모아두는 경우도 있습니다.
Action 타입을 정의할 때는 모두 대문자로 Snake Case로 작성합니다.

// 전달 받을 값(payload)가 없을 경우
export const loginSuccess = () => ({
  type: "LOGIN_SUCCESS"
})

// 전달 받을 값(payload)가 있을 경우
// payload는 주로 단일 데이터, 객체로 받습니다.
export const loginInfo = (res) => ({
  type: "LOGIN_INFO",
  payload: res
})

Reducer

Dispatch에서 전달받은 Action(행동) 객체의 type에 따라서 상태를 변경시키는 함수입니다. Reducer가 여러개 일 경우 combineReducers를 사용하여 하나로 묶어줄 수 있습니다.

Store

상태가 관리되는 오직 하나뿐인 상태 저장소의 역할을 합니다.
createStore을 사용할 경우 toolkit을 사용하라는 의미로 밑줄이 그어집니다.

import { createStore } from "redux";
import rootReducer from "./redux/reducers";

// Reducer를 연결한다.
const store = createStore(rootReducer);

export default store;

React-redux 초기 세팅

redux 라이브러리 설치

React에서 Redux를 사용하기 위해서는 redux, react-redux를 모두 설치해야 합니다.
아래의 코드에서 @reduxjs/toolkit은 후에 react-toolkit을 사용하기 위해 설치한 것입니다.

npm install @reduxjs/toolkit redux react-redux

파일 구조 생성

redux-test
└─ src
   ├─ App.js     메인화면
   ├─ Compo1.js  프롭받을 컴포넌트
   ├─ Compo2.js  프롭받을 컴포넌트
   ├─ index.css
   ├─ index.js
   ├─ redux
   │  ├─ actions  액션 정의
   │  │  └─ login.js
   │  └─ reducers 상태 변경 함수
   │     ├─ index.js
   │     └─ loginReducer.js
   └─ store.js    상태 저장소

Actions 폴더 생성

  • 액션에 관한 파일 생성
  • 액션 타입과 액션을 각각의 파일로 생성해도 무관하다.
// login.js
export const LOGIN_SUCCESS = "LOGIN_SUCCESS";
export const LOGIN_INFO =  "LOGIN_INFO";

export const loginSuccess = () => ({
  type: LOGIN_SUCCESS
})

export const loginInfo = (res) => ({
  type: LOGIN_INFO,
  payload: res
})

Reducers 폴더 생성

  • 리듀서를 정의할 파일 생성
// index.js
import { combineReducers } from "redux";
import loginReducer from "./loginReducer";

// 여러 리듀서들을 하나로 묶어준다.
const rootReducer = combineReducers({
  loginReducer,
});

export default rootReducer;

// loginReducer.js
import { LOGIN_SUCCESS, LOGIN_INFO } from "../actions/login";

// 초기 상태 지정
const initialstate = {
  isLogin: false,
  userName: "",
};

// 초기 상태 불변성
const loginReducer = (state = initialstate, action) => {
  switch (action.type) {
    case LOGIN_SUCCESS:
      return {
        // 순서 중요
        ...state,
        isLogin: true,
      };
    case LOGIN_INFO:
      return {
        isLogin: true,
        userName: action.payload,
      };
    default:
      return state;
  }
};

export default loginReducer

루트 폴더 src폴더에 store.js 파일 생성

  • store.js: 상태가 저장되는 저장소
// store.js
// 취소선: redux toolkit 사용하란 의미
import { createStore } from "redux";
import rootReducer from "./redux/reducers";

const store = createStore(rootReducer);

export default store;

Redux 상태 사용하기

Redux의 상태를 변경 및 불러오기 위해서는 useDispatch, useSelector가 필요합니다.

useDispatch

Reducer를 호출하여 Action을 전달해주는 함수이다. 전달인자로는 Action의 객체가 전달된다.
useDispatch를 사용하기 위해서는 변수에 할당해 준뒤 사용할 수 있다.

import { useDispatch } from "react-redux";
import { loginInfo, loginSuccess } from "./redux/actions/login";

// 사용하기위해 변수에 할당(함수형식)
const dispatch = useDispatch();

// 전달인자가 없을 경우
dispatch(loginSuccess());

// 전달인자가 있을 경우
dispatch(loginInfo("homil2"));

useSelector

컴포넌트와 state를 연결하여 Redux의 state에 접근할 수 있게 해주는 메서드이다.
함수내에서는 사용할 수 없다.

import { useSelector } from "react-redux";

// 위에서 정의한 loginReducer의 상태 값을 객체로 받아온다.
useSelector((state) => state.loginReducer)

실사용

로그인 버튼 클릭시 로그인상태가 유지되며 유저네임을 작성후 전송하면 해당 유저의 이름이 같이 담기도록 하는 코드를 구현했다.

// app.js
import React, { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { loginInfo, loginSuccess } from "./redux/actions/login";

const App = () => {
  const dispatch = useDispatch();
  const [name, setName] = useState("");

  const nameChange = (el) => {
    setName(el)
  };
  console.log(useSelector((state) => state.loginReducer))

  const loginBtnClick = () => {
    dispatch(loginSuccess())
    dispatch(loginInfo(name))
  };

  return (
    <div className="container">
      <div>
        <label htmlFor="name">이름</label>
        <input id="name" onChange={(el) => nameChange(el.target.value)}></input>
      </div>
      <div>
        <button type="button" onClick={loginBtnClick}>
          로그인
        </button>
      </div>
    </div>
  );
};

export default App;

// index.js
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import { Provider } from "react-redux";
import store from "./store";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>
);

'Coding > 전역 상태 관리 라이브러리' 카테고리의 다른 글

[Redux] Redux-toolkit  (0) 2022.11.21
[Redux] Redux?  (0) 2022.07.01

📌  개발자는 꾸준함이 생명이라고 생각이들어 하루에 5시간은 무조건 공부를 하는데 쏟기로 했는데 아직까진 잘 지켜지고 있어서 다행이다!!! 앞으로도 꾸준히 개발에 대한 공부를 멈추지 않고 열심히 해야겠다.

📗 오늘 학습한 내용

메인프로젝트 팀 노션 페이지 정리

프로그래머스 LEVEL.0 4문제 풀이

기술면접, 일반면접 준비

TypeScript 강의

  • 조합 타입 (union)
  • 리터럴 타입
  • 타입별칭

📘 추가로 공부할 내용

TypeScript 

  • 타입스크립트로 React 웹 만들기

Next.js

Redux Query

Vite

📝 중요한 내용

  • TypeScript
    • 조합, 리터럴, 타입별칭 설정 방법

'Daily > Today I Learned' 카테고리의 다른 글

22.10.25_TIL  (0) 2022.10.25
22.10.24_TIL  (0) 2022.10.25
22.10.22_TIL  (0) 2022.10.22
22.10.21_TIL  (0) 2022.10.21
22.10.20_TIL  (0) 2022.10.21

✅ 오늘 한 일

배포링크 : https://d1chxyssw587bm.cloudfront.net/

발표 자료준비

  • 스택 이미지 및 각종 기획 링크 깃헙 업로드

레저용품 판매점

  • API가 늦게와서 목데이터를 생성해서 화면에 출력할 수 있게함.
  • 발표 전 주말에 API가 와서 목데이터 -> API로 수정

좋아요(관심목록) 기능 API 연결

Route53 비용 발생

  • 가비아에서 구매한 도메인을 사용하기 위해서 사용했다.
  • 하지만, Route53은 프리티어가 적용되지 않는 범위였다. 
  • 몇만회 이상 get요청이 오지 않는다면 1달러씩만 내면된다고 한다.
  • 차후 방안으로는 CloudFlare를 사용하는 방법이 있을 것이다.

채팅 기능 구현 (Stomp 사용)

  • 채팅 기능을 백엔드 측에서 API를 생성하여 크롬 플러그인을 사용해 소켓 테스트까지 맞췄다. 하지만, 채팅기능을 맡았던 팀원이 열심히 했지만 실시간을 데이터가 잘 받아와지지 않은 상황이 있었기에 발표시점이 얼마 남지않아 최대한 구현할 수 있도록 같이 진행했다.
  • 여러방면으로 검색을 통해 다양한 코드들로 구성했다가 지웠다가를 반복하며 실시간으로 사용자간 채팅을 주고 받을 수 있도록 구현했다.
  • 채팅목록도 로그인한 사용자가 볼 수 있도록했다.
  • 위의 기능기 구현 된 후 디자인을 변경했다.

배포사이트 새로고침 시 하얀배경

  • num run build 후 라이브 서버로 테스트하기위해 작업한 index.html 파일에 있는 경로들을 상대경로로 만들었던 것이 문제였다. 절대경로로 바꾸니 해결됨

📝 데모데이 질문 및 답변 목록 / 피드백

프론트엔드

  • 질문: form data 형식을 사용했을 때 어려움은 없었나요 ?
    • 딱히 어려움은 없었으며 오히려 백엔드와 타입을 맞출 수 있어서 좋았다.
    • 파일크기 및 문자 길이 제한 있었지만 해결했습니다.
  • 질문: 웹 소캣은 어떤 것을 사용하셨나요?
    • STOMP 라이브러리를 사용해서 실시간 채팅 기능을 구현했습니다.
  • 질문: 반응형은 어떻게 구현하셨나요?
    • 스타일드 컴포넌트와 반응형 웹 라이브러리를 사용해서 구현했습니다.
  • 피드백: FE분들 리액트 프레임워크, 최신 라이브러리, 최신 기술을 익히는 것도 중요하지만 SPA 방식에 부합하는 것과 렌더링에 대한 깊이를 조금 더 깊이 공부해보면 좋을 것 같다.

백엔드

  • 질문: 소켓 트래픽 테스트를 해보았나요?
    • 트래픽 테스트는 못했습니다.
      • 피드백: 유저가 많아질 경우를 대비해서 트래픽 테스트틀 해보는 것도 좋다.
  • 질문: 소켓으로 통신한다고 하셨는데 채팅 메시지를 보낼때 마다 DB에 쌓이는지?
    채팅이 완료된 후에 DB에 쌓이는지?
    • 실시간으로 채팅을 보낼 때 마다 DB에 쌓이게 됩니다.
  • 질문: 채팅은 실시간으로 진행되나요?
    • 네! 실시간으로 채팅이 가능합니다. 하지만 현재 이전 대화 목록을 가져오는 API가 없어서 실시간으로만 채팅이 가능합니다.

공통 피드백

  1. 자신만의 코드를 장문으로 작성할 수 있어야한다.
  2. 프로젝트를 진행할 때 일정 조율을 잘 해야한다.
  3. 실패, 성공의 여부를 잘 파악해야한다.

🥲 어려웠던 일

  • 실시간 채팅 기능 구현

📌 해야할 일

  • 리팩토링
  • 자잘한 버그 수정

+ Recent posts