React/FSD
React FSD 3회차: FSD의 Layer와 Slice 구성
atomicdev
2024. 11. 12. 11:02
728x90
3회차: Segment를 통한 코드 세분화
목표
Segment를 활용하여 코드를 세분화하고, 각 세그먼트의 역할을 이해합니다.
Segment 구성
FSD의 Segment는 각 슬라이스 내부에서 코드를 더욱 체계적으로 관리하기 위해 나누어집니다. 주로 ui, model, api, lib, consts로 구성됩니다. 이 구성은 각 기능 모듈의 역할을 명확히 하여 코드의 가독성과 유지보수성을 높입니다.
각 Segment의 역할
- ui: 사용자 인터페이스 컴포넌트를 포함합니다.
- model: 상태 관리 및 비즈니스 로직을 담당합니다.
- api: API 호출을 담당하는 함수들을 포함합니다.
- lib: 공통 라이브러리나 유틸리티 함수를 정의합니다.
- consts: 상수 값을 정의하여 코드의 가독성과 재사용성을 높입니다.
실습: features/user 슬라이스 내 Segment 생성 및 예시 코드 작성
Step 1: 프로젝트 설정
이전 회차에서 생성한 fsd-example 프로젝트를 사용하거나, 다음 명령어로 새 프로젝트를 생성합니다.
npx create-react-app fsd-example --template typescript
cd fsd-example
Step 2: features/user 슬라이스에 Segment 폴더 생성
features/user 슬라이스 내에 다음과 같은 Segment 폴더들을 생성합니다.
fsd-example/
├── src/
│ ├── features/
│ │ ├── user/
│ │ │ ├── ui/
│ │ │ ├── model/
│ │ │ ├── api/
│ │ │ ├── lib/
│ │ │ └── consts/
└── ...
Step 3: 각 Segment에 예시 코드 작성
각 Segment의 역할에 맞게 파일을 생성하고 예시 코드를 작성합니다.
- ui/UserProfile.tsx
사용자 프로필 UI 컴포넌트입니다.// src/features/user/ui/UserProfile.tsx import React from 'react'; import { useUser } from '../model/useUser'; const UserProfile = () => { const { user } = useUser(); return ( <div> <h2>User Profile</h2> <p>Name: {user.name}</p> <p>Age: {user.age}</p> </div> ); }; export default UserProfile;
- model/useUser.ts
사용자 상태 관리 로직입니다.// src/features/user/model/useUser.ts import { useState } from 'react'; import { User } from '../consts/userTypes'; export const useUser = () => { const [user, setUser] = useState<User>({ name: 'John Doe', age: 30 }); return { user, setUser, }; };
- api/userApi.ts
사용자 관련 API 호출 함수입니다. 여기서는 예시로 사용자 데이터를 가져오는 함수만 작성했습니다.// src/features/user/api/userApi.ts import { User } from '../consts/userTypes'; export const fetchUserData = async (): Promise<User> => { // 예시로 실제 API 호출을 생략하고, mock 데이터를 반환합니다. return new Promise((resolve) => { setTimeout(() => { resolve({ name: 'Jane Doe', age: 28 }); }, 1000); }); };
- lib/userUtils.ts
사용자와 관련된 유틸리티 함수를 정의합니다.// src/features/user/lib/userUtils.ts import { User } from '../consts/userTypes'; export const getUserGreeting = (user: User): string => { return `Hello, ${user.name}! You are ${user.age} years old.`; };
- consts/userTypes.ts
사용자와 관련된 타입 및 상수를 정의합니다.// src/features/user/consts/userTypes.ts export interface User { name: string; age: number; }
Step 4: App 컴포넌트에서 UserProfile 컴포넌트 사용
이제 UserProfile 컴포넌트를 App 컴포넌트에 추가하여 실행해 보겠습니다.
- src/App.tsx
import React, { useEffect } from 'react'; import UserProfile from './features/user/ui/UserProfile'; import { fetchUserData } from './features/user/api/userApi'; import { useUser } from './features/user/model/useUser'; import { getUserGreeting } from './features/user/lib/userUtils'; const App = () => { const { user, setUser } = useUser(); useEffect(() => { const fetchData = async () => { const userData = await fetchUserData(); setUser(userData); }; fetchData(); }, [setUser]); return ( <div className="App"> <UserProfile /> <p>{getUserGreeting(user)}</p> </div> ); }; export default App;
Step 5: 프로젝트 실행
다음 명령어로 프로젝트를 실행하여 브라우저에서 http://localhost:3000으로 접속해 결과를 확인합니다.
npm start

결과 확인
브라우저 화면에 사용자 정보와 환영 메시지가 출력되면 성공적으로 세그먼트별 코드 구성을 완료한 것입니다.
728x90