Skip to content

Commit d392220

Browse files
committed
Merge branch 'dev' into feat/write#19
2 parents c8c7723 + c99fd87 commit d392220

File tree

18 files changed

+296
-65
lines changed

18 files changed

+296
-65
lines changed

README.md

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
# SSOUL 프로젝트 인수인계 문서
2+
3+
## �� 프로젝트 개요
4+
5+
**프로젝트명**: SSOUL (칵테일을 좋아하는 사람들을 위한 서비스)
6+
**기술 스택**: Next.js 15, React 19, TypeScript, Tailwind CSS
7+
**저장소**: https://github.com/prgrms-web-devcourse-final-project/WEB5_6_HaeDokCoding_FE
8+
9+
## �� 시작하기
10+
11+
### 개발 환경 설정
12+
```bash
13+
# 의존성 설치
14+
npm install
15+
16+
# 개발 서버 실행
17+
npm run dev
18+
19+
# 빌드
20+
npm run build
21+
22+
# 코드 포맷팅
23+
npm run format
24+
25+
# 린트 검사
26+
npm run lint
27+
```
28+
29+
### 환경 변수
30+
프로젝트는 개발/운영 환경에 따라 다른 API URL을 사용합니다:
31+
- `NEXT_PUBLIC_API_URL_DEV`: 개발 환경 API URL
32+
- `NEXT_PUBLIC_API_URL_PROD`: 운영 환경 API URL
33+
34+
## �� 프로젝트 구조
35+
36+
```
37+
src/
38+
├── app/ # Next.js App Router 페이지
39+
│ ├── layout.tsx # 루트 레이아웃
40+
│ ├── page.tsx # 메인 페이지
41+
│ ├── community/ # 커뮤니티 관련 페이지
42+
│ ├── recipe/ # 칵테일 레시피 페이지
43+
│ ├── recommend/ # 취향 추천 페이지
44+
│ ├── login/ # 로그인 관련 페이지
45+
│ ├── mypage/ # 마이페이지
46+
│ └── api/ # API 설정
47+
├── domains/ # 도메인별 컴포넌트
48+
│ ├── community/ # 커뮤니티 도메인
49+
│ ├── recipe/ # 레시피 도메인
50+
│ ├── recommend/ # 추천 도메인
51+
│ ├── login/ # 로그인 도메인
52+
│ ├── mypage/ # 마이페이지 도메인
53+
│ └── shared/ # 공통 도메인 컴포넌트
54+
└── shared/ # 공통 컴포넌트 및 유틸
55+
├── components/ # 공통 UI 컴포넌트
56+
├── styles/ # 글로벌 스타일
57+
├── assets/ # 이미지, 아이콘 등
58+
├── hook/ # 공통 훅
59+
├── types/ # 타입 정의
60+
└── utills/ # 유틸리티 함수
61+
```
62+
63+
## �� 주요 기능
64+
65+
### 1. 인증 시스템
66+
- **소셜 로그인**: Google, Kakao, Naver 지원
67+
- **상태 관리**: Zustand + localStorage persist
68+
- **주요 파일**:
69+
- `src/domains/shared/store/auth.ts`: 인증 상태 관리
70+
- `src/domains/login/hook/useAuthHooks.ts`: 로그인 관련 훅
71+
- `src/app/api/config/appConfig.ts`: API 설정
72+
73+
### 2. 페이지별 기능
74+
75+
#### �� 메인 페이지 (`/`)
76+
- 현재 기본 구조만 구현됨
77+
- 추후 확장 예정
78+
79+
#### �� 칵테일 레시피 (`/recipe`)
80+
- **주요 컴포넌트**:
81+
- `CocktailList`: 칵테일 목록 표시
82+
- `Accordion`: 필터링 옵션
83+
- `SelectBox`: 정렬 옵션
84+
- **기능**: 검색, 필터링, 정렬
85+
- **상세 페이지**: `/recipe/[id]` - 개별 칵테일 상세 정보
86+
87+
#### �� 커뮤니티 (`/community`)
88+
- **주요 컴포넌트**:
89+
- `PostCard`: 게시물 카드
90+
- `CommunityTab`: 카테고리 탭
91+
- `WriteBtn`: 글쓰기 버튼
92+
- **카테고리**: 레시피, 팁, 질문, 자유
93+
- **글쓰기**: `/community/write`
94+
- **상세 페이지**: `/community/[id]`
95+
96+
#### �� 취향 추천 (`/recommend`)
97+
- **챗봇 기반 추천**: `ChatSection` 컴포넌트
98+
- **주요 컴포넌트**:
99+
- `BotMessage`, `UserMessage`: 메시지 컴포넌트
100+
- `BotOptions`: 선택 옵션
101+
- `MessageInput`: 입력창
102+
- `TypingIndicator`: 타이핑 효과
103+
104+
#### �� 마이페이지 (`/mypage`)
105+
- **기본 리다이렉트**: `/mypage``/mypage/mybar`
106+
- **주요 섹션**:
107+
- `/mypage/mybar`: 나만의 바
108+
- `/mypage/my-active`: 활동 내역 (게시물, 댓글, 좋아요)
109+
- `/mypage/my-alarm`: 알림 설정
110+
- `/mypage/my-setting`: 계정 설정
111+
112+
#### �� 로그인 (`/login`)
113+
- **소셜 로그인**: `SocialLogin` 컴포넌트
114+
- **성공 페이지**: `/login/success`
115+
- **신규 사용자**: `/login/user/first-user`
116+
117+
## �� 기술적 세부사항
118+
119+
### 상태 관리
120+
- **Zustand**: 클라이언트 상태 관리
121+
- **Persist**: localStorage를 통한 상태 영속화
122+
- **주요 스토어**:
123+
- `auth.ts`: 사용자 인증 상태
124+
- `accordionStore.ts`: 아코디언 UI 상태
125+
126+
### UI/UX
127+
- **Tailwind CSS**: 스타일링
128+
- **React Hot Toast**: 토스트 알림
129+
- **Lottie**: 로딩 애니메이션
130+
- **GSAP**: 고급 애니메이션
131+
- **Responsive**: 모바일/데스크톱 대응
132+
133+
### 개발 도구
134+
- **ESLint**: 코드 품질 관리
135+
- **Prettier**: 코드 포맷팅
136+
- **Husky**: Git hooks
137+
- **Lint-staged**: 커밋 전 검사
138+
139+
## �� 주요 설정 파일
140+
141+
- `next.config.ts`: Next.js 설정
142+
- `tailwind.config.js`: Tailwind CSS 설정
143+
- `eslint.config.mjs`: ESLint 설정
144+
- `tsconfig.json`: TypeScript 설정
145+
146+
## �� 반응형 디자인
147+
148+
프로젝트는 모바일 우선(Mobile-first) 접근 방식을 사용합니다:
149+
- **모바일**: 기본 스타일
150+
- **태블릿**: `md:` prefix
151+
- **데스크톱**: `lg:`, `xl:` prefix
152+
153+
## �� 주의사항
154+
155+
1. **환경 변수**: 개발/운영 환경에 맞는 API URL 설정 필요
156+
2. **인증 토큰**: localStorage에 저장되므로 보안 고려 필요
157+
3. **API 통신**: `credentials: 'include'` 설정으로 쿠키 기반 인증
158+
4. **Git Hooks**: Husky 설정으로 커밋 전 자동 검사
159+
160+
## �� 추가 문의
161+
162+
- **저장소 이슈**: https://github.com/prgrms-web-devcourse-final-project/WEB5_6_HaeDokCoding_FE/issues
163+
- **주요 브랜치**: `main` (메인), `dev` (개발)
164+
165+
---
166+
167+
**작성일**: 2025-10-14
168+
**작성자**: 이성헌
169+
**버전**: 1.0
-7.95 MB
Binary file not shown.
2.08 MB
Binary file not shown.
2.09 MB
Binary file not shown.
2.07 MB
Binary file not shown.
2.06 MB
Binary file not shown.
2.02 MB
Binary file not shown.

src/app/layout.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
import '@/shared/styles/global.css';
12
import type { Metadata } from 'next';
23
import '@/shared/styles/global.css';
34
import { Toaster } from 'react-hot-toast';
4-
import Header from '@/shared/components/header/Header';
5-
import FooterWrapper from '@/shared/components/footer/FooterWrapper';
65
import ScrollTopBtnWrapper from '@/shared/components/scroll-top/ScrollTopBtnWrapper';
76
import KaKaoScript from './api/kakao/KaKaoScript';
87
import 'swiper/css';

src/domains/main/cocktailDrop/CocktailDrop.tsx

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,12 @@ function CocktailDrop({ isDesktop = false }: CocktailDropProps) {
4444
);
4545

4646
// 로고 위에서 아래로 자연스럽게 등장
47-
const screenWidth = window.innerWidth;
48-
const viewportHeight = window.innerHeight;
49-
const isTablet = screenWidth >= 640 && screenWidth < 1024;
50-
const isMobile = screenWidth < 640;
51-
52-
// 뷰포트 높이 기반으로 로고 위치 계산
53-
const logoFinalY = isMobile
54-
? `-${viewportHeight * 0.3}px`
55-
: isTablet
56-
? `-${viewportHeight * -0.9}px`
57-
: '0px';
58-
47+
const isMobile = window.innerWidth < 768;
5948
gsap.fromTo(
6049
logoRef.current,
6150
{ y: -300, opacity: 0 },
6251
{
63-
y: logoFinalY, // 뷰포트 높이 기반 계산
52+
y: isMobile ? -140 : -40, // 모바일에서는 더 위로
6453
opacity: 1,
6554
duration: 3,
6655
ease: 'power3.out',
@@ -81,7 +70,7 @@ function CocktailDrop({ isDesktop = false }: CocktailDropProps) {
8170
return (
8271
<div
8372
ref={containerRef}
84-
className="relative w-full lg:min-h-[120vh] md:min-h-[85vh] min-h-[82vh] flex flex-col lg:justify-center md:justify-center justify-end items-center mt-10"
73+
className="relative w-full md:min-h-[110vh] min-h-[74vh] flex flex-col md:justify-center justify-end items-center mt-10 overflow-hidden"
8574
id="scroll-fixed"
8675
>
8776
{/* 대각선 줄 1 */}
@@ -96,7 +85,7 @@ function CocktailDrop({ isDesktop = false }: CocktailDropProps) {
9685
/>
9786

9887
{/* 로고 */}
99-
<div ref={logoRef} className="absolute md:w-130 w-85 md:h-90 h-40">
88+
<div ref={logoRef} className="absolute z-20 md:w-115 w-65 md:h-90 h-40">
10089
<Image
10190
src="/logo.svg"
10291
alt="로고 이미지"
@@ -108,13 +97,15 @@ function CocktailDrop({ isDesktop = false }: CocktailDropProps) {
10897
</div>
10998

11099
{/* 컵 이미지 - 모바일에서 바닥에 붙도록 */}
111-
<div className="absolute bottom-0">
100+
<div className="z-10 md:relative absolute bottom-0">
112101
<Image
113102
src={Cocktailcup}
114103
alt="칵테일 컵"
104+
width={900}
105+
height={800}
115106
priority
116-
style={{ height: 'auto' }}
117-
className="md:w-[700px] w-[500px] object-contain"
107+
style={{ width: 'auto', height: 'auto' }}
108+
className="md:w-auto md:h-auto w-[300px] h-[300px] object-contain"
118109
/>
119110
</div>
120111
<div className="absolute md:bottom-35 bottom-20 flex items-center justify-center z-3 w-full">

src/domains/main/components/3d/Landing.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import HomeModel from './HomeModel';
44
import HomeLogo from './HomeLogo';
55
import HomeText from './HomeText';
6-
import Scroll from './Scroll';
76
import { useEffect, useState } from 'react';
87
import ModelImage from './ModelImage';
98

@@ -30,7 +29,6 @@ function Landing({ setIsLoading, isDesktop }: Props) {
3029
<>
3130
<HomeLogo isDesktop={isDesktop} />
3231
<HomeText isDesktop={isDesktop} />
33-
<Scroll isDesktop={isDesktop} />
3432
</>
3533
)}
3634
</div>

0 commit comments

Comments
 (0)