@Configuration

beegle·2025년 1월 15일

스프링 환경설정

목록 보기
2/3
post-thumbnail

Spring Environment 클래스

org.springframework.core.env 패키지에 속하며 현재 애플리케이션이 실행 중인 환경을 나타내는 인터페이스입니다.

애플리케이션 환경의 두 가지 주요 측면인 profile와 properties를 다룹니다.

Properties에 관한 접근은 상위 인터페이스인 PrepertyResolver를 통해 다루어집니다.

getActiveProfiles()를 통해 활성화 중인 Profile의 정보들을 가져올 수 있습니다.

package org.springframework.core.env;

public interface Environment extends PropertyResolver {
	String[] getActiveProfiles();
	String[] getDefaultProfiles();
	@Deprecated
	boolean acceptsProfiles(String... profiles);
	boolean acceptsProfiles(Profiles profiles);
}

@Configuration 어노테이션

기본 개념

@Configuration은 스프링의 설정 클래스임을 나타내는 어노테이션으로, 내부적으로 @Component를 포함하고 있어 자동으로 빈으로 등록됩니다

주요 역할

싱글톤 보장

  • 빈이 싱글톤으로 관리되도록 보장
  • @Bean 메서드가 여러 번 호출되어도 항상 같은 인스턴스 반환

스프링 컨테이너 관리

  • 설정 클래스 자체가 빈으로 등록됨
  • @Bean이 붙은 메서드를 찾아 자동으로 빈 생성

CGLIB 동작 방식

  • 스프링은 CGLIB 라이브러리를 사용하여 @Configuration 클래스를 상속한 프록시를 생성
  • 프록시는 @Bean 메서드 호출 시 다음과 같은 로직을 수행:
    1. 스프링 컨테이너에 빈이 있으면 존재하는 빈 반환
    2. 없으면 새로 생성하여 스프링 컨테이너에 등록 후 반환

@Bean만 사용할 때와의 차이

  • @Bean만 사용하면 빈은 등록되지만 싱글톤이 보장되지 않음
  • @Configuration 없이는 메서드 호출마다 새 인스턴스가 생성됨

@Value, @ConfigurationProperties

스프링의 properties나 yaml에 있는 값들은 애플리케이션이 실행되면서 환경변수로 Environment에 등록이 된다. 그리고 해당 값들을 꺼내서 애플리케이션에서 활용하기 위한 방법으로는
@Value와 @ConfigurationProperties가 있다.

@Value

  • @Value는 단일 값을 주입받기 위해서 사용한다.
  • 값을 가져오기 위해서는 PropertyPlaceHolderConfigurer를 통해 ${}을 사용하는 방식과
    SpEL(Spring Expression Language)을 통해 #{}을 이용하는 방식 크게 2가지를 사용할 수 있다.
  • @Value를 이용해 값을 가져올 때에는 RelaxedBinding이라는 것이 적용되지 않는다. Relaxed Binding이란 프로퍼티 값의 이름이 조금 달라도 유연하게 바인딩을 시켜주는 규칙을 의미한다
  • 예시)
@server.admin-what-is-real-name=MangKyu

Value("${server.admin-what-is-real-name}") // 완벽히 일치하는 프로퍼티 이름으로만 가져올 수 있다.
private String adminName;

@ConfigurationProperties

  • @ConfigurationProperties는 프로퍼티에 있는 값을 클래스로 바인딩하기 위해 사용되는 어노테이션이다. 값의 바인딩을 위해 Setter를 필요로 하며 생성자로 바인딩하기 위해서는 @ConstructorBinding을 붙여주어야 한다.
@Getter
@Setter
@ConfigurationProperties(prefix = "server")
public class ServerInfo {

    private final String adminWhatIsRealName;

}
  • @ConfigurationProperties를 사용하기 위해서는 @EnableConfigurationProperties에 해당 클래스를 지정해주거나 @ConfigurationPropertiesScan를 통해 스캐닝의 대상이 되도록 해주어야 한다.
  • 기본적으로 RelaxedBinding이 적용된다. 적용되는 규칙은 아래 4가지가 있다.
    server.admin-what-is-real-nameproperties 와 .yml에 권장되는 표기법
    server.adminWhatIsRealName표준 카멜 케이스 문법
    server.admin_what_is_real_name.properties와 .yml 에서 사용가능한 표기법 ( - 표기법이 더 표준임)
    SERVER_ADMIN_WHAT_IS_REAL_NAME시스템 환경 변수를 사용할 때 권장되는 표기법
  • SpEL이 안 된다.
  • 접두사 및 중첩 개체를 사용하여 속성을 계층적으로 바인딩할 수 있다.
  • Spring의 ConversionService를 통해 유효성 검사 및 데이터 변환을 지원한다.

차이 요약

  • Spring에서는 여러 값을 바인딩받아야 하는 경우에 @ConfigurationProperties를 사용하도록 권장한다.

그러면 단일 값을 주입한다고 했을 때 속도 차이가 있을까?

스프링 공식 홈페이지나 구글링을 해봤을 때 성능 차이를 비교한 문서는 찾아보지 못했지만

생각해봤을 때 당연히 단일 값을 주입할 경우는 @Value를 쓰는 것이 편해서도 있겠지만 더 빨라서 쓰는 것도 있지 않을까 싶다.

우선 바인딩 과정이 필요가 없고 @ConfigurationProperties의 경우 ConversionService를 통한 타입 변환과 유효성 검사 과정이 포함되어있고 스프링 부트가 시작될 때 추가적인 초기화 작업 필요하기 때문에 더 느릴 것으로 추측된다.

Reference

https://mangkyu.tistory.com/207
https://junuuu.tistory.com/797

profile
배운 내용을 이해하기 쉽게 다시 정리하는 공간입니다.

0개의 댓글