"Convention over Configuration (설정보다 관례)" 철학을 기반으로, 개발자의 특별한 설정이 없는 이상, 가장 보편적이고 표준적인 방식으로 어플리케이션 동작 방식을 구성한다.
어플리케이션의 메인 클래스에 붙는 @SpringBootApplication 안에 내장된 @EnableAutoConfiguration은 Spring Boot의 Classpath를 확인하고 필요한 설정들을 자동으로 수행한다.
✏️ Classpath?
어플리케이션이 실행될 때 JVM이 클래스와 리소스를 찾는 경로로, Java 어플리케이션 실행시-cp혹은-classpath옵션으로 지정할 수 있다.
Spring Boot의 Starter (스타터)는 특정 기능 개발에 필요한 의존성 모음이다. 개발자가 스타터를 추가하면, Spring Boot의 Auto Configuration 기능을 통해 필요한 빈을 자동으로 등록하고 설정한다.
| Starter 의존성 | 설명 | 자동 설정 기능 예시 |
|---|---|---|
| spring-boot-starter-web | 웹 어플리케이션 개발에 필요한 핵심 컴포넌트 자동 등록 | 내장 톰캣 (Embedded Tomcat) DispatcherServlet WebMvcConfigurer 기본 에러 페이지 핸들링 |
| spring-boot-starter-data-jpa | JPA/Hibernate 기반 DB 연동을 위한 설정 자동 구성 | DataSource EntityManagerFactory JpaRepository 구현체 트랜잭션 관리 (TransactionManager) |
| spring-boot-starter-security | 보안, 인증/인가를 위한 필수 컴포넌트 자동 구성 | Spring Security Filter Chain 기본 로그인 폼 PasswordEncoder UserDetailsService |
| spring-boot-starter-thymeleaf | Thymeleaf 템플릿 엔진 연동 자동 설정 | ThymeleafViewResolver TemplateEngine 템플릿 캐싱 설정 |
| spring-boot-starter-validation | Bean 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/cachesHTTP 트레이스 최근 HTTP 요청/응답 추적 /actuator/httpexchangesMappings RequestMapping 정보 /actuator/mappings
resources 디렉토리의 application.properties/application.yml 파일은 Spring Boot에서 어플리케이션의 설정 정보를 관리하는 표준 방식이다. application.properties/application.yml 파일의 역할은 아래와 같다.
# 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.properties와application.yml이 동시에 존재할 때, Spring Boot는 두 파일을 모두 읽고 동일한 키가 있으면application.properties가application.yml보다 우선 적용된다. 유지보수, 혼란 방지를 위해 한 가지 포맷만 사용하는 것이 안전하다. (application.yml사용 권장)
@Valueimport 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