back-end/spring boot

properties 값 주입 받기

study-minjeong 2024. 3. 6. 10:52

.yaml에 jwt의 헤더, 시크릿 키, 유효기간 등을 저장해두어서 이 프로퍼티들을 불러와 사용하고 싶었다. 그래서 Spring boot에서 외부파일(application.yml 등)에 있는 값들을 주입해서 사용하는 방법을 찾아보았다!

 

 

먼저, 내가 작성한 .yaml 파일의 일부이다.

dot:
	jwt:
        secretKey: 
        authType: Bearer
        authoritiesKey: Authorities
        accessTokenHeader: Authorization
        refreshTokenHeader: X-REFRESH-TOKEN
        accessTokenExpire: 86400000 # 1일
        refreshTokenExpire: 604800000 # 7일

이 프로퍼티들을 하나의 Bean에 바인딩하여 사용할 것이다.

 

 

1. @ConfigurationProperties

타입 안정성을 가지는 방법이다. 클래스를 정의한 후 값을 주입해서 사용한다.

@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "dot.jwt")
public class JwtProperties {
    private String secretKey;
    private String authType;
    private String authoritiesKey;
    private String accessTokenHeader;
    private String refreshTokenHeader;
    private Long accessTokenExpire;
    private Long refreshTokenExpire;
}

 

 

최상단 클래스 레벨에 @Component와 @ConfigurationProperties 어노테이션을 붙여준다. 그리고 최상위 prefix인 "dot.jwt"를 @ConfigurationProperties의 value로 설정해준다. 

하위의 이름을 똑같이 일치시켜줘야하고, setter도 반드시 정의해줘야 한다.

 

 

2. @Value

간단하게 값을 주입하는 방식이다. @Value 어노테이션에 값을 가리키고 있는 placeholder를 명시해주거나 SpEL을 명시해주면 된다.

@Value("${dot.jwt.authoritiesKey}")
private String AUTHORITIES_KEY;

@Value("${dot.jwt.authType}")
private String AUTH_TYPE;

@Value("${dot.jwt.accessTokenExpire}")
private long ACCESS_TOKEN_EXPIRE_TIME;

@Value("${dot.jwt.refreshTokenExpire}")
private long REFRESH_TOKEN_EXPIRE_TIME;

 

 

이 방법은 타입 안정성 문제가 있다. 예를 들어 true라는 값이 있다면, string으로도 Boolean으로도 사용된다.

그리고 @Value 어노테이션을 사용하여 값을 주입받을때 반드시 Bean 으로 등록되어있는 객체여야 한다.

 

 

문제점이 있지만 Spring Batch를 사용할 때 Late Binding을 위해 @Value를 사용하는 경우도 존재하기 때문에, 2가지 방법을 적절하게 사용하자 ~~