실무형 백엔드 포트폴리오 로드맵
DATT v2 개발 및 성능 개선 로드맵
프로젝트 목표
DATT v2는 단순 장소 검색 서비스가 아니다.
핵심 목표는 다음과 같다.
- 공공데이터 기반 장소 플랫폼 구축
- 사용자 기록 기반 장소 가치 형성
- 장소 컬렉션 및 공유
- 게임화 기반 사용자 참여 유도
- 실무형 백엔드 구조 경험
- 성능 측정 및 개선 경험 확보
핵심 전략
이번 프로젝트의 핵심 전략은 다음과 같다.
처음부터 완벽하게 만들지 않는다.
측정 가능한 MVP를 먼저 만든다.
이후 실제 수치 기반으로 개선한다.
즉:
기능 구현
↓
성능 측정
↓
병목 분석
↓
구조 개선
↓
수치 검증
흐름 중심으로 진행한다.
기술 스택
| 영역 | 기술 |
|---|---|
| Language | Java 21 |
| Framework | Spring Boot |
| Security | Spring Security + JWT |
| Database | PostgreSQL |
| Spatial | PostGIS |
| Migration | Flyway |
| ORM | Spring Data JPA |
| Logging | SLF4J + MDC |
| Metrics | Micrometer |
| Monitoring | Prometheus + Grafana |
| Performance Test | k6 |
| Build | Gradle |
| Container | Docker |
전체 일정
| 기간 | 목표 |
|---|---|
| 5월 3주차 | 공통 코드 및 DB 기반 구축 |
| 5월 4주차 | 회원/JWT 인증 |
| 6월 1주차 | 장소/공공데이터/place_group |
| 6월 2주차 | Anchor/리뷰/이미지/컬렉션 |
| 6월 3주차 | 게임화 + 성능 측정 |
| 6월 4주차 | 성능 개선 및 포트폴리오 정리 |
5월 3주차 — 공통 기반 및 DB 구축
목표
개발 가능한 백엔드 기반 구조 완성
구현 목표
공통 응답 및 예외 처리
구현 항목:
- ApiResponse
- ErrorResponse
- ValidationErrorResponse
- FieldErrorResponse
- ErrorCode
- BusinessException
- GlobalExceptionHandler
요청 로그 기반 구축
구현 항목:
- RequestLoggingFilter
- traceId 생성
- durationMs 기록
- MDC 기반 로그 추적
예상 로그:
[REQUEST]
traceId=ab12cd34
method=GET
uri=/api/health
status=200
durationMs=18
DB 및 마이그레이션 기반 구축
구현 항목:
- Flyway 설정
- member 테이블
- refresh_token 테이블
- place 테이블
- place_group 테이블
- place_group_mapping 테이블
MVP 기준
이 단계에서는 성능 최적화를 하지 않는다.
현재 목표:
- 구조 안정화
- 개발 기반 확보
- 응답 형식 통일
일부러 남기는 개선 포인트
| 현재 상태 | 추후 개선 |
|---|---|
| 단순 request logging | Observability 확장 |
| DB 기반 refresh token | Redis 전환 |
| 단순 DB 인덱스 | PostGIS 최적화 |
작성 문서
- 공통 응답/예외 처리 구현 기록
- 물리 ERD 및 Flyway 적용 기록
- JWT 인증 구조 설계
5월 4주차 — 회원/JWT 인증
목표
자체 회원가입과 JWT 인증 구조 완성
구현 목표
회원 기능
구현 항목:
- 회원가입
- 로그인
- 회원 조회
- 닉네임 변경
- 회원 탈퇴
JWT 인증
구현 항목:
- Access Token 발급
- Refresh Token 발급
- JWT 인증 필터
- AuthenticationEntryPoint
- AccessDeniedHandler
Refresh Token 전략
초기 구조:
DB 저장 방식
추후 개선 예정:
Redis 기반 Refresh Token 저장
MVP 기준
현재는 Redis를 사용하지 않는다.
이유:
- 인프라 복잡도 감소
- 기능 구현 속도 확보
- JWT 인증 구조 이해 우선
일부러 남기는 개선 포인트
| 현재 상태 | 추후 개선 |
|---|---|
| DB 기반 Refresh Token | Redis 기반 전환 |
| 단순 JWT 구조 | 토큰 블랙리스트 |
| 단순 인증 로그 | 인증 메트릭 수집 |
작성 문서
- 자체 회원가입과 JWT 인증 구현
- Refresh Token DB 저장 전략
- Spring Security 인증 흐름 분석
6월 1주차 — 장소/공공데이터/place_group
목표
공공데이터 기반 장소 검색 및 지도 조회 구현
구현 목표
공공데이터 적재
구현 항목:
- 공공데이터 Import
- place 저장
- 데이터 정제
place_group 구조 구축
구현 항목:
- place_group 생성
- place_group_mapping 생성
- 대표 장소 결정
장소 검색
구현 항목:
- 키워드 검색
- 카테고리 필터
- 장소 상세 조회
- 지도 bounds 조회
MVP 기준
현재 구조:
- latitude/longitude 범위 조회
- LIKE 검색
- 단순 정렬
아직 적용하지 않는 것:
- PostGIS GiST 인덱스
- 전문 검색
- Redis 캐시
일부러 남기는 개선 포인트
| 현재 상태 | 추후 개선 |
|---|---|
| latitude/longitude 조회 | PostGIS GiST 인덱스 |
| LIKE 검색 | 검색 최적화 |
| 단순 정렬 | popular_score 최적화 |
작성 문서
- place와 place_group 분리 이유
- 공공데이터 기반 장소 그룹화 설계
- 지도 bounds 조회 구현
6월 2주차 — Anchor/리뷰/이미지/컬렉션
목표
DATT 핵심 사용자 기능 완성
구현 목표
Anchor
구현 항목:
- Anchor 작성
- Anchor 수정
- Anchor 삭제
- Anchor 공개 범위
이미지
구현 항목:
- 이미지 업로드
- Anchor 이미지 연결
- 장소 대표 이미지 표시
리뷰
구현 항목:
- 리뷰 작성
- 평점 작성
- 평균 평점 계산
컬렉션
구현 항목:
- 컬렉션 생성
- 장소 저장
- 공유 링크 생성
- 컬렉션 조회
MVP 기준
현재는 다음 구조로 간다.
- 원본 이미지 중심
- 단순 조회 구조
- 최소 기능 우선
아직 적용하지 않는 것:
- 이미지 썸네일
- 이미지 리사이징
- 컬렉션 조회 최적화
일부러 남기는 개선 포인트
| 현재 상태 | 추후 개선 |
|---|---|
| 원본 이미지 사용 | 썸네일 생성 |
| 단순 컬렉션 조회 | N+1 제거 |
| 단순 장소 상세 조회 | fetch 최적화 |
작성 문서
- Anchor 중심 기록 구조 구현
- 내부 리뷰/평점 기반 장소 가치 설계
- 장소 컬렉션과 공유 링크 구현
6월 3주차 — 게임화 및 성능 측정
목표
서비스 완성도 확보 및 성능 기준값 측정
구현 목표
게임화
구현 항목:
- 경험치 이벤트
- 레벨 시스템
- 배지/칭호
- 활동 기록
성능 측정 환경 구축
구현 항목:
- Spring Actuator
- Micrometer
- k6
- DB Query Time 측정
측정 대상 API
장소 검색
측정 항목:
- 평균 응답 시간
- P95
- P99
- 실패율
지도 bounds 조회
측정 항목:
- bounds 조회 시간
- 응답 데이터 크기
- DB query time
장소 상세 조회
측정 항목:
- Anchor 조회 시간
- 리뷰 조회 시간
- 이미지 조회 시간
컬렉션 상세 조회
측정 항목:
- N+1 발생 여부
- 응답 시간
k6 테스트 시나리오
테스트 대상:
| 지역 | 카테고리 |
|---|---|
| 성수 | 카페 |
| 강남 | 음식점 |
| 홍대 | 술집 |
| 을지로 | 작업 공간 |
동시 사용자:
- 1명
- 10명
- 30명
작성 문서
- 기록 기반 게임화 시스템 설계
- k6 기반 성능 측정 환경 구축
- DATT v2 개선 전 성능 측정 결과
6월 4주차 — 성능 개선 및 포트폴리오 정리
목표
측정 결과 기반 성능 개선 및 포트폴리오 완성
개선 우선순위
1순위 — 지도 조회 성능 개선
Before:
단순 latitude/longitude 조회
After:
PostGIS GiST 인덱스 적용
측정 비교:
- 평균 응답 시간
- P95
- P99
2순위 — popular_score 개선
Before:
요청 시 실시간 집계
After:
반정규화 count 컬럼 기반 계산
추가 예정:
- 배치 갱신
- 이벤트 기반 갱신
3순위 — 컬렉션 조회 최적화
Before:
단순 연관관계 조회
After:
fetch 전략 최적화
N+1 제거
4순위 — 이미지 응답 최적화
Before:
원본 이미지 응답
After:
thumbnail_url 사용
5순위 — Redis 캐시 검토
후보 대상:
- 인기 장소 조회
- 지도 bounds 조회
- 장소 상세 조회
성능 개선 포인트
| 개선 대상 | 개선 방식 |
|---|---|
| 지도 조회 | PostGIS GiST Index |
| 인기 장소 | 반정규화 + 배치 |
| 컬렉션 조회 | N+1 제거 |
| 이미지 응답 | Thumbnail |
| 캐시 | Redis |
작성 문서
- 지도 bounds 조회 성능 개선
- popular_score 반정규화 개선
- 컬렉션 조회 N+1 해결
- 이미지 응답 최적화
- DATT v2 성능 개선 전후 비교
최종 목표
6월 말까지 다음 상태를 목표로 한다.
- 회원가입/로그인 가능
- JWT 인증 가능
- 장소 검색 가능
- 지도 bounds 조회 가능
- Anchor 작성 가능
- 리뷰 작성 가능
- 이미지 업로드 가능
- 컬렉션 저장/공유 가능
- 게임화 가능
- k6 성능 측정 가능
- 최소 2개 이상 성능 개선 문서 확보
핵심 방향
이번 프로젝트의 핵심은 단순 기능 구현이 아니다.
중요한 것은 다음을 설명 가능한 수준까지 가는 것이다.
왜 병목이 발생했는가?
어떤 계층이 느렸는가?
왜 이런 구조를 선택했는가?
어떤 Trade-off가 존재했는가?
어떻게 측정했는가?
어떻게 개선했는가?
즉:
기능 구현
↓
측정
↓
개선
↓
수치 검증
흐름 자체를 포트폴리오로 만드는 것이 이번 프로젝트의 핵심 목표다.