본문 바로가기

교재 목차

회원가입·게시판을 완성하며 객체지향 설계, Spring MVC, 데이터 접근, 트랜잭션, AOP와 운영 관측을 익힙니다.

Spring을 처음 배우면 애노테이션을 외우는 데 집중하기 쉽습니다. 하지만 Spring의 핵심은 객체를 어떻게 만들고 연결하는지, 요청과 트랜잭션이 어디서 시작하고 끝나는지를 판단하는 데 있습니다. 이 교재는 회원가입과 게시판이라는 하나의 사례를 끝까지 키워 가며, 순수 자바 도메인에서 시작해 컨테이너, HTTP, MVC, 데이터베이스, 운영 관측을 차례로 연결합니다. 기능이 동작하는 코드만 보지 않고, 잘못된 매핑과 바인딩, 트랜잭션과 프록시가 어긋나는 경우도 함께 재현합니다.

자바의 변수, 메서드, 클래스, 생성자를 읽을 수 있으면 첫 예제를 시작할 수 있습니다. 객체의 역할과 구현, 예외, 컬렉션이 낯설다면 Java 교재의 해당 장으로 돌아가 필요한 부분을 복습하세요.

이 교재는 Java 25, Spring Boot 4.1.2와 그 BOM이 정하는 Spring Framework 7.0.10, Gradle 9.8.2를 기준으로 합니다. 본문에 실은 실행 결과와 오류 메시지는 Spring, Spring Boot, Gradle, 자바의 공식 문서와 API 설명에 적힌 동작을 따라 손으로 계산한 예상값이며, 실제로 실행해 옮긴 출력은 아닙니다. 경과 시간, 스레드 이름, 임의로 선택된 포트처럼 실행할 때마다 달라지는 값은 본문에서 따로 밝혀 둡니다. 예제를 볼 때는 먼저 결과를 예상한 뒤 본문과 비교하고, 직접 실행해 다르게 나오면 어느 단계에서 갈라졌는지 따라가 보세요.

처음에는 Java 25와 Spring Boot를 따라 프로젝트를 만들고 시작 로그를 확인합니다. 첫 페이지는 다음 글에서 static/index.html을 추가한 뒤 GET /의 HTML 응답과 200 상태로 확인하며, 같은 글의 JSON 예제로 넘어가기 전에 1-1의 RuntimeVersions.java도 작성해 둡니다.


학습 경로

1단계 · 객체와 컨테이너(1–3장)에서는 회원가입과 게시판의 역할을 나누고, 객체지향 설계 원칙을 거쳐 Spring 컨테이너가 객체를 조립하는 이유를 익힙니다. 빈의 등록과 주입, 생명 주기와 스코프를 다루며 컨테이너가 무엇을 대신해 주는지 확인합니다.

2단계 · 웹 요청(4–6장)에서는 HTTP의 메서드와 상태 코드, 헤더에서 시작해 서블릿과 MVC 패턴을 직접 만들어 보고, Spring MVC의 요청 매핑, 파라미터 바인딩, 응답 변환으로 같은 흐름을 다시 연결합니다.

3단계 · 화면과 웹 상태(7–8장)에서는 Thymeleaf 템플릿과 폼, 메시지, 검증으로 입력을 다루고, 쿠키와 세션, 필터와 인터셉터, 예외 처리로 여러 요청에 걸친 상태와 실패를 정리합니다.

4단계 · 데이터와 트랜잭션(9–11장)에서는 JDBC와 커넥션 풀, 트랜잭션에서 시작해 JdbcTemplate, MyBatis, JPA, Spring Data, Querydsl로 게시글의 명령 포트와 조회 포트를 구현하고 공통 테스트로 검증합니다. 이어서 검사 예외의 전파와 데이터 접근 예외, @Transactional 프록시와 롤백 규칙, 전파 속성을 더 깊이 다룹니다.

5단계 · 공통 관심과 운영(12–15장)에서는 동시 요청과 ThreadLocal, 템플릿 메서드와 전략, 프록시와 빈 후처리기를 거쳐 Spring AOP의 애스펙트와 포인트컷을 익힙니다. 마지막으로 Spring Boot의 자동 구성과 외부 설정, Actuator와 Micrometer, Prometheus와 Grafana로 애플리케이션을 운영 환경에서 들여다보는 방법까지 이어집니다.

예제를 넣을 프로젝트 고르기

같은 회원가입·게시판을 다루더라도 파일을 넣을 프로젝트는 글마다 다를 수 있습니다. 새 글로 넘어갈 때는 그 글의 빌드 설정과 패키지 준비를 먼저 읽으세요. 다음 표는 각 구간에서 따를 준비 문서의 위치입니다.

학습 구간준비를 따를 단위와 재사용 범위
객체와 컨테이너의 시작1-1의 board는 Java 25와 Boot 4.1.2 플러그인, 의존성 버전 묶음(BOM)을 기준으로 Initializr가 만든 Gradle Wrapper를 씁니다. 회원 기능은 이 누적 예제에 추가하지만, 메모리 저장이 인증이나 회원 존재, 외래 키를 보장하지는 않습니다.
HTTP 기본 원리4장의 예제는 Java 17과 Spring Framework 6.2.11로 확인한 별도 테스트 단위이며, 4-1의 build.gradle에 장 전체의 의존성을 한 번에 적어 두고 글마다 파일을 더해 갑니다. 누적 프로젝트의 Boot BOM에 이 의존성을 섞지 말고 해당 본문의 준비를 따릅니다.
MVC 요청·응답의 선택 예제6-6~8의 준비는 mvc-boundary-contracts 테스트 프로젝트를 씁니다. Java 25, Gradle 9.8.2, Boot 4.1.2 BOM 아래에서 글마다 테스트 애플리케이션 구성으로 컨텍스트를 지정하며, main 메서드가 있는 시작 클래스는 6-7의 CrudTestApplication 하나뿐입니다.
화면과 웹 상태7장의 thymeleaf-view-contracts와 8장의 servlet-request-contracts는 각각 별도의 프로젝트입니다. 각 본문의 패키지, 템플릿, 시작 클래스 준비를 따르고, 클래스 이름이 같다고 누적 프로젝트에 덮어 넣지 않습니다.
JDBC와 트랜잭션9장의 jdbc-transaction-contracts는 Java 25, Boot 4.1.2 BOM과 JDBC, 테스트용 H2를 씁니다. H2에서 확인하는 범위와 운영 DB의 드라이버·복구 범위는 구분합니다.
AOP와 Boot의 작은 선택 예제로깅·재시도 AOP는 순수 모델 뒤에 작은 컨텍스트를 연결하며, 실제 트랜잭션·기한·대기 정책은 구현하지 않습니다. 조건부 자동 구성의 여덟 조합과 타입 안전 외부 설정의 바인딩은 누적 BOM을 바탕으로 작은 컨텍스트를 만드는 ApplicationContextRunner 테스트입니다. 후보를 직접 지정한 테스트가 배포 JAR에서의 자동 구성 발견까지 확인하지는 않습니다.

앞에서 익힌 개념과 모델은 뒤의 예제를 이해하는 데 다시 씁니다. 다만 파일을 옮길 때는 각 글이 지정한 프로젝트 단위와 버전, 등록 범위를 따로 확인하세요.

다른 교재로 이어가기

이 교재가 바탕으로 삼는 자바 문법과 객체지향, 동시성은 Java에서, 4장의 HTTP와 그 아래의 TCP는 네트워크에서 더 자세히 다룹니다. 9장부터 쓰는 SQL과 인덱스, 트랜잭션 격리 수준은 데이터베이스에서, 2장의 설계 원칙과 테스트 전략은 소프트웨어공학에서 이어집니다. 같은 서버 애플리케이션을 TypeScript 프레임워크로 만들어 보고 싶다면 NestJS를 참고하세요.


장별 목차

예제를 따라간 뒤에는 요청이 어느 객체를 지나는지, 트랜잭션과 예외가 어디서 시작하고 끝나는지를 말로 설명해 보세요. 이 교재를 마쳤는지는 애노테이션을 몇 개 아는지가 아니라, 회원가입이나 게시글 요청 한 건을 컨테이너부터 데이터베이스까지 따라갈 수 있는지로 판단합니다.