Spring Boot 3.5 / Java 21 기반 백엔드 서비스. Pop-up 스토어 검색 · 추천 · 운영을 위한 도메인 집합을 제공합니다.
Last Updated: 2025-11-09
- 개요 & 기술 스택
- 프로파일 개요
- 빠른 시작
- JWT 설정
- 테스트 실행
- OpenAPI / Swagger 배포
- EC2 배포
- IDE 가이드
- 도메인 구조 요약
- 품질 & 규약
- 문서 네비게이션
- 라이선스
- 빌드 도구: Gradle Kotlin DSL
- JDK: 21 (Temurin 권장)
- 주요 라이브러리:
- Spring Boot: Web, Security, Data JPA, Validation, Actuator
- Infra: Flyway, H2/MySQL, AWS SDK (S3) 예정
- API 문서: springdoc-openapi + Swagger UI
- Auth: jjwt (HS256), Spring Security
- Query: QueryDSL (Jakarta), MapStruct (DTO 매핑)
- Test: JUnit 5, AssertJ
아키텍처는 도메인 모듈화 패키지 (domain.user, domain.master, domain.popup …) 패턴을 따르며 서비스 / 리포지토리 / DTO / 컨트롤러를 계층적으로 구성합니다.
local(기본): H2 메모리 DB, Swagger UI 활성화, 빠른 개발용dev: IDE에서 RDS/S3 등 외부 리소스와 연동하는 개발용 (환경변수 주입)prod: EC2 배포용 (포트 80, 환경변수 기반). 운영 키/비밀번호는 절대 커밋하지 않음
프로파일 활성화 방법:
# 예) local
SPRING_PROFILES_ACTIVE=local ./gradlew bootRun
# 예) dev (RDS/S3 사용)
SPRING_PROFILES_ACTIVE=dev DB_URL=jdbc:mysql://<rds-endpoint>:3306/<db> \
DB_USERNAME=<user> DB_PASSWORD=<pass> S3_BUCKET_NAME=<bucket> \
./gradlew bootRun- Java 21 설치 (macOS는 Homebrew의 openjdk@21 권장)
- IDE에서 Gradle 프로젝트로 Import, Gradle JVM은 JDK 21 지정
./gradlew bootRun
# 혹은 명시적으로
SPRING_PROFILES_ACTIVE=local ./gradlew bootRun- Swagger UI: http://localhost:8080/swagger-ui/index.html
- 헬스 체크: http://localhost:8080/actuator/health
- liveness:
/actuator/health/ readiness: 향후 커스터마이즈 가능
- liveness:
루트 "/"는 인증 필요로 401이 정상입니다. 공개 엔드포인트는 /api/master/**(GET), /api/auth/**, /v3/api-docs/**, /swagger-ui/**, /actuator/health 입니다.
| 도메인 | 주요 엔티티 | 주요 기능 |
|---|---|---|
| master | Region / Style / Category / Feature | 마스터 데이터 조회 |
| user | Users / ConsumerProfile / SellerProfile / Preferences | 가입, 로그인, 프로필, 선호도 |
| popup | Popup / PopupImage / PopupCategory / PopupFeature | 팝업 스토어 등록/관리 |
| social | Wishlist / Review / ReviewImage | 사용자 상호작용 |
| reco | Daily*Recommendation / UserRecoDismissal | 추천 결과 저장 |
| metric | EventLog / DailyMetric* | 지표 수집 |
| audit | ApprovalRecord | 승인 / 변경 기록 |
| messaging | Message / Attachment / Announcement | 알림/메시지 전송 |
세부 테스트 태스크는 docs/DOMAIN_TESTS.md 참고.
- HS256은 최소 256비트(32바이트) 이상의 secret을 요구합니다.
application-local.yml,application-dev.yml,application-openapi.yml의 기본값은 충분한 길이로 설정되어 있습니다.- 만료시간은 밀리초(long)로 주입합니다.
환경변수로 덮어쓰기 예:
export JWT_SECRET='your-very-long-32+bytes-secret................................'
export JWT_ACCESS_TOKEN_EXPIRATION=900000
export JWT_REFRESH_TOKEN_EXPIRATION=1209600000./gradlew test
# 특정 패키지/클래스만
./gradlew test --tests '*RepositoryTest'일부 컨트롤러 테스트(판매자 프로필) 실패 케이스가 있으며, 실행에는 영향을 주지 않습니다. 필요 시 별도 이슈로 보정 가능합니다.
- 코드 스타일: 기본 IntelliJ +
-parameters컴파일 옵션 사용 (리플렉션 파라미터 이름 유지) - Null 처리: Controller → Service 간 DTO/Optional 명확화. Optional은 Service 레이어 내부에서만 사용하도록 제한 예정.
- 에러 응답: 표준 코드 (COMMON-, AUTH-) 사용. 상세 표는
docs/JWT_AUTH_IMPLEMENTATION_SUMMARY.md/docs/AUTH_SWAGGER_UPDATE_SUMMARY.md참고. - 마이그레이션: Flyway baseline 후 변경 스크립트 (
db/migration/V***__desc.sql). - 보안: 운영 secret/JWT key는 절대 커밋 금지. 로컬/테스트는 안전한 placeholder.
| 문서 | 목적 |
|---|---|
docs/IDE_SETUP.md |
IDE 및 원격 디버깅 설정 |
docs/DEPLOY_EC2.md |
Docker 없이 EC2 배포 절차 |
docs/DOMAIN_TESTS.md |
도메인별 테스트 태스크 및 규칙 |
docs/JWT_AUTH_IMPLEMENTATION_SUMMARY.md |
JWT & 보안 구현 요약 |
docs/AUTH_SWAGGER_UPDATE_SUMMARY.md |
Swagger 문서 업데이트 내역 |
docs/AUTHCONTROLLER_RECOVERY_REPORT.md |
AuthController 복구 작업 보고 |
docs/CONTROLLER_AUDIT_EMPTY_BODY_REPORT.md |
컨트롤러 응답 본문 감사 결과 |
- 문서:
docs/DEPLOY_EC2.md참조 - 핵심:
application-prod.yml+ 환경변수 기반 구성, systemd로 서비스 관리
- 문서:
docs/IDE_SETUP.md참조 (IntelliJ / Eclipse 세팅, ProxyJump, 원격 디버그)
본 레포지토리는 OpenAPI 문서를 Gradle 태스크로 생성하고, GitHub Pages(gh-pages 브랜치)에 정적 Swagger UI를 배포하는 워크플로를 포함합니다.
APP_VERSION=1.1.0 ./gradlew generateOpenApiDocs
# 산출물: build/openapi/openapi.yaml (info.version = 1.1.0)환경변수 APP_VERSION을 지정하지 않으면 기본 v1.0.0이 사용됩니다. 동적으로 버전을 관리하여 문서와 배포 아티팩트 싱크를 유지하세요.
- 워크플로:
.github/workflows/publish-openapi.yml - 트리거: 기본 push 및 수동 실행(workflow_dispatch)
- 버전:
APP_VERSION환경 변수로 주입 가능 - 첫 실행 후 GitHub Pages 설정에서 Source를
gh-pages브랜치로 지정하세요.
배포 주소(예시):
- 사용자/오거나이제이션 페이지: https://da-itdaing.github.io/final-project/
조직 정책상 GITHUB_TOKEN에 write 권한을 줄 수 없을 때는 ‘배포 키(Deploy Key)’로 배포합니다.
- 로컬에서 배포 전용 키 생성(비밀번호 없이):
ssh-keygen -t ed25519 -C "gh-pages deploy" -f gh-pages -N ""- GitHub → Repository → Settings → Deploy keys → Add deploy key
- Title: gh-pages
- Key:
gh-pages.pub내용 붙여넣기 - Allow write access 체크
- GitHub → Repository → Settings → Secrets and variables → Actions → New repository secret
- Name:
GH_PAGES_DEPLOY_KEY - Secret:
gh-pages(개인키) 파일 내용 전체 붙여넣기
- Name:
- Actions 탭에서 "Publish OpenAPI to GitHub Pages" 실행
- Settings → Pages → Branch:
gh-pages/ Folder:/ (root)설정
위 절차를 마치면 상단 주소에서 Swagger UI가 공개됩니다.
사내/프로젝트 정책에 따릅니다.
| Workflow | 목적 | 트리거 |
|---|---|---|
be-ci.yml |
백엔드 테스트 (Gradle) | PR(dev/integration, main) |
fe-ci.yml |
프론트엔드 lint / typecheck / test / build | PR(dev/integration, main) |
contract-check.yml |
OpenAPI 스펙 diff / breaking changes 감지 | PR(dev/integration, main) |
be-integration.yml |
선택적 통합(MySQL service) 테스트 | PR + 수동 |
publish-openapi.yml |
OpenAPI 스펙 GitHub Pages 배포 | push + 수동 |
publish-swagger.yml |
수동 Swagger UI 재배포 | 수동(workflow_dispatch) |
ci.yml 통합 워크플로는 중복/충돌로 제거되었습니다.
백엔드 기본 CI는 모든 테스트를 실행합니다. 도메인별 테스트를 부분적으로 실행하려면 아래 태스크를 활용하십시오:
./gradlew testUser
./gradlew testMaster
./gradlew testGeo- 커밋 메시지 앞에 gitmoji 사용 권장(예: ✨, 🐛, 🔧 등). 예시:
- ✨ feat: 캐러셀 반응형 개선
- 🐛 fix: 모바일 우측 overflow 수정
- 🧹 refactor: 컴포넌트 분리
- 📝 docs: README CI 배지 추가
간편 입력 도구:
npx gitmoji -c직접 이모지 코드로도 가능: git commit -m ":sparkles: feat: adjust breakpoints for hero carousel"