📚 전체 맵 1차 프로젝트 시작
Spring Boot Board Project · Full Roadmap

PROJECT ROADMAP

로그인 게시판 하나를 처음부터 끝까지 — 1차 기본 구조부터 3차 심화 리팩토링까지, 단계별 진화 흐름 전체 정리

한눈에 보는 전체 흐름
이 프로젝트는 어떻게 진행되나

하나의 게시판 프로젝트를 4단계로 점진적으로 발전시킨다. 매 단계마다 이전 단계의 문제를 해결하는 방식으로 진행되기 때문에, 순서대로 따라가면 "왜 이렇게 만드는가"가 자연스럽게 이해된다.

전체 4단계 진화 흐름
1차 START
Thymeleaf
+ Session
서버 렌더링
세션 인증
기본 CRUD
port 8081
2차
React
+ JWT
프론트/백 분리
JWT 인증
JwtFilter
8082 / 3001
3차
Spring
Security
Security FilterChain
ROLE 권한 분리
AdminController
8083 / 3002
3차
심화
AOP
리팩토링
AOP 로깅
전역 예외처리
@Builder
코드 품질↑
✅ 3차 심화까지 완성 = 실무 기본기 완성
인증 · 권한 · 보안 · AOP · 예외처리 · 트랜잭션 · 빌더패턴까지 실제 서비스에서 쓰는 기술 전부 경험
이후 선택적으로 진행 가능 (Optional)
4차 — Docker + AWS 배포
Dockerfile · docker-compose · EC2 배포 · RDS 연결
실제 서비스를 인터넷에 올리는 전 과정
5차 — 기능 고도화
파일 업로드 · 댓글 · 검색(QueryDSL) · 알림
실무 서비스 수준의 부가 기능들
단계별 상세
각 단계에서 무엇을 배우고 무엇이 바뀌나

각 단계의 핵심 목적, 해결하는 문제, 새로 등장하는 기술을 한눈에 정리했다.

01
1차 프로젝트 · 핵심 기반
Thymeleaf + HttpSession — 기본 구조 이해
Spring Boot · Thymeleaf · Spring Security Crypto · JPA · MariaDB · port 8081
🎯 이 단계의 핵심 목적

Spring Boot 프로젝트의 전체 레이어 구조를 이해한다. Controller → Service → Repository → Entity 흐름이 어떻게 연결되는지, 서버가 HTML을 직접 만들어서 브라우저에 보내는 방식이 어떻게 동작하는지 직접 경험한다.

새로 배우는 핵심 기술
  • @Controller — 뷰 이름(String) 반환, Thymeleaf 렌더링
  • HttpSession — 로그인 상태를 서버 메모리에 보관
  • @ModelAttribute — HTML form 데이터를 DTO로 자동 바인딩
  • Thymeleaf — 서버 사이드 템플릿 (th:each, th:if, @{}, ${})
  • Page<Board> — JPA Pageable로 목록 페이징
  • BCryptPasswordEncoder — 비밀번호 단방향 암호화
  • @PrePersist — 저장 전 자동 실행되는 생명주기 메서드
  • 더티체킹 — UPDATE 없이 필드만 변경해도 자동 DB 반영
이 단계의 한계 (다음 단계로 가는 이유)
  • 모든 Controller 메서드마다 session.getAttribute("loginUser") 반복
  • 서버가 HTML 직접 생성 → 프론트/백 분리 불가
  • 세션은 서버 메모리 저장 → 서버 여러 대면 세션 공유 문제
  • 역할(ROLE) 기반 권한 관리 없음
주요 파일 구성
  • entity/ — User, Board
  • repository/ — UserRepository, BoardRepository
  • service/ — UserService, BoardService
  • controller/ — UserController, BoardController
  • dto/ — UserDto, BoardDto
  • config/ — AppConfig (BCrypt @Bean)
@Controller Thymeleaf HttpSession @ModelAttribute BCryptPasswordEncoder 더티체킹 Page<Board>
02
2차 프로젝트 · 프론트/백 분리
React + JWT — 인증 반복 제거, 프론트/백 분리
Spring Boot · React · JWT · Spring Security Crypto · JPA · MariaDB · backend 8082 / frontend 3001
🎯 이 단계의 핵심 목적

1차의 두 가지 문제를 동시에 해결한다. React로 화면을 분리해서 백엔드는 JSON만 반환하도록 바꾸고, JwtFilter 하나로 인증 반복 코드를 없앤다. 백엔드와 프론트엔드가 완전히 독립적으로 동작하는 구조를 경험한다.

새로 배우는 핵심 기술
  • @RestController — JSON(ResponseEntity) 반환
  • @RequestBody — JSON 요청을 DTO로 자동 변환
  • JWT — Header.Payload.Signature 구조, 서버 저장 없는 인증
  • JwtUtil — 토큰 생성/검증/파싱
  • JwtFilter (OncePerRequestFilter 상속) — 요청마다 토큰 검증
  • FilterRegistrationBean — 필터 수동 등록, URL 패턴 지정
  • @Value — application.properties 값 주입
  • Page<BoardDto> — Entity → DTO 변환 후 반환
  • React axios interceptor — 모든 요청에 토큰 자동 첨부
  • React PrivateRoute — 토큰 없으면 로그인 페이지로 강제 이동
  • jwtDecode — 프론트에서 토큰 Payload 읽기 (본인 글 여부 확인)
이 단계의 한계 (다음 단계로 가는 이유)
  • JwtFilter를 CorsConfig에 수동 등록 — 비표준 방식
  • Controller에서 request.getAttribute("loginUser") 직접 꺼내야 함
  • 역할(ROLE) 기반 권한 관리 여전히 없음
  • URL별 접근 제어 코드 없음
1차 대비 변경/추가 파일
  • config/ — AppConfig(유지), CorsConfig 신규
  • util/ — JwtUtil, JwtFilter 신규
  • service/ — UserService (반환타입 String으로 변경)
  • service/ — BoardService (toDto() 추가)
  • controller/ — @RestController로 교체, /api/** 경로
  • React — api.js, App.jsx(PrivateRoute), Login/Board 컴포넌트
@RestController JWT JwtFilter @RequestBody axios interceptor PrivateRoute Page<BoardDto> React
03
3차 프로젝트 · 보안 체계화
Spring Security — 표준 보안 프레임워크 도입
Spring Boot · React · JWT · Spring Security · JPA · MariaDB · backend 8083 / frontend 3002
🎯 이 단계의 핵심 목적

2차의 임시방편 JwtFilter를 Spring Security 표준 방식으로 교체한다. ROLE_USER / ROLE_ADMIN 역할 기반 권한 분리, AdminController 추가, SecurityConfig 하나로 인증/권한/CORS 통합 관리. Controller 코드가 훨씬 깔끔해진다.

새로 배우는 핵심 기술
  • spring-boot-starter-security — Security 전체 도입
  • SecurityConfig — FilterChain, CSRF/CORS/권한 통합 설정
  • UserDetails 인터페이스 — Spring Security 표준 인증 객체
  • CustomUserDetails — User Entity를 UserDetails로 감싸는 래퍼
  • CustomUserDetailsService — loadUserByUsername() 구현
  • JwtAuthenticationFilter — SecurityContextHolder에 인증 저장
  • SecurityContextHolder — 스레드 단위 인증 정보 저장소
  • @AuthenticationPrincipal — Controller에 인증 주체 자동 주입
  • hasRole("ADMIN") — URL별 역할 기반 접근 제어
  • SessionCreationPolicy.STATELESS — 세션 미사용 설정
  • addFilterBefore() — FilterChain에 커스텀 필터 삽입
  • User.role 필드 — ROLE_USER / ROLE_ADMIN
  • AdminController / AdminService — 유저/게시글 관리 기능
  • deleteByUser() — JPA 쿼리 메서드 자동 생성
이 단계의 한계 (심화로 가는 이유)
  • 모든 Controller에 try/catch 반복 — 에러 응답 형식이 제각각
  • Service 메서드에 로깅/실행시간 측정 코드가 없음
  • 조회 메서드에 @Transactional readOnly 최적화 없음
  • DTO 변환이 Setter 방식 — 코드가 장황하고 실수하기 쉬움
2차 대비 변경/추가 파일
  • security/ — 신규 폴더 (CustomUserDetails, CustomUserDetailsService, JwtAuthenticationFilter)
  • config/ — SecurityConfig 신규, CorsConfig 삭제
  • util/ — JwtFilter 삭제 (JwtAuthenticationFilter로 대체)
  • entity/ — User.java에 role 필드 추가
  • repository/ — BoardRepository에 deleteByUser() 추가
  • service/ — AdminService 신규
  • controller/ — BoardController @AuthenticationPrincipal 적용, AdminController 신규
  • React — AdminPage.jsx 신규, AdminRoute 추가
SecurityConfig CustomUserDetails @AuthenticationPrincipal hasRole SecurityContextHolder STATELESS AdminController
3차
심화
3차 심화 · 코드 품질 향상
AOP + 전역 예외처리 + @Transactional + @Builder
Spring Boot · Spring AOP · 기존 구성 유지 · 코드 리팩토링만 진행
🎯 이 단계의 핵심 목적

기능을 추가하는 게 아니라 기존 3차 코드를 실무 수준으로 리팩토링한다. 기존 코드 한 줄도 건드리지 않고 AOP로 자동 로깅을 추가하고, 흩어져 있던 예외 처리를 한 곳으로 모으고, DTO 생성 방식을 Builder 패턴으로 개선한다.

STEP별 학습 내용
  • STEP 1 — AOP 로깅
    spring-boot-starter-aop 추가. @Around로 모든 Service 메서드 실행 전후 자동 로그 + 실행시간 측정. 기존 코드 수정 없음.
  • STEP 2 — 컬렉션 최적화
    List, Set, Map 적재적소 활용. Stream API를 이용한 데이터 변환 패턴.
  • STEP 3 — 전역 예외처리
    CustomException 클래스 + @RestControllerAdvice GlobalExceptionHandler. 모든 Controller의 try/catch 제거. 에러 응답 형식 통일.
  • STEP 4 — @Transactional 최적화
    조회 메서드에 @Transactional(readOnly=true) 적용. 더티체킹 비활성화 → 성능 향상. 쓰기 메서드는 @Transactional.
  • STEP 5 — @Builder 패턴
    BoardDto, UserDto에 @Builder + @AllArgsConstructor 추가. toDto() 메서드의 Setter 방식 → Builder 방식으로 변경.
3차 대비 변경/추가 파일
  • build.gradle — spring-boot-starter-aop 추가
  • aspect/ — LogAspect.java 신규
    @Around("execution(* com.example.board.service.*.*(..))")
  • exception/ — CustomException.java 신규
    RuntimeException 상속, errorCode/message 필드
  • exception/ — GlobalExceptionHandler.java 신규
    @RestControllerAdvice, @ExceptionHandler
  • dto/ — BoardDto, UserDto에 @Builder 추가
  • service/ — BoardService.toDto() Builder 방식으로 변경
  • service/ — AdminService DTO 변환 Builder 방식으로 변경
  • service/ — 조회 메서드에 @Transactional(readOnly=true) 추가
  • controller/ — 모든 try/catch 제거 (GlobalExceptionHandler가 처리)
리팩토링 전후 비교
  • Controller try/catch 10개 이상 → 0개
  • Service 메서드마다 로그 코드 → LogAspect 1파일로 통합
  • dto.setXxx() 8줄 → Builder 체이닝 1~2줄
@Aspect @Around @RestControllerAdvice @ExceptionHandler @Transactional(readOnly=true) @Builder CustomException
04
4차 (선택) · 실제 배포
Docker + AWS — 로컬에서 인터넷 서비스로
Docker · docker-compose · AWS EC2 · RDS · Nginx · 선택 과정
학습 내용
  • Dockerfile 작성 — 앱을 컨테이너 이미지로 패키징
  • docker-compose — 백엔드 + DB를 한 번에 실행
  • AWS EC2 인스턴스 생성 및 배포
  • AWS RDS MariaDB 연결
  • Nginx 리버스 프록시 설정
  • 환경변수 관리 (.env 파일)
📌 선택 과정인 이유

3차 심화까지 완성하면 실무 백엔드 기본기는 완성된 상태다. Docker·AWS 배포는 인프라 영역으로, 취업 목표와 관심사에 따라 선택적으로 진행한다.

단계별 비교
인증 방식 진화 — 한 눈에 대조
항목 1차 2차 3차 3차 심화
화면 담당 Thymeleaf (서버 렌더링) React (클라이언트 렌더링) React (동일) React (동일)
인증 방식 HttpSession (서버 메모리) JWT 토큰 (localStorage) JWT + Security (동일) 동일
인증 필터 없음 (Controller마다 직접 체크) JwtFilter (수동 등록) JwtAuthenticationFilter (Security 통합) 동일
로그인 사용자 가져오기 session.getAttribute() 반복 request.getAttribute() 반복 @AuthenticationPrincipal 자동 주입 동일
권한 관리 없음 없음 ROLE_USER / ROLE_ADMIN 동일
예외 처리 Controller마다 try/catch Controller마다 try/catch Controller마다 try/catch GlobalExceptionHandler 통합
로깅 없음 없음 없음 AOP LogAspect 자동
DTO 변환 직접 Setter 직접 Setter 직접 Setter @Builder 패턴
컨트롤러 반환 String (뷰 이름) ResponseEntity (JSON) ResponseEntity (JSON) ResponseEntity (JSON)
데이터 수신 @ModelAttribute (form) @RequestBody (JSON) @RequestBody (JSON) @RequestBody (JSON)
관리자 기능 없음 없음 AdminController + AdminPage 동일
포트 구성 통합 8081 8082 / 3001 분리 8083 / 3002 분리 8083 / 3002 분리
학습 순서
이 파일들을 어떤 순서로 봐야 하나

이 HTML 학습 문서 시리즈의 권장 학습 순서다. 프로젝트 파일(04~05)은 기초 개념(01~03)을 먼저 이해한 후 보는 것을 권장하지만, 프로젝트가 먼저 궁금하다면 04부터 봐도 무방하다.

권장 학습 순서
PHASE 1 — Java/Spring 기초 개념 (01~03)
01a 어노테이션·접근제어 01b Lombok·Optional·Generic 01c Lambda·Stream 02a Controller·DTO 02b Session·Service·Repository 02c Entity·JPA 03a Ajax·async 03b CORS·axios
PHASE 2 — 프로젝트 코드 해설 (04)
04a 1차 Thymeleaf 04b 2차 React+JWT 04c 3차 Security
PHASE 3 — 3차 심화 (05)
05 심화 커리큘럼 전체 05a AOP 05b 컬렉션 05c 예외처리 05d @Transactional 05e @Builder
PHASE 4 — 심화 개념 (06~11)
06 Security 심화 07 실행흐름 08 DI 완전이해 09 JPA 심화 10 Bean·어노테이션 11 Docker
💡 이 문서 시리즈의 목표

처음부터 끝까지 한 가지 프로젝트(게시판)의 진화 흐름을 따라가며 Spring Boot 백엔드 개발의 핵심을 익힌다. 각 파일은 독립적으로 볼 수도 있지만, 순서대로 보면 "왜 이렇게 만드는가"가 자연스럽게 연결된다. 모든 내용은 실제 프로젝트 코드 기준으로 작성되었다.

📚 전체 맵 1차 프로젝트 시작