Spring Boot 완전 학습 인덱스


1. 개요 & 배경

Spring Boot란?

  • Spring Framework와의 관계
  • “Convention over Configuration” 철학
  • Spring Boot가 해결한 문제들 (XML 설정, 의존성 충돌, 내장 서버)
  • Spring Boot vs Spring Framework 직접 사용 비교
  • Spring Boot 3.x 주요 변화 (Java 17 베이스라인, Jakarta EE 10)

핵심 특징

  • Auto Configuration — 자동 구성 메커니즘
  • Starter 의존성 — 의존성 묶음 관리
  • 내장 서버 (Tomcat, Jetty, Undertow)
  • Production-ready 기능 (Actuator)
  • Spring Initializr

2. 시작하기

프로젝트 생성

  • Spring Initializr (start.spring.io)
  • IntelliJ IDEA / VS Code 플러그인
  • Spring Boot CLI
  • Maven Wrapper (mvnw) / Gradle Wrapper (gradlew)

프로젝트 구조

  • 표준 디렉터리 레이아웃
  • @SpringBootApplication 위치와 컴포넌트 스캔 범위
  • resources/ 디렉터리 구조 (static, templates, application.yml)
  • src/test/ 구조

첫 애플리케이션 실행

  • SpringApplication.run()의 동작 원리
  • 내장 Tomcat 기동 흐름
  • 배너 커스터마이징 (banner.txt)
  • 종료 코드 (ExitCodeGenerator)

3. 자동 구성 (Auto Configuration)

동작 원리

  • @EnableAutoConfiguration / @SpringBootApplication
  • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  • @Conditional 어노테이션 계열
    • @ConditionalOnClass / @ConditionalOnMissingClass
    • @ConditionalOnBean / @ConditionalOnMissingBean
    • @ConditionalOnProperty
    • @ConditionalOnWebApplication
    • @ConditionalOnResource
    • @ConditionalOnExpression

자동 구성 디버깅

  • --debug 플래그 / logging.level. 설정
  • Conditions Evaluation Report 읽기
  • /actuator/conditions 엔드포인트
  • 자동 구성 제외 (exclude 속성)

커스텀 Auto Configuration 작성

  • @AutoConfiguration 어노테이션
  • AutoConfiguration.imports 등록
  • @AutoConfigureBefore / @AutoConfigureAfter / @AutoConfigureOrder
  • 스타터 라이브러리 제작 패턴

4. 설정 관리 (Configuration)

application.properties / application.yml

  • 두 형식 비교 및 혼용
  • YAML 다중 문서 (--- 구분자)
  • 계층 구조 바인딩

설정 우선순위 (Property Sources)

  • 17가지 설정 소스와 우선순위 순서
  • 커맨드라인 인수 (--key=value)
  • 환경 변수 바인딩 (대소문자·점·언더스코어 변환 규칙)
  • JVM 시스템 프로퍼티 (-Dkey=value)
  • @PropertySource 커스텀 소스 등록

프로파일 (Profiles)

  • spring.profiles.active 설정
  • application-{profile}.yml 파일 분리
  • @Profile 어노테이션
  • 프로파일 그룹 (spring.profiles.group)
  • 프로파일 중첩 활성화

@ConfigurationProperties

  • 타입 안전 설정 바인딩
  • @EnableConfigurationProperties
  • Record 기반 @ConfigurationProperties (Spring Boot 2.6+)
  • 검증 (@Validated, JSR-303)
  • 메타데이터 생성 (spring-boot-configuration-processor)
  • Relaxed Binding 규칙

@Value

  • SpEL 표현식 사용
  • 기본값 지정
  • @Value vs @ConfigurationProperties 선택 기준

설정 암호화

  • Jasypt 통합
  • Spring Cloud Config 암호화
  • Kubernetes Secret 연동 패턴

5. 의존성 주입 & Bean 관리

Spring IoC 컨테이너 복습

  • ApplicationContext 계층 (WebApplicationContext 포함)
  • Bean 생명주기 (인스턴스화 → 의존성 주입 → 초기화 → 소멸)
  • BeanPostProcessor / BeanFactoryPostProcessor

Bean 등록 방식

  • @Component, @Service, @Repository, @Controller
  • @Bean 메서드 (in @Configuration)
  • @Import / @ImportResource
  • @ComponentScan 범위 설정

의존성 주입 방식

  • 생성자 주입 (권장) — @RequiredArgsConstructor
  • 세터 주입
  • 필드 주입 (@Autowired) — 단점과 테스트 어려움
  • @Qualifier / @Primary
  • @Lazy 지연 초기화

Bean 스코프

  • singleton (기본)
  • prototype
  • request / session / application (웹 스코프)
  • @Scope("prototype") + proxyMode

초기화 & 소멸 콜백

  • @PostConstruct / @PreDestroy
  • InitializingBean / DisposableBean
  • @Bean(initMethod, destroyMethod)
  • SmartLifecycle — 순서 있는 시작/종료

6. 웹 MVC

DispatcherServlet 처리 흐름

  • HandlerMappingHandlerAdapterViewResolver
  • HandlerInterceptor — preHandle / postHandle / afterCompletion
  • Filter vs HandlerInterceptor 차이

컨트롤러

  • @RestController / @Controller
  • @RequestMapping / @GetMapping / @PostMapping
  • @PathVariable / @RequestParam / @RequestHeader / @CookieValue
  • @RequestBody / @ResponseBody
  • @ModelAttribute
  • @ResponseStatus

요청 데이터 바인딩 & 검증

  • @Valid / @Validated
  • BindingResult
  • @ExceptionHandler — 컨트롤러 레벨
  • @ControllerAdvice / @RestControllerAdvice — 전역 예외 처리
  • ProblemDetail (RFC 7807, Spring 6+)

응답 처리

  • ResponseEntity<T>
  • HttpMessageConverter — 직렬화/역직렬화
  • Jackson 통합 (ObjectMapper 커스터마이징)
  • Content Negotiation

파일 업로드 & 다운로드

  • MultipartFile 처리
  • spring.servlet.multipart.* 설정
  • 스트리밍 다운로드 (StreamingResponseBody)
  • 대용량 파일 처리 주의사항

정적 리소스 & 뷰 템플릿

  • 정적 리소스 경로 (/static, /public, /resources)
  • Thymeleaf 통합
  • 리소스 버전 관리 (Cache Busting)

Async 요청 처리

  • DeferredResult<T>
  • Callable<T>
  • @Async + 웹 레이어 조합 주의

7. WebFlux (리액티브 웹)

WebFlux vs Spring MVC

  • 이벤트 루프 모델 vs 스레드-퍼-요청 모델
  • 언제 WebFlux를 선택하는가
  • 블로킹 코드 금지 원칙

핵심 타입

  • Mono<T> — 0 또는 1개 결과
  • Flux<T> — 0개 이상의 스트림
  • Publisher, Subscriber, Subscription
  • StepVerifier — 테스트

어노테이션 기반 컨트롤러

  • @RestController 동일 사용 (WebFlux 컨텍스트)
  • 리액티브 타입 반환
  • ServerWebExchange

함수형 라우터 (Router Functions)

  • RouterFunction<ServerResponse>
  • HandlerFunction<ServerResponse>
  • RouterFunctions.route()
  • RequestPredicates

WebClient

  • WebClient.Builder 구성
  • 요청 / 응답 처리
  • 에러 처리 (onStatus, onErrorResume)
  • 필터 (ExchangeFilterFunction) — 로깅, 인증 헤더 주입
  • 커넥션 풀 & 타임아웃 설정
  • WebClient vs RestTemplate vs RestClient 비교

RestClient (Spring 6.1+)

  • 동기 HTTP 클라이언트 신규 API
  • RestClient.Builder 구성
  • RestTemplate 마이그레이션

8. 데이터 액세스

Spring Data 공통 개념

  • Repository 계층 (CrudRepository, JpaRepository, PagingAndSortingRepository)
  • 쿼리 메서드 네이밍 규칙
  • @Query — JPQL / Native Query
  • Auditing (@CreatedDate, @LastModifiedDate, @EnableJpaAuditing)
  • Page<T> / Slice<T> 페이징

Spring Data JPA

  • @Entity, @Table, @Column, @Id, @GeneratedValue
  • 연관관계 매핑 (@OneToMany, @ManyToOne, @ManyToMany)
  • Fetch 전략 (EAGER / LAZY) — N+1 문제와 해결
  • JPQL / Criteria API / QueryDSL
  • 영속성 컨텍스트와 트랜잭션 경계
  • @EntityGraph — 패치 조인 제어
  • Projections (Interface / DTO / Open Projection)
  • @Lock — 비관적/낙관적 잠금

데이터소스 설정

  • HikariCP 커넥션 풀 (spring.datasource.hikari.*)
  • 다중 데이터소스 설정
  • Read/Write 분리 (AbstractRoutingDataSource)

트랜잭션 관리

  • @Transactional — 전파(Propagation), 격리(Isolation), readOnly
  • 선언적 트랜잭션 vs 프로그래밍 방식 (TransactionTemplate)
  • 트랜잭션 이벤트 (@TransactionalEventListener)
  • 자기 호출(Self-invocation) 문제

DB 마이그레이션

  • Flyway 통합 (spring.flyway.*)
  • Liquibase 통합
  • 마이그레이션 전략 (버전 관리, 롤백)

Spring Data Redis

  • RedisTemplate / StringRedisTemplate
  • @Cacheable 통합
  • Pub/Sub (RedisMessageListenerContainer)
  • Reactive Redis (ReactiveRedisTemplate)

Spring Data MongoDB

  • MongoTemplate / ReactiveMongoTemplate
  • @Document, @Field
  • Aggregation Pipeline

9. 캐싱

Spring Cache 추상화

  • @EnableCaching
  • @Cacheable / @CachePut / @CacheEvict / @Caching
  • CacheManager 구현체 선택 (ConcurrentMap, Caffeine, Redis, EhCache)
  • 캐시 키 생성 (KeyGenerator, SpEL)
  • 조건부 캐싱 (condition, unless)

Caffeine 캐시

  • 로컬 인메모리 캐시 (LRU / LFU / W-TinyLFU)
  • TTL / 최대 크기 설정
  • 캐시 통계

Redis 캐시

  • RedisCacheManager 설정
  • TTL 정책
  • 직렬화 설정 (JSON vs 기본 Java 직렬화)
  • 캐시 키 네임스페이스

10. 보안 (Spring Security)

Spring Security 아키텍처

  • SecurityFilterChain (서블릿 필터 체인)
  • DelegatingFilterProxy — Spring 컨테이너 연결
  • AuthenticationManager / AuthenticationProvider
  • UserDetailsService / UserDetails
  • SecurityContext / SecurityContextHolder

인증 (Authentication)

  • Form 로그인
  • HTTP Basic / Digest
  • JWT 인증 필터 구현
  • OAuth2 로그인 (spring-security-oauth2-client)
  • LDAP 인증

인가 (Authorization)

  • URL 기반 접근 제어 (requestMatchers)
  • 메서드 보안 (@PreAuthorize, @PostAuthorize, @Secured, @RolesAllowed)
  • @EnableMethodSecurity
  • SpEL 표현식 (hasRole, hasAuthority, authentication, principal)
  • 계층 권한 (RoleHierarchy)

JWT

  • Access Token / Refresh Token 전략
  • JwtDecoder (자체 발급 vs JWKS URI)
  • 커스텀 Claim 처리
  • 토큰 갱신 흐름

OAuth2 Resource Server

  • spring-security-oauth2-resource-server
  • JWT / Opaque Token 검증
  • JwtAuthenticationConverter — 클레임 → 권한 변환

CSRF / CORS / 세션

  • CSRF 보호 활성화/비활성화 시나리오
  • CORS 설정 (CorsConfigurationSource)
  • 세션 관리 (SessionCreationPolicy.STATELESS)

비밀번호 인코딩

  • PasswordEncoder 구현체 (BCryptPasswordEncoder)
  • DelegatingPasswordEncoder — 알고리즘 마이그레이션

11. 이벤트 & 비동기

Spring Application Events

  • ApplicationEvent / @EventListener
  • 빌트인 이벤트 (ApplicationStartedEvent, ApplicationReadyEvent 등)
  • ApplicationEventPublisher
  • 비동기 이벤트 (@Async + @EventListener)
  • @TransactionalEventListener

@Async

  • @EnableAsync 설정
  • ThreadPoolTaskExecutor 구성
  • Future<T> / CompletableFuture<T> 반환
  • 예외 처리 (AsyncUncaughtExceptionHandler)
  • 자기 호출(Self-invocation) 문제

스케줄링

  • @EnableScheduling
  • @Scheduled — fixedRate / fixedDelay / cron
  • TaskScheduler / ScheduledTaskRegistrar
  • 동적 스케줄 등록/해제

12. 메시징

Spring AMQP (RabbitMQ)

  • RabbitTemplate — 메시지 발행
  • @RabbitListener — 메시지 소비
  • Exchange / Queue / Binding 선언
  • 메시지 직렬화 (Jackson2JsonMessageConverter)
  • 재처리(Retry) / DLQ(Dead Letter Queue) 패턴

Spring Kafka

  • KafkaTemplate — 메시지 발행
  • @KafkaListener — 메시지 소비
  • Consumer Group / Partition / Offset
  • 트랜잭션 메시징
  • 에러 처리 (SeekToCurrentErrorHandler, DeadLetterPublishingRecoverer)

Spring JMS

  • JmsTemplate
  • @JmsListener
  • ActiveMQ / ActiveMQ Artemis 연동

13. 테스트

Spring Boot Test 개요

  • @SpringBootTest — 전체 애플리케이션 컨텍스트 로드
  • webEnvironment 옵션 (MOCK, RANDOM_PORT, DEFINED_PORT, NONE)
  • 컨텍스트 캐싱 원리와 성능 영향

슬라이스 테스트 (Slice Tests)

  • @WebMvcTest — 컨트롤러 레이어 단독
  • @DataJpaTest — JPA 레이어 단독 (H2 인메모리)
  • @JsonTest — JSON 직렬화/역직렬화
  • @RestClientTest — 클라이언트 테스트
  • @WebFluxTest — WebFlux 컨트롤러 단독
  • @DataRedisTest / @DataMongoTest

Mocking

  • @MockBean / @SpyBean — Spring 컨텍스트 내 교체
  • Mockito @Mock / @InjectMocks — 순수 단위 테스트
  • MockMvc — 서블릿 없이 MVC 테스트
  • WebTestClient — WebFlux / RestTemplate 대체

테스트 설정

  • @TestConfiguration
  • @ActiveProfiles("test")
  • @TestPropertySource
  • @DynamicPropertySource — Testcontainers 연동
  • ApplicationContextInitializer

Testcontainers

  • @Testcontainers + @Container
  • Spring Boot 3.1+ 서비스 연결 (@ServiceConnection)
  • MySQL, PostgreSQL, Redis, Kafka 컨테이너
  • 재사용 모드 (reuse = true)

테스트 모범 사례

  • Given-When-Then 구조
  • 테스트 격리와 @Transactional 롤백
  • 컨텍스트 재사용으로 속도 최적화
  • BDDMockito 스타일

14. Actuator & 관찰성

Actuator 엔드포인트

  • /actuator/health — 헬스 체크 (상세 정보, 커스텀 HealthIndicator)
  • /actuator/info — 애플리케이션 정보 (build-info.properties, git 정보)
  • /actuator/metrics — Micrometer 메트릭
  • /actuator/env — 현재 환경 변수
  • /actuator/beans — 등록된 Bean 목록
  • /actuator/mappings — URL 매핑 정보
  • /actuator/loggers — 런타임 로그 레벨 변경
  • /actuator/threaddump / /actuator/heapdump
  • /actuator/httpexchanges — 최근 HTTP 요청 이력

보안 & 노출 설정

  • management.endpoints.web.exposure.include
  • management.server.port — 관리 포트 분리
  • Spring Security로 Actuator 보호

커스텀 엔드포인트

  • @Endpoint / @WebEndpoint / @JmxEndpoint
  • @ReadOperation / @WriteOperation / @DeleteOperation

Micrometer

  • 메트릭 타입 (Counter, Gauge, Timer, DistributionSummary)
  • 태그(Tag) 전략
  • MeterRegistry 사용
  • 커스텀 메트릭 등록
  • Prometheus / Grafana 연동 (micrometer-registry-prometheus)

분산 추적 (Micrometer Tracing)

  • Spring Boot 3.x Observability API
  • Brave / OpenTelemetry 브릿지
  • Zipkin / Jaeger 연동
  • Trace / Span 전파
  • @Observed 어노테이션

로깅

  • Logback 자동 구성 (logback-spring.xml)
  • Log4j2 전환
  • 로그 레벨 설정 (logging.level.*)
  • JSON 로그 포맷 (Logstash Encoder)
  • MDC를 통한 요청 컨텍스트 추가
  • 로그 파일 롤링 (logging.logback.rollingpolicy.*)

15. 운영 & 배포

빌드 & 패키징

  • Executable JAR (Fat JAR) 구조 이해
  • spring-boot-maven-plugin / spring-boot-gradle-plugin
  • 레이어드 JAR (Layered JAR) — Docker 이미지 최적화
  • 전통적 WAR 배포 (SpringBootServletInitializer)
  • Native Image (GraalVM) — AOT 컴파일

Docker & 컨테이너

  • Dockerfile 작성 (멀티 스테이지 빌드)
  • Cloud Native Buildpacks (./mvnw spring-boot:build-image)
  • Jib (Google) — Gradle/Maven 플러그인
  • 환경 변수로 설정 주입

Kubernetes 배포

  • Deployment / Service / ConfigMap / Secret 설정
  • Liveness / Readiness / Startup Probe (/actuator/health/liveness)
  • 그레이스풀 셧다운 (server.shutdown=graceful)
  • Spring Boot + Kubernetes 서비스 디스커버리

성능 튜닝

  • JVM 옵션 (-Xms, -Xmx, -XX:+UseG1GC 등)
  • 가상 스레드 (Virtual Threads, Java 21+, Spring Boot 3.2+)
  • 시작 시간 최적화 (Lazy Bean 초기화, AOT)
  • spring.main.lazy-initialization=true

그레이스풀 셧다운

  • server.shutdown=graceful 설정
  • spring.lifecycle.timeout-per-shutdown-phase
  • 진행 중 요청 완료 대기 동작 원리

16. Spring Boot + Spring Cloud

Spring Cloud Config

  • 중앙화된 설정 서버
  • Git 백엔드 설정
  • 클라이언트 bootstrap.yml vs spring.config.import
  • 설정 갱신 (@RefreshScope, /actuator/refresh)

Spring Cloud Discovery

  • Eureka Server / Client 설정
  • 서비스 등록 & 발견
  • 헬스 체크 통합

OpenFeign

  • @FeignClient 선언적 HTTP 클라이언트
  • @FeignClient(fallback) — Circuit Breaker 연동
  • 인터셉터 / 에러 디코더 커스터마이징
  • 로깅 레벨 설정

Spring Cloud Circuit Breaker

  • Resilience4j 통합
  • @CircuitBreaker, @Retry, @Bulkhead, @RateLimiter
  • CircuitBreakerFactory

17. 버전별 주요 변경사항

Spring Boot 2.x → 3.x 마이그레이션

  • Java 17 최소 요구사항
  • javax.*jakarta.* 패키지 변경
  • Spring Security 6.x API 변경
  • Actuator 변경사항
  • Hibernate 6.x 변경사항

Spring Boot 3.x 주요 기능

  • 3.0 — Jakarta EE 10, GraalVM Native Image GA
  • 3.1 — Testcontainers 서비스 연결, Docker Compose 통합
  • 3.2 — Virtual Threads GA, RestClient, @Observed 개선, Micrometer Tracing
  • 3.3 — CDS(Class Data Sharing) 지원, 로그 구조화 개선
  • Deprecated API 및 제거 목록

17 items under this folder.