오늘은 휴일이어서 조금 쉬엄쉬엄 공부했던 것 같다. 스프링 시큐리티의 전체 구조를 파악하고, JWT에 대해서 조금 더 자세히 알아보는 시간을 가졌다.
여기에는 Spring에 설정 값을 주입하는 방법에 대해 조금 정리해보았다.
1. Spring 설정 값 주입하기
민감한 데이터 같은 것들은 따로 파일로 관리하거나 환경변수 같은 것을 이용하면 GitHub과 같은 공개적인 저장소에 올리더라도 데이터를 보호할 수 있다.
여기에는 yml 파일에 필요한 설정값들을 입력해주고 그 입력 값들을 어플리케이션 안에서 주입받아 사용하는 법에 대해 정리해본다.
먼저 resources 패키지에 있는 application.yml 파일에 필요한 설정값들을 입력해준다.
auth:
jwt:
issuer: moomoo
secret: 5P8wLq9vGod2r8HGJyBUKLvFyxlNDgif
accessTokenExpirationHour: 168
그런 다음 이 값들을 사용할 곳에 생성자 주입을 통해서 집어넣을 수 있다. @Value 어노테이션을 이용하면 된다.
class JwtPlugin(
@Value("\${auth.jwt.issuer}") private val issuer: String,
@Value("\${auth.jwt.secret}") private val secret: String,
@Value("\${auth.jwt.accessTokenExpirationHour}") private val accessTokenExpirationHour: Long
)
위와 같이 주입한 다음 변수를 사용하면 된다.
하지만 이런 설정 값들의 개수가 많거나 여러번 필요하다면, 매번 저렇게 필요한 변수들을 하나하나 입력해주는 것은 비효율적일 것이다.
이럴때 @ConfigurationProperties 어노테이션을 이용해서 데이터 클래스를 하나 만들어서 값들을 한 번에 주입받을 수도 있다.
사용법은 아래와 같이 간단하다.
먼저 데이터 클래스를 하나 만들어준다. 그런 다음 @ConfigurationProperties 어노테이션을 달아준다. yml 파일에 "auth.jwt" 아래에 설정값들을 입력해 줬기 때문에 prefix로 그 경로를 입력해주면 된다.
import org.springframework.boot.context.properties.ConfigurationProperties
@ConfigurationProperties(prefix = "auth.jwt")
data class JwtProperties(
val issuer: String,
val secret: String,
val accessTokenExpirationHour: Long
)
그런 다음 @EnableConfigurationProperties 어노테이션을 어플리케이션 클래스에 달아준다. 위에서 만든 데이터 클래스를 같이 (JwtProperties::class)와 같이 넣어주면 어플레케이션이 시작될 때 @ConfigurationProperties가 달린 클래스를 자동으로 스캔하고 설정 값을 이 클래스에 바인딩 해준다. 그렇게 되면 이제 JwtProperties를 주입받아 값들을 사용할 수 있게 된다.
@SpringBootApplication
@EnableConfigurationProperties(JwtProperties::class)
class CourseRegistrationApplication
fun main(args: Array<String>) {
runApplication<CourseRegistrationApplication>(*args)
}
이제 아래와 같이 클래스에서 주입을 받아서 값들을 사용하기만 하면 된다.
class JwtPlugin(
private val jwtProperties: JwtProperties
) {
println(jwtProperties.issuer) // moomoo
println(jwtProperties.secret) // 5P8wLq9vGod2r8HGJyBUKLvFyxlNDgif
println(jwtProperties.accessTokenExpirationHour) // 168
}
위 과정을 겪으면서 캠프 초창기에 이 설정 값들 숨기는 법을 잘 몰라가지고 한참 고생했던 기억에 새록새록 나기도했다. 이제는 이 문제로 크게 고통받은 일은 없을 것 같다.
2. 오늘 배운 것
- Spring Security의 전체적인 구조를 파악해보려고 노력해보았다. 지금도 완전히 이해했다고 하기는 어렵겠지만 어느정도는 알게된 것 같다.
'오늘 배운 것' 카테고리의 다른 글
24-06-08 Spring 개인 과제 (0) | 2024.06.08 |
---|---|
24-06-07 알고리즘 문제 풀이 (0) | 2024.06.07 |
24-06-05 알고리즘 문제 풀이 (0) | 2024.06.05 |
24-06-04 JPA @MappedSuperClass (0) | 2024.06.04 |
24-06-03 팀 프로젝트 회고 (0) | 2024.06.03 |