Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
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
Archives
Today
Total
관리 메뉴

Blog

[book] SpringBoot Up & Running 5장 본문

카테고리 없음

[book] SpringBoot Up & Running 5장

ggi88 2025. 4. 24. 16:04

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를 제대로 활용하기 위해선 단순히 코드를 짜는 걸 넘어 구성과 점검을 잘 다루는 것이 중요합니다. 위의 방법들을 잘 활용하면 복잡한 환경에서도 유연하고 안정적인 서비스를 유지할 수 있습니다.