프론트엔드 폴더 구조 설명 - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki
- 빌드 과정 없이 그대로 제공되는 파일을 넣는 곳
- 예: 아이콘, 이미지, 파비콘, 정적 파일
- 코드에서
/images/logo.png처럼 바로 접근 가능
- Next.js App Router: 라우팅 전용
- URL ↔ 페이지 연결
- 어떤 URL로 들어오면 어떤 화면을 보여줄지만 결정
- 모든 페이지에 공통으로 적용되는 최상위 레이아웃
-
<html>,<body>설정 + 전역 Provider 장착 위치 - 보통 여기서 하는 일:
- 전역 폰트 적용
-
<AppProviders />장착(React Query, Toast Host 등)
- Tailwind base + 전역 스타일
- reset, 기본 폰트, 공통 배경색 같은 앱 전체 스타일이 들어감
-
(public)은 폴더 이름이 URL에 포함되지 않음(라우트 그룹) - 로그인 안 해도 접근 가능한 화면들
page.tsx ( / )
- 랜딩 화면 라우트 엔트리
- 보통
return <LandingPage />처럼 “연결만” 함
login/page.tsx ( /login )
- 로그인 화면 라우트 엔트리
return <LoginPage />
signup/page.tsx ( /signup )
- 회원가입 화면 라우트 엔트리
return <SignupPage />
auth/callback/page.tsx ( /auth/callback )
- 구글 OAuth 인증 후 돌아오는 콜백 처리 화면
- URL에 붙은
code같은 값을 읽어서 로그인 처리 후 리다이렉트
- 로그인한 유저만 들어올 수 있는 영역
-
(app)/layout.tsx가 핵심
(app)/layout.tsx
- 보호 영역 공통 레이아웃
- 여기서 하는 일:
-
<AppShell>로 헤더/하단탭/컨테이너를 깔아줌 -
<AuthGate>로 로그인 여부 확인 후 접근 허용/차단
-
calendar/page.tsx ( /calendar )
- 캘린더 라우트 엔트리
return <CalendarPage />
board/page.tsx ( /board )
- 게시판 라우트 엔트리
return <BoardPage />
chat/page.tsx ( /chat )
- 채팅 라우트 엔트리
return <ChatPage />
llm/page.tsx ( /llm )
- AI 기능 화면 라우트 엔트리
return <LlmPage />
notifications/page.tsx ( /notifications )
- 알림 화면 라우트 엔트리
return <NotificationsPage />
profile/page.tsx ( /profile )
- 프로필 화면 라우트 엔트리
return <ProfilePage />
(app)/not-found.tsx
- 보호영역에서 404가 났을 때 보여주는 화면
- 장점: AppShell(헤더/탭)은 유지한 채 “내용만 404”로 보여줄 수 있음
(app)/error.tsx
- 보호영역에서 런타임 에러가 났을 때 보여주는 화면
- 마찬가지로 AppShell 유지 가능
src/app/not-found.tsx (전체 404)
- 전체 라우팅에서 못 찾는 경로에 대한 404
- 공개 영역에서도 공통으로 404를 보여주고 싶을 때 사용
src/app/error.tsx (전체 에러)
- 앱 전체에서 터지는 에러 처리
- 보호영역/공개영역 전부 커버하고 싶을 때 사용
- 페이지(화면) 단위 컴포넌트
- 실제 UI/데이터 로딩/이벤트 처리를 대부분 여기서 함
-
src/app은 라우팅 연결,src/screens/는 화면 구현
- 랜딩 UI 구현 (슬라이드, 시작하기 버튼 등)
- 로그인 UI 구현 (구글 로그인 버튼 등)
- 회원가입 UI 구현 (닉네임, 프로필 사진 등)
- OAuth 콜백 처리 UI/로직
-
code파라미터 읽기 → 로그인 API 호출 → 성공 시/calendar이동
- 캘린더 화면 UI + 일정 CRUD + 필터 등
- 게시판 목록/상세/작성 진입(추후 라우팅 확장 가능)
- 채팅 목록/채팅방/메시지 전송 UI
- AI 기능 화면(예: 프롬프트 입력/결과 출력/업로드 흐름)
- 알림 리스트, 읽음 처리, 이동
- 내 정보 보기/수정, 로그아웃 등
- 여러 화면에서 재사용하는 UI를 모아두는 곳
- AppShell 관련 뼈대
-
AppShell.tsx- 헤더 + 메인 컨텐츠 영역 + 바텀탭을 감싸는 레이아웃
- 보통 여기서
core/hosts(전역 로딩/모달/토스트)도 한 번만 렌더하는 위치가 됨
-
Header.tsx- 상단 헤더 UI
-
BottomNav.tsx- 하단 탭 UI
- Button/Input/Modal/Toast 같은 작은 공용 UI
- shadcn/ui의 래핑 컴포넌트나 프로젝트 공통 스타일 적용 컴포넌트가 여기에 들어감
- 여러 페이지에서 쓰는 조립된 컴포넌트
- 예:
LandingCarouselFileUploaderAvatarUploader
-
ui보다 큼 (보통 내부에서 ui 컴포넌트를 조합함)
- components exports를 한 곳에서 정리
- import 경로 깔끔하게 하려면 사용
- 프로젝트 규칙을 강제로 적용하는 영역
-
AppProviders.tsx- 전역 Provider들을 한 번에 묶는 파일
- 예:
QueryClientProvider- 전역 Toast/Modal Provider
- 테마/폰트 Provider
-
AuthGate.tsx- 보호영역 접근 제어
- 예 동작:
- 로그인 상태 확인(예:
GET /users/me) - 실패 시
/login이동 - 401 발생 시 refresh 로직으로 연결(인터셉터랑 연동)
- 로그인 상태 확인(예:
- 전역 UI를 딱 1번만 렌더하는 곳
- 어디서든 store/hook으로 “열어!” 하면 실제 UI는 여기서 뜸
-
GlobalLoadingHost.tsx- 전역 로딩(스피너/오버레이) 표시
-
GlobalInfoModalHost.tsx- “알림/정보” 모달 (확인 버튼 1개)
-
GlobalConfirmModalHost.tsx- “확인/취소” 모달 (2버튼)
-
GlobalToastHost.tsx- 토스트 알림
-
navigation.ts- 라우트 상수, 이동 helper
- 예:
ROUTES.calendar,goToLogin()같은 것들
- core exports 모음
- 백엔드랑 통신하는 함수 + 비즈니스 로직
-
authService.ts- 로그인/회원가입/로그아웃 같은 인증 관련 API 호출
-
tokenService.ts- 토큰 저장/삭제/조회(로컬스토리지/쿠키 등)
- refresh 토큰 처리 전략이 있으면 여기에 모임
- 내 정보 조회, 프로필 수정 등 유저 API
- 일정 조회/추가/수정/삭제 API
- 게시글 CRUD, 검색/필터 등
-
chatService.ts- 채팅방 목록, 메시지 내역 조회, 메시지 전송(HTTP)
-
websocketClient.ts- STOMP/WebSocket 연결/구독/해제 관리
- 실시간 메시지 수신 처리
- AI 요청/응답 API (텍스트/업로드 등)
- 알림 목록, 읽음 처리, 알림 삭제 등
-
axios.ts- axios 인스턴스 생성
- 인터셉터(401 처리, 토큰 자동 첨부, refresh 재시도 등)
- 프로젝트 전체 HTTP 규칙의 중심
-
endpoints.ts- 엔드포인트 문자열을 상수로 모음
- 예:
ENDPOINTS.users.me
-
queryClient.ts- TanStack Query 전역 옵션 설정(재시도 정책, 캐시 시간 등)
-
keys.ts- queryKey 모음
- 예:
queryKeys.user.me(),queryKeys.calendar.list(filter)
- zod 스키마 모음(선택)
- 예: 회원가입 폼 검증, 일정 생성 폼 검증
- 날짜 포맷, debounce, throttle 같은 공통 함수
- 화면에서 로직을 깔끔하게 빼고 싶을 때 사용
- 예:
-
useAuth: 로그인 상태/로그아웃 액션 -
useModal: 전역 모달 열기/닫기 -
useToast: 토스트 띄우기 -
useInfiniteScroll: 무한스크롤 공통 로직
-
-
로그인 상태, 유저 정보(필요 최소) 저장
-
서버 상태는 Query로 관리하고,
여기에는 앱 UI가 당장 필요한 최소 상태만 두는 게 안전함
- 전역 로딩/모달/토스트 같은 UI 트리거 상태
- store exports 모음
- 라우트 문자열 상수
- 예:
/calendar,/login
- 로컬스토리지 키 이름 상수
- 예:
ACCESS_TOKEN,REFRESH_TOKEN
- UI 관련 상수
- 예: 토스트 지속시간, 모달 기본 문구 등
- 공통 API 응답 타입
- 예:
ApiResponse<T>,ApiError
- 도메인 공통 타입
- 예:
User,CalendarEvent,Post,ChatMessage
- types exports 모음
- 디자인 토큰(색상, 폰트 크기, spacing) 같은 걸 정리
- Tailwind를 쓰더라도, 팀에서 통일해야 하는 값을 모아두면 편함
- 폰트 파일을 직접 번들에 포함하고 싶을 때 사용
- 단, Next font 최적화를 쓸 거면 방식에 따라 사용 여부가 달라짐
- 테스트 코드 모음(단위/통합/E2E 보조 등)
- E2E 테스트(브라우저 자동화) 설정
- 단위 테스트 설정(사용한다면)
- Tailwind 설정(테마/플러그인/콘텐츠 스캔 경로)
- Next 설정(이미지 도메인, 리다이렉트/리라이트 등)
- 의존성/스크립트 정의
- 패키지 버전 고정(팀원 환경 동일하게)