Memory of Year는 2024년 공개 협업 저장소에서 시작한 앨범, 편지, 사진 관리 서비스의 Spring Boot REST API 백엔드입니다. JWT 인증, S3 파일 업로드, MySQL/H2 실행 환경, Swagger 문서, k6 부하 테스트 스크립트를 포함합니다.
원본 저장소의 공개 커밋으로 본인의 인증·앨범·편지·사진 기반 작업을 확인할 수 있습니다. 현재 저장소의 2026년 리팩터링과 테스트 보강은 당시 협업 기간과 분리합니다. 자세한 근거는 PROVENANCE.md에 정리했습니다.
| 구분 | 내용 |
|---|---|
| 공개 원본 | 2024GanzithonPYTHON/7_Ganzi_BackEnd |
| 2024 본인 기여 | 인증, 앨범, 편지, 사진의 백엔드 기반 |
| 2026 후속 작업 | 리팩터링, 테스트, MySQL/Docker, 문서 보강 |
| 주장 경계 | 팀 규모·배포·실사용자 수는 공개 근거 없이 주장하지 않음 |
아래 화면은 저장소 소유자가 확인한 당시 프론트엔드 데모 맥락입니다. 현재 저장소에 프론트엔드 소스나 공개 배포가 있음을 뜻하지 않습니다.
![]() 프로젝트 시작 |
![]() 회원가입 & 로그인 |
![]() 앨범 생성 |
![]() 편지 생성 |
추억을 앨범 단위로 모으는 서비스에서는 사용자 인증, 미디어 업로드, 앨범별 편지/사진 조회가 함께 동작해야 합니다. 이 저장소는 그 흐름을 REST API로 나누고, 목록 조회에서 발생할 수 있는 N+1 쿼리를 줄이는 방식까지 함께 정리합니다.
- 회원가입, 로그인, 로그아웃과 JWT 필터 기반 인증
- 앨범 생성, 조회, 수정
- 앨범 안의 편지 작성, 목록, 상세 조회
- 사진 업로드와 조회, 스티커 업로드와 목록 조회
- AWS S3 연동 설정과 로컬 기본값
- 공통 응답 형식과 전역 예외 처리
- Swagger UI, Actuator health/metrics/info
- k6 기반 회원가입, 로그인, 앨범 조회, 편지 목록 부하 테스트
| 영역 | 기술 |
|---|---|
| Backend | Java 17, Spring Boot 3.3.5, Spring Web, Spring Security |
| Persistence | Spring Data JPA, MySQL 8, H2 |
| Storage | AWS SDK S3 |
| API Docs | springdoc-openapi |
| Test / Quality | JUnit 5, Spring Security Test, MySQL Testcontainers, MockWebServer S3 boundary, JaCoCo, k6 |
| Infra | Docker, Docker Compose, Gradle |
src/main/java/com/demo/album/
├── config/ # Security, Swagger, S3, Web 설정
├── controller/ # User, Album, Letter, Photo, Sticker API
├── dto/ # 요청/응답 DTO와 공통 응답
├── entity/ # User, Album, Letter, Photo, Sticker
├── exception/ # 전역 예외 처리
├── filter/ # JWT 필터
├── repository/ # JPA Repository
├── service/ # 비즈니스 로직
└── util/ # JwtTokenProvider
기본 프로필은 H2 인메모리 DB를 사용합니다.
./gradlew bootRunMySQL 프로필로 실행하려면 Docker Compose를 사용하거나 MySQL 환경 변수를 설정합니다.
docker compose up --build./gradlew bootRun --args='--spring.profiles.active=mysql'H2 전용 Compose 파일도 포함되어 있습니다.
docker compose -f docker-compose.h2.yml up --build테스트와 커버리지 리포트는 Gradle로 실행합니다.
./gradlew test
./gradlew test jacocoTestReport실행 후 API 문서는 http://localhost:8080/swagger-ui.html에서 확인할 수 있습니다.
load-test/에는 다음 k6 스크립트가 포함되어 있습니다.
k6 run load-test/01-register.js
k6 run load-test/02-login.js
k6 run load-test/03-album-get.js
k6 run load-test/04-letters.jsload-test/는 재실행 가능한 시나리오 입력입니다.- raw 결과와 실행 환경이 함께 보존되지 않은 과거 수치는 공개 측정값으로 사용하지 않습니다.
LetterRepository의 photo count 서브쿼리와 테스트는 현재 조회 경로를 검증하지만 과거 대비 성능 개선율을 증명하지 않습니다.- MySQL Testcontainers 테스트는 실제 MySQL dialect의 소유권·연관 조회 경계를 검증합니다.
- S3 HTTP boundary 테스트는 AWS SDK가 생성하는 요청과 응답 parsing을 검증하며 실제 AWS 운영 이력은 아닙니다.
- 로컬 기본 설정은 S3 접근 키가 없어도 애플리케이션이 기동되도록 더미 값을 둡니다.
- 실제 S3 업로드를 사용하려면
CLOUD_AWS_S3_BUCKET,CLOUD_AWS_REGION,CLOUD_AWS_ACCESS_KEY,CLOUD_AWS_SECRET_KEY를 환경에 맞게 지정해야 합니다.



