[SpringBoot] Auto Configuration

김선형·2025년 9월 10일

Java

목록 보기
21/27

개요

"Convention over Configuration (설정보다 관례)" 철학을 기반으로, 개발자의 특별한 설정이 없는 이상, 가장 보편적이고 표준적인 방식으로 어플리케이션 동작 방식을 구성한다.
어플리케이션의 메인 클래스에 붙는 @SpringBootApplication 안에 내장된 @EnableAutoConfiguration은 Spring Boot의 Classpath를 확인하고 필요한 설정들을 자동으로 수행한다.

✏️ Classpath?
어플리케이션이 실행될 때 JVM이 클래스와 리소스를 찾는 경로로, Java 어플리케이션 실행시 -cp 혹은 -classpath 옵션으로 지정할 수 있다.

Spring Boot Starter

Spring Boot의 Starter (스타터)는 특정 기능 개발에 필요한 의존성 모음이다. 개발자가 스타터를 추가하면, Spring Boot의 Auto Configuration 기능을 통해 필요한 빈을 자동으로 등록하고 설정한다.

Starter 의존성설명자동 설정 기능 예시
spring-boot-starter-web웹 어플리케이션 개발에 필요한
핵심 컴포넌트 자동 등록
내장 톰캣 (Embedded Tomcat)
DispatcherServlet
WebMvcConfigurer
기본 에러 페이지 핸들링
spring-boot-starter-data-jpaJPA/Hibernate 기반 DB 연동을 위한
설정 자동 구성
DataSource
EntityManagerFactory
JpaRepository 구현체
트랜잭션 관리 (TransactionManager)
spring-boot-starter-security보안, 인증/인가를 위한 필수 컴포넌트 자동 구성Spring Security Filter Chain
기본 로그인 폼
PasswordEncoder
UserDetailsService
spring-boot-starter-thymeleafThymeleaf 템플릿 엔진 연동 자동 설정ThymeleafViewResolver
TemplateEngine
템플릿 캐싱 설정
spring-boot-starter-validationBean Validation 자동 적용Validator
MethodValidationPostProcessor
spring-boot-starter-actuator운영/모니터링 관련 기능을 손쉽게 추가/actuator 엔드포인트 자동 등록
헬스 체크, 모니터링, 메트릭스 제공

✏️ Spring Boot Actuator
Spring Boot 어플리케이션의 상태 확인, 시스템 모니터링, 관리, 운영 자동화 등을 위한 운영용 endpoint (REST API)를 자동으로 제공하는 모듈

기능 구분설명엔드 포인트
헬스 체크시스템, DB 등 주요 컴포넌트 상태 확인/actuator/health
어플리케이션 정보버전, 이름 등 info 정보/actuator/info
메트릭JVM, CPU, 메모리, 트래픽, GC, 요청 수, response time 등/actuator/metrics
환경변수환경, 프로퍼티, 시스템 변수/actuator/env
빈 정보스프링 빈 목록, 상태, 의존관계/actuator/beans
스레드 덤프스레드 상태/스택 추적/actuator/threaddump
로그 레벨 동적 변경런타임에 로그 레벨 변경/actuator/loggers
캐시 정보Spring Cache 정보/actuator/caches
HTTP 트레이스최근 HTTP 요청/응답 추적/actuator/httpexchanges
MappingsRequestMapping 정보/actuator/mappings

어플리케이션 설정 정보 관리

resources 디렉토리의 application.properties/application.yml 파일은 Spring Boot에서 어플리케이션의 설정 정보를 관리하는 표준 방식이다. application.properties/application.yml 파일의 역할은 아래와 같다.

  • 환경 설정 관리: 데이터베이스 접속 정보, 서버 포트, 로깅 레벨, 외부 API 키, 커스텀 프로퍼티 등 어플리케이션 동작에 필요한 다양한 설정을 정의한다.
  • 프로젝트의 런타임 환결별 설정 관리: 개발, 테스트, 운영 환경에 따라 각기 다른 설정값을 분리하고 관리한다.
# application.properties

server.port=8081

spring.datasource.url=jdbc:mysql://localhost:3306/stockdb
spring.datasource.username=stockuser
spring.datasource.password=stockpw

logging.level.org.springframework=INFO

# 사용자 정의 값
stock.api.base-url=https://api.stock.com
stock.api.timeout=1000
stock.caching.enabled=true
# application.yml

server:
  port: 8081

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/stockdb
    username: stockuser
    password: stockpw

logging:
  level:
    org.springframework: INFO
    
stock:
  api:
    base-url: https://api.stock.com
    timeout: 1000
  caching:
    enabled: true

✏️ application.propertiesapplication.yml이 동시에 존재할 때, Spring Boot는 두 파일을 모두 읽고 동일한 키가 있으면 application.propertiesapplication.yml보다 우선 적용된다. 유지보수, 혼란 방지를 위해 한 가지 포맷만 사용하는 것이 안전하다. (application.yml 사용 권장)

설정 정보 사용

@Value

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class StockApiClient {
    @Value("${stock.api.base-url}")
    private String baseUrl;

    public void connect() {
        System.out.println("API URL: " + baseUrl);
    }
}

장단점

  • 장점: 간단하게 한두 개 값을 읽을 때 적합하다.
  • 단점: 값이 많아지면 관리가 어렵고, 계층구조 표현이 불편하다.

@ConfigurationProperties

계층적 구조의 설정을 객체로 묶어 사용할 때 활용한다.

@Data
@Component
@ConfigurationProperties(prefix = "stock.api")
public class StockApiProperties {
    private String baseUrl;
    private int timeout;
}
// baseUrl, timeout에 stock.api.base, stock.api.timeout을 자동으로 매핑
// 중첩 구조 사용

@Data
@Component
@ConfigurationProperties(prefix = "stock")
public class StockProperties {
    private Api api;
    private Caching caching;

    @Data
    public static class Api {
        private String baseUrl;
        private int timeout;
    }

    @Data
    public static class Caching {
        private boolean enabled;
    }
}

✏️ 런타임 환경 (개발, 운영, 테스트, etc.)에 따라 -dev, -prod, -test와 같이 설정 파일명을 구분하여 관리하며, 아래와 같이 환경을 지정하여 실행할 수 있다.

# JVM 옵션
java -Dspring.profiles.active=dev -jar app.jar

# Spring Boot 옵션
java -jar app.jar --spring.profiles.active=dev
profile
선형의 비선형적 기록 🐜

0개의 댓글