FE 공통사항 도메인 테크스펙 - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki
1. 공통 도메인
1️⃣ 배경 (Background)
- 프로젝트 목표 (Objective): 여러 도메인에서 반복되는 구현(요청/캐싱/에러처리/폼/모달)을 공통 규칙으로 통일하여 UX 일관성, 버그 감소, 개발 생산성을 확보함
- 핵심 결과 (Key Result) 1: API 호출/에러 처리 방식 통일로 중복 구현 감소
- 핵심 결과 (Key Result) 2: 폼 검증/에러 메시지 표준화로 입력 단계 이탈 및 오류 리포트 감소
- 핵심 결과 (Key Result) 3: 모달/토스트 정책 통일로 UI/상태 꼬임(닫힘 누락, 배경 스크롤 등) 0건 목표
- 문제 정의 (Problem):
- 도메인별로 API 호출 방식이 달라지면(axios/fetch 혼용, 에러 처리 제각각) 유지보수 비용 커짐
- 폼 검증 방식이 통일되지 않으면 같은 입력 오류도 페이지마다 메시지/UX가 달라짐
- 모달이 각자 구현되면 포커스 트랩/스크롤 락/중첩 모달 같은 문제로 버그가 늘어남
- 가설 (Hypothesis): 공통 규칙(API 레이어/React Query 패턴/Zustand 원칙/폼 표준/모달 정책)을 정리하고 재사용 가능한 유틸, 컴포넌트를 제공하면, 도메인별 구현이 빠르고 안전해지며 UX도 일관됨
- 관련 자료: 프론트 기술 스택 선정 문서, 백엔드 API 명세
2️⃣ 목표가 아닌 것 (Non-goals) (Optional)
이번 프로젝트에서 다루지 않는 내용:
- 다크모드
2️⃣ 설계 및 기술 자료 (Architecture and Technical Documentation)
아키텍처 개요 (Architecture Overview)
- 프레임워크/라이브러리
- React + Next.js
- App Router 기반으로 라우팅/레이아웃을 표준화할 수 있어 화면 수가 많은 Devths에서 구조를 일관되게 유지
- 페이지 성격에 맞게 SSG/CSR을 선택해 초기 로딩 UX(랜딩)와 인터랙션 중심 화면(채팅/캘린더)을 균형 있게 구성할 수 있음
- React + Next.js
- 상태 관리
- Zustand
- 전역 UI 상태가 많아서 Zustand가 store로 관리 가능해 props drilling을 줄임
- 필요한 상태만 구독하는 방식으로 불필요한 리렌더링 줄이기 좋음
- Zustand
- UI 컴포넌트
- shadcn/ui
- 기본 UI를 빠르게 구성하면서도 Tailwind 기반으로 프로젝트 디자인을 일관되게 유지 가능
- 공통 UI를 표준화하기에 적합함
- shadcn/ui
- 스타일링
- Tailwind CSS
- 화면이 많은 프로젝트에서 스타일을 컴포넌트 단위로 빠르게 적용 가능
- Tailwind CSS
- 폼 관리
- React Hook Form + Zod
- 폼이 많은 서비스이기에 입력 상태/검증/에러 표시 표준화 필요성
- RHF는 불필요한 리렌더링을 줄이면서 폼을 다루기 쉬움
- Zod 스키마로 검증 규칙을 한 곳에 모아 타입과 검증의 불일치를 줄일 수 있음
- React Hook Form + Zod
- 데이터 페칭
- TanStack Query
- 서버 데이터가 많은 화면에서 캐시 기반으로 중복 요청을 줄이고, 로딩/에러/성공 상태를 일관되게 관리 가능
- TanStack Query
- API 통신
- Axios
- baseURL, 헤더, 인터셉터를 한 곳에서 표준화해 API 호출 방식이 화면마다 달라지는 것을 방지함
- Axios
- 실시간
- STMOP + WebSocket
- 1:1/그룹 채팅, 읽음 처리처럼 이벤트가 많은 기능에서 Pub/Sub 구조로 확장하기 좋음
- Spring과 궁합이 좋음
- STMOP + WebSocket
- CSR/SSG 적용 범위
/(랜딩) : SSG- 서비스 소개/기능 설명 등 정적 콘텐츠 중심이며, 빌드 시 HTML을 미리 생성해 빠른 초기 로딩과 안정적인 서빙에 유리함
/auth/*(OAuth 콜백) : CSR- 사용자마다 매번 다른 인가 코드/쿼리를 받아 처리해야 하므로 정적 생성 불가
- 브라우저에서 쿼리 파싱 → 서버 토큰 교환 API 호출 → 로그인 상태 설정 → 리다이렉트 흐름이 자연스러움
/signup: CSR- 닉네임 입력/프로필 이미지 업로드 등 사용자 입력이 핵심
- 가입 여부 판별도 보통 클라이언트에서
/me조회로 분기 처리 가능(미가입이면 가입 폼 노출)
/calendar,/board,/chat,/profile등 메인 기능 페이지 : CSR- 로그인 이후 사용자 개인화 데이터(일정/글/채팅/알림)를 TanStack Query로 가져와 그리는 인터랙션 중심 화면
- 필터/무한스크롤/실시간 업데이트 등 클라이언트 상태 변화가 많음
주요 페이지 / 컴포넌트 구조
- 페이지 (Pages):
/: 랜딩 페이지- 주요 기능: 서비스 소개, 기능 요약, ‘구글 로그인 시작하기’ 버튼
- 사용 컴포넌트:
AppShell(공개 레이아웃),Toast,FullScreenLoader
- 데이터 로딩 시점: 없음 (정적 콘텐츠 중심)
- 라우팅
/→ (로그인 버튼 클릭) → 구글 OAuth 인증 페이지로 이동- 인증 성공 후 →
/auth/google/callback로 리다이렉트(구글이code를 쿼리에 붙여서 반환)
- 주요 컴포넌트 (Components):
- 주요 컴포넌트 (Components):
- 주요 컴포넌트 이름
- 개요 (Overview)
- 역할:
- Props & Interface
- 내부 상태 & 이벤트
- 사용 예시 (Usage)
- 에러 처리 / 엣지 케이스
- 스타일링
- Storybook
- 개요 (Overview)
- 주요 컴포넌트 이름
- 주요 컴포넌트 (Components):
- 컴포넌트 간 관계
상태 관리 전략 (State Management Strategy)
- Global State (Zustand Stores):
- Local State (React
useState,useReducer): - Server Cache State (React Query):
API 연동 (API Integration)
- 호출할 백엔드 API 목록: (백엔드 Tech Spec 참조)
- API 호출 처리:
라우팅 (Routing)
폼 처리 및 유효성 검증 (Forms & Validation)
- 유효성 검증 로직
- 클라이언트 측:
- 서버 측(백엔드)에서도 별도 검증 로직 존재:
4️⃣ 이외 고려사항들 (Other Considerations) (Optional)
- 테스트 전략:
- 로깅 및 분석 (Logging & Analytics):
5️⃣ 함께 논의하고 싶은 내용 (Open Questions) (Optional)
6️⃣ 용어 정의 (Glossary) (Optional)
1. 유저 도메인
1️⃣ 배경 (Background)
- 프로젝트 목표 (Objective): 사용자가 랜딩 → 구글 로그인 → 회원가입(신규일때만) → 메인 화면(캘린더) 진입까지 끊김 없이 진행하도록 UX를 단순화하고, 인증 상태 관리/보안/개발 생산성을 함께 확보한다.
- 핵심 결과 (Key Result) 1: 로그인/회원가입 플로우에서 무한 리다이렉트 발생률 0%
- 핵심 결과 (Key Result) 2: 인증 관련 오류(401/토큰 만료/ 세션 만료)로 인한 강제 로그아웃/진입 실패율 감소 (Sentry/로그 기준)
- 핵심 결과 (Key Result) 3: Auth 관련 UI 컴포넌트(버튼/가드/폼/업로더) 재사용 50% 이상 확보 (Storybook 스토리 수/공유 컴포넌트 기준)
- 문제 정의 (Problem):
- 복잡한 흐름으로 UX 끊김: 로그인 직후 ‘어디로 가야 하는지’가 불명확하거나, 신규/기존 분기 처리의 일관성이 없으면 사용자가 혼란을 느낌
- 인증 버그 빈발: 새로고침 시 전역 상태 초기화로 로그인 풀림처럼 보임, 401 처리 정책 부재로 무한 리다이렉트, 만료 처리 미흡으로 토큰 만료 에러 발생
- 낮은 개발 생산성: 인증 로직이 페이지마다 흩어지면 수정 시 영향 범위가 커지고(리다이렉트 조건/에러 처리), 테스트가 어려움
- 로딩 UX 미정: 인증 상태가
unknown인 구간에서 로딩 UI가 없으면 화면 깜빡임/데이터 401이 자주 발생함
- 가설 (Hypothesis): 인증을 (1) 인증상태 전역관리(Zustand)와 (2) 유저데이터 서버캐시(React Query)로 역할을 분리하고, 보호 라우트는
AuthGuard에서 단일 정책으로 처리하면, 인증 버그(로그인 풀림/무한 리다이렉트/만료 에러)가 크게 줄고 개발 생산성도 개선될 것임 - 관련 자료: 요구사항 정의서, 화면 설계서, 백엔드 API 명세
2️⃣ 목표가 아닌 것 (Non-goals)
이번 프로젝트에서 다루지 않는 내용:
- 아이디/비밀번호 기반 자체 로그인
- 소셜 로그인 다중 제공자(카카오/네이버 등) 추가
- 계정 탈퇴/복구 정책의 세부 운영(보관 기간 등)
3️⃣ 설계 및 기술 자료 (Architecture and Technical Documentation)
아키텍처 개요 (Architecture Overview)
- 프레임워크/라이브러리: React + Next.js
- 라우팅/레이아웃을 표준으로 제공해 인증 플로우(공개/보호 라우트)를 구조적으로 분리하기 쉽고, 콜백처럼 클라이언트에서 리다이렉트가 필요한 페이지도 명확히 분리 가능
- 인증 상태 관리: Zustand
- 인증 UI 상태(로그인 됨/안 됨/확인 중)를 전역에서 일관되게 다루고,
AuthGuard에서 단일 정책으로 제어하기 위함
- 인증 UI 상태(로그인 됨/안 됨/확인 중)를 전역에서 일관되게 다루고,
- 유저 데이터 관리: TanStack Query
me같은 서버 데이터는 캐시/재시도/무효화 전략으로 관리해 새로고침/페이지 이동 시에도 일관된 사용자 정보를 제공하기 위함
- API 통신: Axios
- 인증 API에서 공통 에러 포맷/401 처리/로깅을 표준화하여 페이지마다 다른 에러 처리를 방지하기 위함
- UI 피드백: Toast + FullScreenLoader
- 인증 처리 중 로딩/실패 안내를 통일해 UX 끊김을 줄이기 위함
주요 페이지 / 컴포넌트 구조
- 페이지 (Pages)
- 페이지 이름:
- 주요 기능:
- 사용 컴포넌트:
- 데이터 로딩 시점:
- 라우팅:
- 페이지 이름:
- 주요 컴포넌트 (Components):
- 주요 컴포넌트 이름
- 개요 (Overview)
- 역할:
- 디자인 시안:
- Props & Interface
- 내부 상태 & 이벤트
- 사용 예시 (Usage)
- 에러 처리 / 엣지 케이스
- 스타일링
- Storybook
- 개요 (Overview)
- 주요 컴포넌트 이름
- 컴포넌트 간 관계
상태 관리 전략 (State Management Strategy)
- Global State (Zustand Stores):
- Local State (React
useState,useReducer): - Server Cache State (React Query):
API 연동 (API Integration)
- 호출할 백엔드 API 목록: (백엔드 Tech Spec 참조)
- API 호출 처리:
라우팅 (Routing)
폼 처리 및 유효성 검증 (Forms & Validation)
- 유효성 검증 로직
- 클라이언트 측:
- 서버 측(백엔드)에서도 별도 검증 로직 존재:
4️⃣ 이외 고려사항들 (Other Considerations) (Optional)
- 테스트 전략:
- 로깅 및 분석 (Logging & Analytics):