처음 스프링부트 백엔드를 배우는 학생이 Controller -> Service -> Entity -> Repository 흐름을 따라가며 읽을 수 있도록 정리한 샘플입니다.
완성된 main 코드를 바로 읽으면 JWT, Security, 예외 처리까지 한 번에 보입니다. 처음 배우는 학생은 아래 브랜치 순서로 읽는 편이 좋습니다.
chapter/01-study-read: Study 조회 흐름chapter/02-study-crud: Study 생성, 수정, 삭제chapter/03-todo: Study별 Todochapter/04-response-exception: 공통 응답과 예외 처리chapter/05-auth-login: 회원가입과 로그인chapter/06-jwt-security: JWT와 Spring Security
완성본을 읽을 때는 다음 파일 순서를 권장합니다.
src/main/java/com/ducami/studymate/domain/study/controller/StudyController.javasrc/main/java/com/ducami/studymate/domain/study/service/StudyService.javasrc/main/java/com/ducami/studymate/domain/study/repository/StudyRepository.javasrc/main/java/com/ducami/studymate/domain/todo/controller/TodoController.javasrc/main/java/com/ducami/studymate/global/exception/handler/GlobalExceptionHandler.javasrc/main/java/com/ducami/studymate/global/security/config/SecurityConfig.javasrc/main/java/com/ducami/studymate/global/security/jwt/filter/JwtAuthenticationFilter.java
Controller: HTTP 요청을 받고 응답을 돌려준다.Service: 실제 비즈니스 로직을 처리한다.Entity: 데이터베이스 테이블과 연결되는 객체다.Repository: JPA로 DB 접근을 담당한다.Security: 로그인 후 받은 JWT를 검사해서 현재 사용자를 확인한다.GlobalExceptionHandler: 예외를 한 곳에서 공통 응답으로 바꿔 준다.
처음 볼 때 헷갈리기 쉬운 문법:
record: 값을 담는 DTO를 짧게 쓰는 Java 문법입니다. 생성자와 getter 역할의 메서드가 자동으로 생깁니다.Optional<T>: 값이 있을 수도 있고 없을 수도 있다는 뜻입니다. 초반 챕터에서는isEmpty()와get()으로 흐름을 풀어 씁니다.@RequiredArgsConstructor:final필드를 받는 생성자를 Lombok이 대신 만들어 줍니다. 이 생성자를 통해 Spring이 Bean을 주입합니다.session -> ...: 람다입니다. Spring Security가 넘겨준 설정 객체를 오른쪽 코드에서 사용한다고 읽습니다.AbstractHttpConfigurer::disable: 메서드 참조입니다. Security 설정에서 해당 기능을 끈다고 읽으면 됩니다.
기본 설정은 MySQL 기준입니다. 로컬 MySQL에 studymate 데이터베이스가 준비되어 있다면 바로 실행할 수 있습니다.
./gradlew bootRun실행 후 확인할 수 있는 주소:
- Swagger UI:
http://localhost:8080/swagger-ui/index.html
환경변수를 따로 주고 싶다면 아래 값을 덮어쓰면 됩니다.
export DB_URL=jdbc:mysql://localhost:3306/studymate
export DB_USERNAME=mates
export DB_PASSWORD='Mates123!@#'- 스터디 목록 조회
GET /api/v1/studies - 스터디 상세 조회
GET /api/v1/studies/{id} - 회원가입
POST /api/v1/users/signup - 로그인
POST /api/v1/auth/login - 로그인 응답의 JWT를
Authorization: Bearer <token>헤더에 넣기 - 스터디 생성
POST /api/v1/studies - Todo 생성
POST /api/v1/studies/{studyId}/todos - Todo 상태 변경
PATCH /api/v1/studies/{studyId}/todos/{todoId}/status
모든 응답은 아래 구조를 사용합니다.
{
"status": 200,
"message": "요청에 성공했습니다.",
"data": {}
}성공/실패 모두 같은 모양을 유지해서, 프론트엔드나 테스트 코드에서 확인하기 쉽게 만들었습니다.