핫플 포토 가이드 앱 "따옴"의 API 서버.
Spring Boot 기반 REST API 서버입니다. 장소·포토존·사진 데이터를 관리하고, Google OAuth 로그인과 JWT 인증, 사진/이미지의 S3 업로드, 네이버 검색·지오코딩 프록시를 제공합니다.
| 영역 | 사용 기술 |
|---|---|
| 언어·런타임 | Java 21 |
| 프레임워크 | Spring Boot 4.x (Web, Data JPA, Security, Validation) |
| 인증 | Spring Security + JWT (jjwt), Google OAuth2 ID Token 검증 |
| DB | PostgreSQL |
| 스토리지 | AWS S3 (이미지 업로드) |
| 빌드 | Gradle |
모든 API는 공통 래퍼로 응답합니다.
{
"code": "SUCCESS",
"message": "성공",
"data": {}
}Authorization: Bearer {token} 헤더로 JWT 인증합니다. /api/auth/**를 제외한 대부분의 엔드포인트가 인증을 요구합니다.
| 도메인 | 엔드포인트 (대표) |
|---|---|
| Auth | POST /api/auth/google (Google 로그인 → JWT 발급) |
| User | GET /api/users/{id}, GET /api/users/me, PATCH /api/users/me/nickname, PATCH /api/users/me/profile-image |
| Follow | POST/DELETE /api/follows/{id}, GET /api/follows/{id}/followers|followings|counts |
| Place | GET/POST /api/places, GET/PUT/DELETE /api/places/{id}, 좋아요·저장 CRUD |
| PhotoSpot | POST/DELETE /api/places/{id}/photo-spots |
| Photo | GET /api/photos, POST /api/photos(multipart), 좋아요·인기·파생(derivation) |
| Upload | POST /api/uploads/images (S3 업로드 → imageUrl) |
| 네이버 프록시 | GET /api/places/search, /search/image, /geocode |
전체 명세는
API.md참고.
도메인별 패키지로 구성되며, 각 도메인은 controller / service / repository / entity / dto 계층을 가집니다.
src/main/java/com/ddaom/backend/
├── auth/ # Google 로그인, JWT 발급
├── user/ # 유저 프로필, 닉네임·프로필 이미지
├── follow/ # 팔로우/언팔로우
├── place/ # 장소, 포토존, 좋아요·저장, 네이버 검색·지오코딩 프록시
├── photo/ # 사진 업로드·조회·좋아요·파생
├── upload/ # S3 이미지 업로드
├── config/ # Security, CORS, 레이트리밋, WebMvc 설정
├── base/ # 공통 베이스
└── response/ # 공통 응답·예외 처리
- JDK 21
- PostgreSQL
- 아래 환경변수 (코드에 평문 보관하지 않고
EnvironmentFile등으로 주입)
| 환경변수 | 설명 |
|---|---|
DB_USERNAME / DB_PASSWORD |
PostgreSQL 접속 정보 |
JWT_SECRET |
JWT 서명 키 (base64, 512bit 이상). 빈값이면 부팅 실패 |
NAVER_SEARCH_CLIENT_ID / NAVER_SEARCH_CLIENT_SECRET |
네이버 검색 API |
NAVER_MAP_CLIENT_ID / NAVER_MAP_CLIENT_SECRET |
네이버 지도(지오코딩) API |
# 로컬 실행
JAVA_HOME=$(/usr/libexec/java_home -v 21) ./gradlew bootRun
# 빌드(JAR)
./gradlew clean bootJar -x test./gradlew test- 비밀값(DB·JWT·네이버 키)은 모두 환경변수 전용 — 코드/설정 파일에 평문 커밋 금지
- 외부 키(네이버)는 백엔드 프록시로만 호출(클라이언트 노출 방지) + 사용자당 레이트리밋
- 이미지 업로드는 매직바이트 검사로 실제 이미지 형식만 허용(jpg/png/gif/webp/bmp/heic/heif)
- 인증은 STATELESS(JWT) — 쿠키·세션 미사용