상태 관리 라이브러리

슬슬 리액트를 사용하면서 상태 관리의 필요성을 느끼고 있다.

어떻게 하면 더 쉽게 상태를 관리할 수 있는지 알아보다가 이런 라이브러리를 알게 됐다.

무작정 사용하는것 보다는 어떻게 사용해야 하는지 알아보고자 간단하게 정리해보려고 한다.

react-query와 redux의 차이

  • react-query는 서버 상태를 다루는 라이브러리이다.
  • redux, recoil, justand 등은 클라이언트 상태를 다루는 라이브러리이다.

react-query

react-query는 전역 상태를 관리하는게 아닌, 서버-클라이언트 간의 API 비동기 작업을 도와주는 라이브러리다.

캐시처리를 해서 매번 같은 요청을 하지 않을 수 있고, isLoading 같은 상태 값과 메서드를 지원한다.

react-query를 잘 이용하면 전역적으로 관리할 데이터가 많이 줄어든다.

redux

redux는 전역 상태를 관리한다.

애플리케이션에서는 서버 데이터와 관계없이 전역적으로 데이터를 다뤄야 할 때가 있다.

이때 사용하는게 redux 같은 전역 상태 라이브러리이다.


결론

서버 상태, 클라이언트 상태를 관리하는 라이브러리를 잘 구분해서 적절하게 사용하자.

react-query + recoil 의 조합을 많이들 추천하는것 같다.

redux, justand, mobx 등도 찍어먹어보고 react-query + recoil 의 조합을 이용해보자.

'프론트엔드 > React' 카테고리의 다른 글

Portal을 이용한 모달 만들기  (0) 2024.01.26
Vite 와 CRA  (0) 2024.01.20
Yarn Berry와 NPM  (0) 2024.01.19

Portal

8주차 과제로 모달을 만들어보기는 했지만 너무 미숙하게 만든 감이 있어서 새로 만들어 보고 싶었다.

이번에는 모달 만들때 주로 쓰는 방식이라는 portal 을 이용해보기로 했다.

portal 을 사용하는 이유

리액트는 부모 컴포넌트가 렌더링 되면 자식 컴포넌트가 렌더링 되는 Tree 구조를 가지고 있다. 

보통 최상위 컴포넌트인 #root 의 div 태그 아래에 부모 컴포넌트부터 렌더링 된다.

이런 Tree 구조는 DOM 계층 구조에서 부모-자식 간에 CSS 상속 같은 영향을 미친다. 

하지만 리액트 포탈을 사용하면 독립적인 위치에서 렌더링한다. 

독립적인 위치에서 렌더링 하면 부모 컴포넌트의 영향을 받지 않을 수 있다. 

따라서 리액트 포탈을 사용하면 CSS 충돌을 방지하고 레이아웃 및 이벤트 처리를 효과적으로 할 수 있어

유지 보수성을 향상시킬 수 있다.


모달 구현하기

기본적인 구현 방식은 아래와 같다.

  1. HTML 최상위에 #modal-container 를 둔다.
  2. 모달을 만든 후 portal 을 이용하여 #modal-container 를 연결한다.

index.html

<!doctype html>
<html lang="ko">
  <head>    
    <title>Open Mind</title>
  </head>
  <body>
    <div id="root"></div>
    <div id="modal-container"></div>
  </body>
</html>

App.jsx

function App() {
  const [ isModalOpen, setIsModalOpen ] = useState(false);
  const handleOpen = () => setIsModalOpen(true);
  const handleClose = () => setIsModalOpen(false);
  
  return (
    <>
      {isModalOpen && (
      <Modal onClose={handleClose}>
        모달 내용
        <button onClick={onClose}>모달 닫기</button>
      </Modal>
      )}
      <button onClick={handleOpen}>모달 열기</button>
    </>
  );
}

export default App;

Modal.jsx

import { useRef } from "react";
import ReactDOM from "react-dom";
import styled from "styled-components";

function Modal(props) {
  const { children, onClose } = props;
  const modalRef = useRef(null);

  // useRef를 이용해 모달창 바깥을 누르면 모달창 꺼지도록 함
  const handleClickOutside = (e) => {
    if (modalRef.current && !modalRef.current.contains(e.target)) {
      onClose();
    }
  };

  return ReactDOM.createPortal(
    <ModalBg onClick={handleClickOutside}>
      <ModalContainer ref={modalRef}>{children}</ModalContainer>
    </ModalBg>,
    document.getElementById("modal-container"),
  );
}

export default Modal;

const ModalBg = styled.div`
  // 모달 배경 스타일
`;

const ModalContainer = styled.div`
  // 모달 컨테이너 스타일
`;

 

 

'프론트엔드 > React' 카테고리의 다른 글

react-query와 redux  (0) 2024.02.01
Vite 와 CRA  (0) 2024.01.20
Yarn Berry와 NPM  (0) 2024.01.19

CRA의 문제점

CRA의 문제점을 요약하자면 아래와 같다.

  1. CRA는 Webpack으로 애플리케이션을 번들링한다. 
    -> 빌드 시 앱이 굉장히 무거워지고, 변경사항을 반영하는 데 있어서 오랜 시간이 걸림
  2. 용량이 너무 크고 의존성 설치에 있어서 굉장히 오랜 시간이 걸린다

2번 문제는 많이들 경험했을거라고 생각한다.

기본적으로 리액트 프로젝트를 만들때 가장 간편한 방법은 아래 커맨드이다.

npx create-react-app

 

하지만 이걸로 리액트 프로젝트를 만들면 되게 오래 걸리는걸 경험했을 것이다.

 

Vite 와 CRA 의 차이

CRA의 문제점을 알았고, 이를 대체할 수 있는게 바로 Vite이다.

Vite 와 CRA의 차이점으로는 번들링 툴이다.

Vite를 사용하면 CRA에 비해 속도가 굉장히 빠른데, 그 이유가 바로 번들링에 있다.

CRA는 번들링에 Webpack을 쓰고, Vite는 Esbuild를 쓴다.

이에 대한 정리는 공식 문서에 자세히 정리되어있다.

'프론트엔드 > React' 카테고리의 다른 글

react-query와 redux  (0) 2024.02.01
Portal을 이용한 모달 만들기  (0) 2024.01.26
Yarn Berry와 NPM  (0) 2024.01.19

NPM에서 Yarn Berry로

기본적인 Node.js의 패키지 관리 시스템은 NPM 이다.

하지만 항해할때도 그랬고 지금 내가 쓰고있는 npm 보다는 yarn을 많이들 사용하는것 같았다.

그래서 왜 yarn을 쓰고, 무엇이 다른지 찾아보고자 했다.


Yarn Berry

Yarn Berry는 Node.js를 위한 새로운 패키지 관리 시스템이다.

2020년 1월 25일부터 정식 버전(v2)가 출시되어, 현재는 Babel과 같은 큰 오픈소스 레포지토리에서도 채택하고 있다.

Yarn Berry는 GitHub의 yarnpkg/berry 레포지토리에서 소스코드가 관리되고 있다.

NPM의 문제점

 

NPM은 Node.js 설치 시에 기본으로 제공되어 범용적으로 사용되고 있으나, 비효율적이거나 깨져 있는 부분이 많다고 한다.

이에 대해 토스 기술 블로그에 구체적으로 정리된 글이 있었다.

간단하게 요약하자면 아래와 같다.

  1. 비효율적인 의존성 검색
  2. 환경에 따라 달라지는 동작
  3. 비효율적인 설치
  4. 유령 의존성
  5. 보안 문제

yarn은 이런 문제들을 해결해준다는 이야기다.

사실 아직까지 내가 이 쪽에 조예가 깊지 않아서 뭐가 좋고 뭐가 나쁘다는걸 듣고 바로 판단하기는 어렵다.

하지만 npm에는 이런 문제가 있고, yarn으로 대체하는데는 이런 이유가 있다는 정도는 알아보았다.

일단은 yarn을 써보고 나머지는 좀 더 익숙해져보고 판단해보고자 한다.

 

 

참고자료)

 

node_modules로부터 우리를 구원해 줄 Yarn Berry

토스 프론트엔드 레포지토리 대부분에서 사용하고 있는 패키지 매니저 Yarn Berry. 채택하게 된 배경과 사용하면서 좋았던 점을 공유합니다.

toss.tech

 

'프론트엔드 > React' 카테고리의 다른 글

react-query와 redux  (0) 2024.02.01
Portal을 이용한 모달 만들기  (0) 2024.01.26
Vite 와 CRA  (0) 2024.01.20

+ Recent posts