Bepoz
파즈의 공부 일기
Bepoz
전체 방문자
오늘
어제
  • 분류 전체보기 (232)
    • 공부 기록들 (85)
      • 우테코 (17)
    • Spring (85)
    • Java (43)
    • Infra (17)
    • 책 정리 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Bepoz

파즈의 공부 일기

Spring

[Spring] @ConfigurationProperties를 이용한 yml 설정 파일들의 객체 추상화

2021. 7. 8. 21:58

@ConfigurationProperties를 이용한 yml 설정 파일들의 객체 추상화

프로젝트를 진행하면서 구글, 네이버, 카카오 등의 OAuth2를 사용하게 되었다. 우리 팀은 각 서비스의 secret_key 등을 application.yml에 노출하고 싶지 않았다. Jasypt 등으로 암호화도 가능하겠지만 그냥 gitignore를 활용하기로 했다.

image
image

다음과 설정파일을 나눴다. 그리고 application.yml 내부에 spring:profiles:include = oath2 를 사용해주었다.
profile을 모듈처럼 사용하는 방법이다. profile에 대해서는 **이 링크**를 확인하자. application-oauth2.yml은 profile이 oauth2인 application.yml 이라고 보면된다.

이제 위의 값들을 객체에서 받아주려고 했다. 처음에는 **이 링크**에서 설명하고 있는 @Value와 @PropertySource 등을 이용하여 다음과 같은 어설픈 추상화 값 주입 Config 코드가 나왔다.

image

그리고 서비스 계층에서도 기껏 추상화를 해놓고 모든 타입을 필드로 가지고 있는 말도 안되는 설계가 나왔었다. Enum 으로 만들자니 위의 설정값들을 넣는 작업이 힘들었던 것이다. 이 문제를 @ConfigurationProperties 를 이용해서 해결하였다.

image
image
image
image

@ConfigurationProperties는 **이곳**에 정리해놓았다.
한 줄로 말하자면 설정 파일을 객체화 시키는 어노테이션이다. 기본적으로 이 어노테이션을 사용할 때에는 @ConstructorBinding이 아닌 @Configuration을 붙인다. 이 방식은 Setter를 사용해서 값을 주입하게 되는데, 개발자들은 Setter 혐오가 있기 때문에... 생성자 주입방식을 사용하기 위해 @ConstructorBinding을 이용한 것이다. 물론 그냥 필드에 @Value를 붙여서 처리해줄 수도 있지만 위와 같이 필드가 많은 경우에 정말 지저분한 코드가 되어버린다.

@ConstructorBinding의 단점은 위 설명 링크에도 나와있지만 해당 클래스 내에서 빈 등록을 해줄 수가 없다는 점이다. 그래서 따로 Config 파일을 생성해서 등록해주었다.

image

OAuth2Service에서 OAuth2Types 가 있는데 내부에는 List<OAuth2Type> 형식의 변수가 있다. 스프링에서 알아서 해당 타입의 빈 들을 넣어준다. 그 덕분에 모든 OAuth2Type 타입의 빈 들을 가지고 올 수 있게 된 것이다. 만약 내가 Github에 대한 OAuth를 추가해야되는 상황이 생기게되면 그냥 설정파일에 설정값들을 기입하고 GithubOAuth2 클래스만 생성하면 그걸로 끝이다! 굉장히 Enum 처럼 동작하는 것 같은 느낌이 든다. 사실 위의 @ConfigurationProperties 방식을 사용해서 Enum 을 사용하는 방향으로 개발할 수도 있긴하다. 우리 팀에서도 둘 중 하나를 택해야 했고, 위의 방식이 더 적절하다는 판단을 내렸다!

이 주제에 대한 리팩토링을 하면서 지금까지 공부하고 정리해온 학습들의 지식을 바로바로 써먹을 수 있어서 굉장히 뿌듯하고 좋았던 것 같다.


+)

이후에 Enum 형식으로 바꾸게 되었다. 엔티티에서 결국 타입별 Enum을 가지고 있는 것이 좋다고 생각했기 때문이다. @ConfigurationProperties를 이용해서 객체를 생성했다는 점은 변하지 않았다. Enum에 빈을 주입해야 됐는데 이것과 관련된 내용은 **이 링크**에 정리해놓았다.


REFERENCE

내 깃허브 TIL ㅎ

'Spring' 카테고리의 다른 글

[JPA] DATA JPA 사용 시 조심해야할 클래스 명에 대해  (0) 2021.07.10
[Spring] Enum에 빈을 주입하는 방법에 대해  (0) 2021.07.10
[Spring] BindingResult와 Errors의 차이점에 대해  (0) 2021.06.27
[Spring] HttpMessageConverter가 적용되는 시점에 대해  (3) 2021.06.14
[Spring] Gradle 파일 implementation, api, runtimeOnly, compileOnly... 등에 대해  (3) 2021.06.06
    'Spring' 카테고리의 다른 글
    • [JPA] DATA JPA 사용 시 조심해야할 클래스 명에 대해
    • [Spring] Enum에 빈을 주입하는 방법에 대해
    • [Spring] BindingResult와 Errors의 차이점에 대해
    • [Spring] HttpMessageConverter가 적용되는 시점에 대해
    Bepoz
    Bepoz
    https://github.com/Be-poz/TIL

    티스토리툴바