본문 바로가기
학습/Spring

[spring] 스프링부트의 AutoConfiguration을 이용한 Bean 등록

by KKambi 2020. 4. 6.

Bean 등록 단계

  1. Component scan을 통해서 모은 component들의 정보에 의해 빈 등록
  2. Spring Boot가 spring.factories 파일에 사전에 정의한 AutoConfiguration 내용에 의해 bean 생성이 진행

 

예상되는 문제점

  • @Component를 통해 등록한 빈과, @Configuration에 의해 등록된 빈이 서로 충돌하면?
  • 개발자가 등록한 빈이 @Configuration에 의해 오버라이딩된다면?
  • 우리에게 필요없는 빈이 @Configuration에 의해 자동으로 등록된다면?

 

해결법 ~ 조건적인 빈 등록

  • AutoConfigure 설정 자바 파일에서, @Bean을 반환하는 메소드에 @Conditional 관련 어노테이션을 이용해서 특정 조건 하에서만 빈을 등록할 수 있다.
  • @ConditionalOnMissingBean : 특정 빈이 등록되지 않았을 때만 빈을 등록
  • @ConditionalOnBean : 특정 빈이 등록되었을 때만 빈을 등록 (작업을 위해 필수적인 빈이 등록되었는지 확인)
  • @ConditionalOnClass : 특정 클래스가 등록되었을 때만 빈을 등록 (작업을 위해 필수적인 의존성이 있는지 확인)

 

또 다른 문제점

  • 위의 해결법을 통해 빈 등록을 조절할 수 있다.
  • 자동설정 파일에 의해 등록되는 빈의 내용을 수정하려면 어떻게 해야 할까?
  • 일일이 메인 어플리케이션 클래스(ApplicationContext역할)에서 @Bean을 통해 재정의해야 할까?

 

해결법 ~ 의존성을 사용하는 쪽에서 별도의 properties 정의

<의존성을 추가하는 쪽>

  1. resources/application.properties 생성
  2. properties 파일에서 해당 인스턴스의 값을 설정
    ex) holoman.name = kkambi
    holoman.age = 55

<의존성이 되는 쪽>

  1. properties에 해당하는 자바 파일 생성
  2. properties class는 @ConfigurationProperties("Bean이름")이 선언된다.
  3. 해당 빈의 멤버변수 / getter / setter 를 구현한다.
  4. Configuration에 해당하는 자바 파일 생성
  5. Configuration class는 @EnalbeConfigurationProperties( HolomanProperties.class ) 이 선언된다.
  6. Configuration class 안의 @Bean 메소드에서 5번에서 주입받은 HolomanProperties를 인자로 받고
    @Bean 메소드 내의 setter를 사용하여 프로퍼티의 멤버변수를 할당한다.

 

결론

의존성을 사용하는 프로젝트에서, 자신들이 정의한 properties만을 이용해, AutoConfiguration파일의 빈을 등록한다.

즉, 빈을 재정의할 필요 없이 properties를 통해 내용만 변경한다.

댓글