728x90
4회차: FSD를 활용한 기능 개발
목표
FSD 구조를 활용하여 실제 기능을 개발하고, 각 레이어, 슬라이스, 세그먼트 간의 상호작용을 이해합니다.
기능 개발 흐름
- entities 레이어에서 도메인 모델을 정의합니다.
- features 레이어에서 비즈니스 로직을 구현합니다.
- widgets 레이어에서 UI 컴포넌트를 구성합니다.
- pages 레이어에서 최종 페이지를 구성하여 완성합니다.
예시 기능
"사용자 목록을 불러와 화면에 표시하는 기능"을 구현하겠습니다.
실습: 사용자 목록 표시 기능 개발
Step 1: 프로젝트 설정
이전 실습에서 생성한 fsd-example 프로젝트를 사용하거나 새로 프로젝트를 생성해도 좋습니다.
npx create-react-app fsd-example --template typescript
cd fsd-example
Step 2: 엔티티 정의 (entities 레이어)
사용자 엔티티 모델을 정의하기 위해 entities/user 슬라이스를 생성하고, 사용자 타입을 설정합니다.
- src/entities/user/userTypes.ts
export interface User { id: number; name: string; email: string; }
Step 3: 비즈니스 로직 구현 (features 레이어)
사용자 데이터를 불러오고 상태를 관리하는 로직을 구현합니다.
- features/user/api/userApi.ts
사용자 데이터를 불러오는 API 함수를 작성합니다. 실제 API 대신 mock 데이터를 반환하도록 설정합니다.import { User } from '../../../entities/user/userTypes'; export const fetchUsers = async (): Promise<User[]> => { return new Promise((resolve) => { setTimeout(() => { resolve([ { id: 1, name: 'Alice', email: 'alice@example.com' }, { id: 2, name: 'Bob', email: 'bob@example.com' }, { id: 3, name: 'Charlie', email: 'charlie@example.com' }, ]); }, 1000); }); };
- features/user/model/useUsers.ts
사용자 목록 상태를 관리하는 훅을 작성합니다.import { useState, useEffect } from 'react'; import { User } from '../../../entities/user/userTypes'; import { fetchUsers } from '../api/userApi'; export const useUsers = () => { const [users, setUsers] = useState<User[]>([]); const [loading, setLoading] = useState<boolean>(true); useEffect(() => { const loadUsers = async () => { const data = await fetchUsers(); setUsers(data); setLoading(false); }; loadUsers(); }, []); return { users, loading }; };
Step 4: UI 컴포넌트 구성 (widgets 레이어)
사용자 목록을 보여주는 UI 컴포넌트를 작성합니다.
- widgets/UserList/UserList.tsx
import React from 'react'; import { User } from '../../entities/user/userTypes'; interface UserListProps { users: User[]; } const UserList: React.FC<UserListProps> = ({ users }) => { return ( <div> <h3>User List</h3> <ul> {users.map((user) => ( <li key={user.id}> <p>Name: {user.name}</p> <p>Email: {user.email}</p> </li> ))} </ul> </div> ); }; export default UserList;
Step 5: 페이지 구성 (pages 레이어)
전체 페이지를 구성하고 useUsers 훅을 사용해 사용자 데이터를 가져오며 UserList 컴포넌트를 렌더링합니다.
- pages/UserPage.tsx
import React from 'react'; import { useUsers } from '../features/user/model/useUsers'; import UserList from '../widgets/UserList/UserList'; const UserPage = () => { const { users, loading } = useUsers(); if (loading) { return <p>Loading...</p>; } return ( <div> <h2>Users</h2> <UserList users={users} /> </div> ); }; export default UserPage;
Step 6: App 컴포넌트에서 페이지 렌더링
이제 App.tsx에서 UserPage를 불러와 화면에 표시합니다.
- src/App.tsx
import React from 'react'; import UserPage from './pages/UserPage'; const App = () => { return ( <div className="App"> <UserPage /> </div> ); }; export default App;
Step 7: 프로젝트 실행
다음 명령어로 프로젝트를 실행하여 브라우저에서 http://localhost:3000으로 접속해 결과를 확인합니다.
npm start
결과 확인
브라우저에서 UserPage가 렌더링되고, 사용자 목록이 표시됩니다. 로딩 상태를 포함하여 사용자가 목록을 보기 전에 "Loading..." 텍스트가 잠깐 나타나는 것도 확인할 수 있습니다.
728x90
'React > FSD' 카테고리의 다른 글
React FSD 3회차: FSD의 Layer와 Slice 구성 (0) | 2024.11.12 |
---|---|
React FSD 2회차: FSD의 Layer와 Slice 구성 (0) | 2024.11.12 |
React FSD 1회차: FSD 개념 이해 및 프로젝트 설정 (0) | 2024.11.12 |
React 애플리케이션에서 Feature-Sliced Design(FSD) 적용하기 (0) | 2024.11.12 |