Skip to content

Repository files navigation

밑줄 (mitjul) — 백엔드

책 한 줄 공유 서비스 밑줄의 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=false

실행

set -a && source .env && set +a && ./gradlew bootRun

기본 포트 8080. healthcheck: GET /actuator/health.

테스트

./gradlew test

통합 테스트는 mitjul_test 별도 DB 사용. 매 테스트 시작 시 cleanup.sql로 모든 테이블 TRUNCATE + Redis flushDb.

API 매트릭스 (요약)

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

프론트 repo

ochanhyeok/mitjul-web

라이선스

사이드 프로젝트, 비공개.

About

밑줄 — 책 한 줄 공유 서비스 (백엔드)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages