책 한 줄 공유 서비스 밑줄의 Spring Boot 백엔드.
책 속 마음에 남은 한 문장을 잔잔하게 남기고, 같은 책을 읽는 사람들이 페이지 순으로 모은 문장을 흘러가듯 따라가는 서비스.
- Kotlin 1.9.25 / Java 21
- Spring Boot 3.5
- PostgreSQL 16 + Flyway (V1~V3 마이그레이션)
- Redis 7 (책 검색 결과 캐싱, JWT 블랙리스트, RT 저장)
- Spring Security + OAuth2 Client (카카오) + JWT (HttpOnly 쿠키)
- 카카오 책 검색 API (외부)
- 인증: 카카오 OAuth 콜백에서 AT(1h) / RT(30d) /
is_logged_in힌트 쿠키 발급 - 공개 범위: PUBLIC / FRIENDS(v1엔 PRIVATE처럼 동작) / PRIVATE
- 같은 책 모아보기: 비로그인 사용자 PUBLIC만, 로그인 본인은 본인 PRIVATE도 같이
- 좋아요 카운트: SafeCount 패턴 — 단일 UPDATE로 row-level lock 보장 (WeFin 사이드 프로젝트에서 가져온 패턴)
- 책 트렌딩: 최근 7일 PUBLIC 노트 카운트 기반, Redis 1시간 캐시
- 노트 신고: 본인 신고 차단 + unique 인덱스로 멱등 처리
# Postgres + Redis 컨테이너 (호스트 포트 15432 / 6380 사용)
docker run -d --name mitjul-postgres -p 15432:5432 \
-e POSTGRES_DB=mitjul -e POSTGRES_USER=mitjul -e POSTGRES_PASSWORD=mitjul postgres:16
docker run -d --name mitjul-redis -p 6380:6379 redis:7.env 파일을 프로젝트 루트에 만들고 카카오 dev 키 작성 (.env는 gitignore 처리됨):
KAKAO_CLIENT_ID=...
KAKAO_CLIENT_SECRET=...
KAKAO_REST_API_KEY=...
FRONTEND_URL=http://localhost:3000
CORS_ALLOWED_ORIGINS=http://localhost:3000
COOKIE_SECURE=falseset -a && source .env && set +a && ./gradlew bootRun기본 포트 8080. healthcheck: GET /actuator/health.
./gradlew test통합 테스트는 mitjul_test 별도 DB 사용. 매 테스트 시작 시 cleanup.sql로 모든 테이블 TRUNCATE + Redis flushDb.
| Method | Path | Auth |
|---|---|---|
| GET | /api/v1/auth/me |
required |
| PATCH | /api/v1/auth/me |
required |
| DELETE | /api/v1/auth/me |
required |
| POST | /api/v1/auth/logout |
required |
| POST | /api/v1/auth/refresh |
permitAll |
| GET | /api/v1/books/search |
required |
| POST | /api/v1/books |
required |
| GET | /api/v1/books/{id} |
permitAll |
| GET | /api/v1/books/{id}/notes |
permitAll |
| GET | /api/v1/books/trending |
permitAll |
| POST | /api/v1/notes |
required |
| GET | /api/v1/notes/me |
required |
| PATCH | /api/v1/notes/{id} |
required |
| DELETE | /api/v1/notes/{id} |
required |
| POST | /api/v1/notes/{id}/like |
required |
| DELETE | /api/v1/notes/{id}/like |
required |
| POST | /api/v1/notes/{id}/report |
required |
| GET | /oauth2/authorization/kakao |
(OAuth 시작) |
src/main/kotlin/com/mitjul/
├── auth/ OAuth2 + JWT + 쿠키
├── user/ 사용자 + 닉네임 자동 생성
├── book/ 책 등록·검색·트렌딩
├── note/ 한 줄 노트 CRUD + visibility
├── like/ 좋아요 (SafeCount)
├── report/ 인앱 신고
├── common/ 공통 예외·ProblemDetail
└── config/ Security·Cache·CORS
사이드 프로젝트, 비공개.