Portfolio/Spring Boot

스프링 부트 5일차 - 스프링 부트 AutoConfigure

Foo 2019. 4. 5. 21:02
728x90

Autoconfiguration으로 만든 starter를 의존성에 추가해준 경우

해당 starter에서 등록한 Bean이 Autowired를 해줄경우 매핑이 될 것이다.

그런데 만약 해당 Bean을 내 프로젝트에서 다시 Bean으로 강제로 지정해줄 경우 어떤 Bean으로 오버라이드 될까?


이것에 대한 답은 스프링부트 2.1버전 이전과 후로 나뉘는데 우선 이전 버전의 경우

내 프로젝트에서 등록한 Bean 대신 starter에서 Autoconfiguration으로 등록한 Bean이 오버라이딩 되어 생성된다.


반면 스프링부트 2.1버전 이후의 경우 기본적으로 실행 오류가 뜬다. 다음과 같은 메시지를 띄우면서.


***************************

APPLICATION FAILED TO START

***************************


Description:


The bean 'holoman', defined in class path resource [me/whiteship/HolomanConfiguration.class], could not be registered. A bean with that name has already been defined in me.whiteship.Application and overriding is disabled.


Action:


Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true


Process finished with exit code 1


오버라이딩을 하고 싶다면 allow-bean-definition-overriding 옵션을 true로 줘야한다.



여기서 주의할 점은 Bean으로 결국 등록되는 것은 starter의 Bean이라는 것이다.

즉 스프링 부트가 프로젝트를 스캔할 때 먼저 프로젝트 내에 있는 Bean을 등록한 후

의존성들에 있는 Bean을 나중에 등록하기 때문에 의존성에 있는 Bean으로 오버라이딩 된다는 것을 확인할 수 있다.



* 만약 해당 Bean이 이미 존재한다면 오버라이딩 하지 않도록 하기 위해서는 starter(의존성) 쪽에서 @Bean 어노테이션과 함께 @ConditionalOnMissingBean 어노테이션을 주면 Bean이 없을때만 Bean을 생성하여 등록한다.

  참고 : https://engkimbs.tistory.com/754





근데 Bean은 그대로 Autoconfiguration으로 만들어주는걸 사용하고 안에 있는 값만 바꾸고 싶은데.. 꼭 내가 이렇게 Bean을 만들어줘야 하는건가? 어떻게 해야하지?


-> resources에 application.properties에 해당 bean의 properties를 정의해주면됨, 그리고 HolomanProperties 클래스를 생성 후 @ConfigurationProperties("holoman") 어노테이션을 주면됨.

    holoman.name = 이준형

    holeman.how-long=100