diff --git a/README.md b/README.md index 37e5e12..ffdc133 100644 --- a/README.md +++ b/README.md @@ -2,64 +2,138 @@ > 캠퍼스 주변의 맛집들을 지금 바로 찾아보세요! -**[🔗 배포 링크](https://knu-matzip.vercel.app/)** +**[🔗 서비스 바로가기](https://knu-matzip.vercel.app/)** -Frame 836 +KNU-Matzip -## 프로젝트 소개 +
-### 🗓️ 기간 +## 📖 프로젝트 소개 -2025.09 ~ 현재 [운영 중] +**KNU-Matzip 서버**는 공주대학교 학생들을 위한 캠퍼스 맛집 큐레이션 서비스의 API 서버입니다. -### ⚙️ 기술 스택 +- **기간**: 2025.09 ~ 현재 (운영 중) +- **역할**: 백엔드 설계 및 개발 -#### Back-end +#### 문제 정의 -![React](https://go-skill-icons.vercel.app/api/icons?i=java,spring,mysql,aws) +> 학교 주변 맛집 정보는 네이버 지도·검색으로 쉽게 찾을 수 있지만, 광고·협찬성 콘텐츠가 섞여 신뢰하기 어렵습니다. 그래서 학생들은 실제 경험 기반 후기를 얻으려 에브리타임을 찾지만, 후기는 시간이 지나면 밀려 사라지고 여러 게시글에 흩어져 있어 원하는 맛집 하나를 찾기 위해 매번 반복 검색해야 합니다. +> +> 문제 정의 -#### Front-end +
-![React](https://go-skill-icons.vercel.app/api/icons?i=ts,nextjs,zustand,reactquery,tailwind,storybook,pnpm,turborepo,googleanalytics,sentry&perline=5) +## ⚙️ 기술 스택 +**Back-end** -### 🥶 Back-end Architecture -knu-matzip excalidraw +![Back-end](https://go-skill-icons.vercel.app/api/icons?i=java,spring,mysql,aws) +- **Language / Framework**: Java 17, Spring Boot 3.4 (Web, Data JPA, Security, Validation) +- **Auth**: Kakao OAuth2 + Stateless JWT (`jjwt`) +- **DB**: MySQL (운영) / H2 (테스트) +- **관측성**: Spring Boot Actuator, Prometheus, Grafana +- **알림**: Discord Webhook +- **Infra**: AWS EC2, Nginx +
+Front-end 스택 (별도 저장소) -### 📱 주요 기능 +![Front-end](https://go-skill-icons.vercel.app/api/icons?i=ts,nextjs,zustand,reactquery,tailwind,storybook,pnpm,turborepo,googleanalytics,sentry&perline=5) -#### 1. 맛집 탐색 +
-> 카테고리나 지도로 캠퍼스 근처 맛집을 쉽게 찾을 수 있습니다. -IMG_2508-portrait 1 -IMG_2514-portrait 1 -IMG_2512-portrait 1 -IMG_2511-portrait 1 -IMG_2536-portrait +
-#### 2. 맛집 등록 -> 캠퍼스, 식당, 추천 메뉴, 소개, 태그, 카테고리를 단계 별로 입력해 새로운 맛집을 등록 신청합니다. -IMG_2521-portrait 1 -IMG_2523-portrait 1 -IMG_2524-portrait 1 -IMG_2525-portrait 1 -IMG_2526-portrait 1 +## 🏛️ 아키텍처 -#### 3. 럭키 드로우 이벤트 -> 맛집 등록으로 얻은 응모권을 통해 기프티콘 이벤트에 참여할 수 있습니다. -IMG_2529-portrait 1 -IMG_2530-portrait 1 -IMG_2532-portrait 1 -IMG_2533-portrait 1 +Back-end Architecture -#### 4. 오늘 뭐 먹지 -> 랜덤으로 카테고리를 추천해줍니다. -IMG_2513-portrait 1 +### 패키지 구조 -#### 5. 내 정보 조회 (등록 현황, 기프티콘) -IMG_2516-portrait 1 -IMG_2517-portrait 1 -IMG_2519-portrait 1 +기능이 늘어날수록 계층 우선(`controller/`, `service/` …) 구조는 하나의 변경이 여러 패키지에 흩어지는 문제가 있습니다. +그래서 **도메인 단위로 먼저 나누고**, 각 도메인 내부를 **3계층 레이어드**로 통일했습니다. +```text +com.matzip +├── auth # 카카오 로그인 / JWT 발급·재발급 +├── user # 프로필 +├── place # 맛집 등록·조회·찜·검색 +├── lottery # 럭키 드로우 응모 이벤트 +├── admin # 맛집 승인·거절 +└── common # 응답·예외·보안·설정·로깅·분석 등 공통 + +# 각 도메인 내부 +controller → service → repository → DB + ↘ client (외부 API·캐시 어댑터) +``` + +## 📱 주요 기능 + +| 기능 | 설명 | +| --- |-----------------------------------------| +| **맛집 탐색** | 카테고리·지도로 캠퍼스 근처 맛집 조회, 찜, 키워드 검색 | +| **맛집 등록** | 캠퍼스·식당·추천 메뉴·태그·카테고리를 단계별로 입력해 등록 신청 | +| **관리자 승인** | 등록 신청된 맛집을 관리자가 승인·거절 (승인 시 Discord 알림) | +| **럭키 드로우** | 맛집 등록으로 얻은 응모권으로 기프티콘 이벤트 참여, 스케줄러 추첨 | +| **오늘 뭐 먹지** | 랜덤 카테고리 추천 | +| **내 정보** | 등록 현황·기프티콘 조회 | + + +## 📸 화면 스크린샷 보기 + +**맛집 탐색** +

+탐색1 +탐색2 +탐색3 +탐색4 +

+ +**맛집 등록** +

+등록1 +등록2 +등록3 +등록4 +

+ +**럭키 드로우 이벤트** +

+이벤트1 +이벤트2 +이벤트3 +이벤트4 +

+ +**오늘 뭐 먹지 / 내 정보** +

+추천 +내정보1 +내정보2 +내정보3 +

+ +
+ +## 🚀 로컬 실행 + +```bash +# 1. 로컬 MySQL 준비 (localhost:3306/knu_matzip) + +# 2. 환경 변수 설정 +export DB_USER=... DB_PASS=... JWT_SECRET_KEY=... KAKAO_CLIENT_ID=... STATE_SECRET_KEY=... + +# 3. 실행 (local 프로파일) +SPRING_PROFILES_ACTIVE=local ./gradlew bootRun +``` + +**검증** + +```bash +./gradlew build # 빌드 + 테스트 +./gradlew test # 전체 테스트 (H2 인메모리 + 더미 시크릿으로 외부 의존 없이 동작) +``` + +- 스키마 반영: `local`은 `ddl-auto: update`, `prod`는 `validate` +- 배포: `main` 브랜치 push 시 EC2 자동 배포