A. 필수: App Router를 사용하는 Next.js 프로젝트의 기본 폴더 구조는 다음과 같습니다. 아래 두 개 폴더는 Next.js 앱 구축 시 필수적으로 존재해야 해야 합니다.
app/
: 애플리케이션의 핵심 파일들이 위치합니다. 모든 파일은 이 폴더와 관련된 경로로 구성(라우팅 관련만 구성)됩니다.public/
: 외부에서 직접 접근 가능한 정적 자원들이 위치하는 폴더입니다. (ex: 이미지 파일, favicon.ico, robots.txt 등)B. 선택
app/api/
: 라우트 핸들러를 위한 디렉터로 API 엔드포인트를 생성하며 서버리스 함수로 사용됩니다.middleware/
: 미들웨어는 서버, 클라이언트, 또는 엣지에서 페이지를 렌더링하기 전에 실행되는 코드가 위치하는 폴더입니다.components/
: 재사용 가능한 UI 컴포넌트를 저장합니다.styles/
: 컴포넌트 레벨 또는 전역 스타일을 정의하는 CSS 파일을 저장합니다.lib/
또는 utils/
: 애플리케이션 전체에서 사용되는 유틸리티 함수나 라이브러리를 저장합니다.hooks/
: 사용자 정의 훅을 저장합니다.types/
또는 interfaces/
: TypeScript를 사용하는 경우 전역 타입 정의를 저장합니다.tests/
: 테스트 코드를 저장합니다.Atomic Design Pattern을 도입한 이유?
아토믹 디자인을 도입하기에 앞서, 어떤 기준으로 컴포넌트를 분리 해야할까 고민을 하게 되었습니다. 컴포넌트화를 최적으로 할 수 있는 아토믹 디자인 패턴을 고려하게 되었습니다.
Atomic Design Pattern이란?
Atomic Design Pattern의 5단계
1. Atoms(원자)
2. Molecules(분자)
3. Organisms(유기체)
4. Templates
5. Pages
Atomic Design Pattern 간소화
Atomic Design Pattern의 효율을 높이기 위한 방법
1. Container Components
⬇️ 예시 코드
import React, { useState, useEffect } from 'react';
import axios from 'axios';
const UserContainer = () => {
const [userData, setUserData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const fetchUserData = async () => {
try {
const response = await axios.get('https://api.example.com/users');
setUserData(response.data);
setLoading(false);
} catch (error) {
console.error('Error fetching user data:', error);
setLoading(false);
}
};
fetchUserData();
}, []);
return (
<div>
{loading ? (
<p>Loading...</p>
) : (
<UserList users={userData} />
)}
</div>
);
};
export default UserContainer;
2. Presentational(Presenter) Components
⬇️ 예시 코드
import React from 'react';
const UserList = ({ users }) => {
return (
<div>
<h2>User List</h2>
<ul>
{users.map(user => (
<li key={user.id}>
<span>{user.name}</span>
<span>{user.email}</span>
</li>
))}
</ul>
</div>
);
};
export default UserList;
Reference.