Leafiq RESTful API 서버입니다.
- Java 21
- Spring Boot 3.5.6
- Spring Security - JWT 기반 인증/인가
- Spring Data JPA - ORM
- QueryDSL - 동적 쿼리 생성
- MySQL 9.4
- AWS S3 - 이미지 파일 저장
- Thymeleaf - 약관 페이지 렌더링
- Gradle 8.5
- JWT 기반 로그인/로그아웃
- Access Token / Refresh Token
- 토큰 갱신
- 회원가입 (이메일, 비밀번호, 닉네임)
- 프로필 조회/수정
- 비밀번호 변경
- 회원 탈퇴
- 게시글 작성/수정/삭제
- 게시글 목록 조회 (Cursor 기반 페이징)
- 게시글 상세 조회 (조회수 증가)
- 이미지 첨부 지원
- 댓글 작성/수정/삭제
- 댓글 목록 조회 (Cursor 기반 페이징)
- 게시글 좋아요 추가/삭제
- S3 이미지 업로드 (최대 20MB)
- 이미지 삭제
- 이용약관 페이지
- 개인정보처리방침 페이지
src/main/java/org/example/kakaocommunity/
├── controller/ # REST API 컨트롤러
├── service/ # 비즈니스 로직
├── repository/ # JPA 리포지토리 (QueryDSL 포함)
├── entity/ # JPA 엔티티
├── dto/
│ ├── request/ # 요청 DTO
│ └── response/ # 응답 DTO
├── mapper/ # Entity ↔ DTO 변환
├── global/
│ ├── config/ # 설정 (Security, S3, QueryDSL, Web)
│ ├── security/ # JWT 필터, ArgumentResolver
│ ├── util/ # JWT 유틸리티
│ ├── validator/ # 비즈니스 검증
│ ├── exception/ # 예외 처리
│ └── apiPayload/ # 공통 응답 형식
└── KakaoCommunityApplication.java
- JDK 21 이상
- MySQL 8.x
- AWS S3 버킷 (이미지 저장용)
- 프로젝트 클론
git clone <repository-url>
cd kakao-community- 빌드
./gradlew clean build- 실행
./gradlew bootRun또는 JAR 파일 직접 실행:
java -jar build/libs/kakao-community-0.0.1-SNAPSHOT.jar- 애플리케이션 확인
curl http://localhost:8080/health
# 응답: OK- 이미지 빌드
docker build -t kakao-community .- 컨테이너 실행
docker run -p 8080:8080 \
-e SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3306/kakao_community \
-e SPRING_DATASOURCE_USERNAME=your_db_username \
-e SPRING_DATASOURCE_PASSWORD=your_db_password \
-e CLOUD_AWS_CREDENTIALS_ACCESS_KEY=your_aws_access_key \
-e CLOUD_AWS_CREDENTIALS_SECRET_KEY=your_aws_secret_key \
-e JWT_SECRET=your_jwt_secret_key \
kakao-community자세한 API 명세는 API-SPEC.md를 참고하세요.
POST /auth- 로그인DELETE /auth- 로그아웃POST /auth/refresh- 토큰 갱신
POST /users- 회원가입GET /users/me- 내 정보 조회PATCH /users/me- 프로필 수정PATCH /users/me/password- 비밀번호 변경DELETE /users/me- 회원 탈퇴
POST /posts- 게시글 작성GET /posts- 게시글 목록 조회 (커서 페이징)GET /posts/{postId}- 게시글 상세 조회PATCH /posts/{postId}- 게시글 수정DELETE /posts/{postId}- 게시글 삭제
POST /posts/{postId}/comments- 댓글 작성GET /posts/{postId}/comments- 댓글 목록 조회PATCH /comments/{commentId}- 댓글 수정DELETE /comments/{commentId}- 댓글 삭제
POST /posts/{postId}/likes- 좋아요 추가DELETE /posts/{postId}/likes- 좋아요 삭제
POST /images- 이미지 업로드DELETE /images/{imageId}- 이미지 삭제
GET /health- 헬스체크GET /terms- 이용약관 페이지GET /privacy- 개인정보처리방침 페이지
대부분의 API는 JWT 인증이 필요합니다. 요청 헤더에 다음과 같이 토큰을 포함해야 합니다:
Authorization: Bearer {accessToken}