| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- flyio
- TypeScript
- tessrect
- superbase
- Delphi
- java
- 일의격
- docker
- kidznote
- stepzen
- FastAPI
- Book
- wsl2
- springboot
- Markdown
- svelte
- dokerfile
- edgestore
- AWS
- shadcn-ui
- Nextjs
- reactnative
- react
- beautifullsoup
- vmmem
- oraclecloude
- vercel
- spring
- Expo
- WSLHostPatcher
- Today
- Total
Blog
[book] SpringBoot Up & Running 5장 본문
5. Spring Boot 애플리케이션 구성 및 점검
서비스가 커지고 운영 환경이 다양해질수록 "설정"의 중요성은 커집니다. Spring Boot는 애플리케이션을 동적으로 구성하고 상태를 점검할 수 있도록 다양한 기능을 제공합니다. 이번 글에서는 Spring Boot의 구성 옵션부터 Actuator를 활용한 점검 방법까지 하나씩 알아봅니다.
애플리케이션 구성
설정 소스 우선순위
Spring Boot는 여러 소스에서 설정값을 읽을 수 있으며, 아래와 같은 우선순위로 처리됩니다 (하위일수록 우선순위가 높음):
- JAR 내부
application.properties - JAR 외부
application.properties - 프로필별 속성 파일 (
application-dev.properties) - 환경 변수
- 명령줄 인수 등
@Value 애너테이션 사용
가장 단순한 설정 바인딩 방법입니다.
application.properties
greeting-name=Dakota
컨트롤러
@RestController
class GreetingController {
@Value("${greeting-name:Mirage}")
private String name;
@GetMapping("/greeting")
public String getGreeting() {
return name;
}
}
속성 값이 없을 경우 기본값으로 Mirage가 적용됩니다.
또한 다음과 같이 속성 중첩도 가능합니다:
greeting-coffee=${greeting-name} is drinking Cafe Ganador
추가 예시
@Value("${greeting-coffee:Someone is drinking something}")
private String coffee;
@Value의 한계
- 속성 오타가 있어도 컴파일 시 잡히지 않음
- IDE 자동완성 및 경고 지원이 약함
- 여러 속성을 묶어서 관리하기 불편함
타입 안전한 설정: @ConfigurationProperties
이 방식은 속성을 POJO 객체로 바인딩하고, IDE에서 자동완성과 유효성 검사를 지원합니다.
1. POJO 클래스 정의
@ConfigurationProperties(prefix = "greeting")
public class Greeting {
private String name;
private String coffee;
// getter/setter
}
2. 클래스 스캔 활성화
@SpringBootApplication
@ConfigurationPropertiesScan
public class MyApp { ... }
3. 컨트롤러에서 사용
@RestController
@RequestMapping("/greeting")
class GreetingController {
private final Greeting greeting;
public GreetingController(Greeting greeting) {
this.greeting = greeting;
}
@GetMapping
public String greet() {
return greeting.getName();
}
@GetMapping("/coffee")
public String coffee() {
return greeting.getCoffee();
}
}
4. 구성 프로세서 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
이렇게 하면 application.properties 작성 시 IDE에서 자동완성도 지원됩니다.
외부 컴포넌트 구성 연동
외부 설정 대상도 Bean으로 등록하여 설정 바인딩이 가능합니다.
Droid.java
public class Droid {
private String id;
private String description;
// getter/setter
}
Main 클래스 내
@Bean
@ConfigurationProperties(prefix = "droid")
public Droid createDroid() {
return new Droid();
}
application.properties
droid.id=BB-8
droid.description=작고 굴러다니는 안드로이드
컨트롤러
@RestController
@RequestMapping("/droid")
class DroidController {
private final Droid droid;
public DroidController(Droid droid) {
this.droid = droid;
}
@GetMapping
public Droid get() {
return droid;
}
}
자동 구성 보고서 보기
Spring Boot의 자동 구성 결과를 확인하고 싶다면:
실행 시 --debug 옵션 추가
java -jar myapp.jar --debug
이렇게 하면 아래와 같은 보고서가 표시됩니다:
- Positive matches: 조건 만족하여 구성된 항목
- Negative matches: 누락된 조건으로 구성되지 않은 항목
- Unconditional classes: 항상 구성되는 항목
Actuator로 애플리케이션 상태 점검
Spring Boot Actuator는 실행 중인 애플리케이션의 상태와 설정을 실시간으로 확인할 수 있게 해줍니다.
1. 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2. 노출할 엔드포인트 지정
management.endpoints.web.exposure.include=env, health, info
개발용일 경우 전체 노출:
include=*
3. 주요 엔드포인트
/actuator/env: 설정과 그 출처 확인/actuator/health: 앱 건강 상태 확인/actuator/loggers: 실시간 로깅 레벨 변경/actuator/configprops: 바인딩된 설정 클래스 정보
Actuator로 로깅 레벨 실시간 변경
echo '{"configuredLevel": "TRACE"}' | \
http :8080/actuator/loggers/org.springframework.data.web
해당 클래스의 로깅 레벨을 실시간으로 TRACE로 변경합니다.
요약
| 기능 | 설명 |
|---|---|
@Value |
단일 속성 매핑, 기본값 지정 가능 |
@ConfigurationProperties |
타입 안전한 구성, POJO로 바인딩 |
| Actuator | 앱 상태 확인 및 구성 정보 실시간 점검 |
Spring Boot를 제대로 활용하기 위해선 단순히 코드를 짜는 걸 넘어 구성과 점검을 잘 다루는 것이 중요합니다. 위의 방법들을 잘 활용하면 복잡한 환경에서도 유연하고 안정적인 서비스를 유지할 수 있습니다.