.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가지 방법을 적절하게 사용하자 ~~