저번 포스팅에서 Recoil, React-Router, Tailwind, MUI 라이브러리들을 적용했다. 이번 포스팅에서는 이를 이어서 진행해 보자. 먼저, Recoil과 React-Router를 적용하기 위해 Root.js 파일을 따로 생성해 주어야 한다. Root.js 파일은 src 폴더 안에 만들어 준다.
import { RecoilRoot } from "recoil";
import App from "./App";
import { HashRouter } from "react-router-dom";
function Root() {
return (
<>
<RecoilRoot>
<HashRouter>
<App />
</HashRouter>
</RecoilRoot>
</>
);
}
export default Root;
위 코드는 아주 기본적인 설정이다. 이 코드를 그대로 따라 하는 사람도 있겠지만, 왜 이렇게 해야 하는지 궁금한 분들도 있을 거라 생각하기 때문에 가능한 한 자세히 설명해보겠다.
import의 의미
"import"는 사전적 의미로는 "수입"이라는 뜻인데, 여기서는 다른 파일이나 라이브러리에서 필요한 요소를 불러오는 것을 의미한다. 첫 번째 줄을 보면 { RecoilRoot } from "recoil"이라고 적혀 있는데, 이것은 Recoil 라이브러리에서 RecoilRoot 요소만 가져와서 사용하겠다는 의미이다.
그다음 function Root를 정의하고 있다. 여기서 선언한 Root는 곧 태그의 이름이 된다. return 구문에서 <App />을 HashRouter와 RecoilRoot로 감싸준다. 순서는 상관없으며, 이렇게 감싸줌으로써 App 안에서는 모두 Recoil과 Router를 사용할 수 있게 된다
공식 문서 참고
이와 같은 라이브러리 적용 방법은 해당 공식 홈페이지에서 확인할 수 있다.
- Recoil 공식 홈페이지: https://recoiljs.org/ko/docs/introduction/getting-started
- React Router 공식 홈페이지: https://reactrouter.com/en/main/router-components/hash-router
Recoil 시작하기 | Recoil
React 애플리케이션 생성하기
recoiljs.org
HashRouter v6.26.2 | React Router
reactrouter.com
export default Root;의 의미
마지막에 있는 export default Root;는 이 Root.js 파일을 다른 곳에서 사용할 수 있도록 내보내는 것. 대부분의 리액트 컴포넌트는 이렇게 내보내기를 한다. 소스를 세분화하고 객체화하기 위해 필수적인 과정이다.
첫번째 방식
import { RecoilRoot } from "recoil";
import App from "./App";
import { HashRouter } from "react-router-dom";
export default function Root() {
return (
<>
<RecoilRoot>
<HashRouter>
<App />
</HashRouter>
</RecoilRoot>
</>
);
}
두번째방식
import { RecoilRoot } from "recoil";
import App from "./App";
import { HashRouter } from "react-router-dom";
function Root() {
return (
<>
<RecoilRoot>
<HashRouter>
<App />
</HashRouter>
</RecoilRoot>
</>
);
}
export default Root;
이 두 코드는 결과적으로 같은 동작을 한다, 하지만 장단점이 있다.
| 방식 | 설명 | 장점 | 단점 |
| export default function Root (Inline Export) | 함수를 정의하면서 바로 내보내기 | 간결하고 선언과 동시에 내보내기 처리 | 함수 이름을 모듈 내에서 재사용하기 어렵고, 가독성이 떨어질 수 있음 |
| function Root + export default Root; (Separate Export) | 함수를 정의한 후 나중에 내보내기 | 함수 이름을 모듈 내에서 재사용 가능, 가독성 좋음 | 함수 선언과 내보내기가 분리되므로 코드가 약간 더 길어질 수 있음 |
어느 방식을 선택해야 할까?
간단한 함수나 단일 책임 모듈에서는 export default function Root 방식이 더 적합하다. 코드가 더 간결하고, 함수 정의와 내보내기를 한눈에 파악할 수 있는 장점이 있다..
모듈 내부에서 함수를 재사용하거나, 테스트 또는 다른 부분에서 호출해야 한다면 function Root + export default Root 방식을 선택하는 것이 좋다. 내보내기와 함수 정의를 분리하여 모듈 내에서 더 유연하게 사용할 수 있기 때문.
사실 크게 유의미 하진 않다. 나 같은 경우는 페이지는 코드 끝에 export를 추가하는 걸로 component를 만들때는 function에 추가하는걸로 해서 개발하고 있다.
Root.js 생성 후
Root.js의 생성을 마치면, src 폴더의 index.js 파일도 수정해줘야 한다. 수정하기 전에는 App을 렌더링하고 있었기 때문에, 이제는 우리가 설정한 Root로 바꿔줘야 한다.
수정된 index.js 예시
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import Root from './Root';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Root />
</React.StrictMode>
);
App.js 수정
수정 후 App이 제대로 렌더링 되는지 확인하기 위해서, 간단하게 App 파일을 수정한다.
function App() {
return (
<div>
<div className="text-6xl">안녕하세요</div>
</div>
);
}
이 코드는 단순히 렌더링 확인을 위한 수정이며 이후에 만들 앱과는 관계가 없다
npm start로 앱을 실행하여 "안녕하세요" 문구가 화면에 나타나는지 확인하자.
여기까지 개발을 위한 준비 단계라고 보면 된다.
https://github.com/TaeJinAn/happy_note/commit/b5ac8297e6d7cde4984805e6d6a139c3bc86165d
Root.js생성 및 recoil, router 적용 기본 프로젝트 세팅 완료 · TaeJinAn/happy_note@b5ac829
taejin.ahn committed Sep 7, 2024
github.com
마무리
오늘 포스팅까지는 리액트 개발 프로젝트의 기초 설정이다. 이후 포스팅부터는 본격적으로 개발을 진행할 것이다. 나 역시 리액트를 처음 다루고 있어서, 포스팅을 읽는 독자들을 위해 그리고 나를 위해 포스팅하다 보면 알게 되는 내용이 더욱더 깊고 풍성해 지리라 믿는다.
개발을 잘하는 것도 중요하지만, 회사 생활과 대인관계도 무시할 수 없다. 개발 공부가 지겨울 때는 자기계발서적을 읽는 것도 좋은 방법이다. 개발 실력과 함께 성품도 함께 성장시키면, 누구나 데려가고 싶은 개발자가 될 것이다. 우리 모두 개발과 계발 두마리의 토끼를 다 잡아 자신의 value를 한층 더 끌어 올려보자.
'React' 카테고리의 다른 글
| Todo앱을 만들어 보자 -5- (6) | 2024.09.28 |
|---|---|
| Todo앱을 만들어 보자 -4- (4) | 2024.09.24 |
| Todo앱을 만들어 보자 -3- (2) | 2024.09.22 |
| React 프로젝트를 생성하고 Todo앱을 만들어 보자 -1- (12) | 2024.09.10 |
| Salesforce 개발자 끝. React 시작 (23) | 2024.09.08 |