@SpringBootApplication 이해하기

서현서현·2023년 10월 18일
0

Spring

목록 보기
31/31
post-thumbnail

서론

스프링을 다시 공부하던중, 스프링부트와의 차이를 발견했다.

스프링부트의 경우 @Controller, @Service, @Repository등 어노테이션을 이용하면 자동으로 빈으로 등록이 되었었다.

그런데 스프링의 경우는 그렇지 않았다. 어노테이션을 모두 붙여도 component-scan과정이 필수적이었다. (Config.class를 사용하거나 xml파일에서 component-scan을 사용하거나 둘중 하나를 선택하면 된다.)

그렇다면 스프링부트는..왜... 이과정이 사라진걸까? 내 코드는 어떻게 동작하고있던걸까?

정답부터 말하자면 스프링부트에서 제공하는 어노테이션인 @SpringBootApplication 때문이였다!

프로젝트를 실행하는 클래스에 붙어있는 어노테이션인데, 늘 용도가 궁금했다. 실마리를 잡은김에 자세히 공부해보자.

@SpringBootApplication 파헤치기

@Target : 해당 어노테이션의 사용범위에 대해 설정
@Rentention : 실제 어노테이션이 적용되고 유지되는 범위 설정
@Documented : 소스코드의 코드문서 생성에 도움 - javadoc에 어노테이션 정보 표현
@Inherited : 자식클래스의 어노테이션 상속 여부를 의미

그리고 아주 중요한 어노테이션 세가지!

@SpringBootConfiguration

@Bean 정의 메소드를 빈으로 등록하고 사용하는데 도움을 주는 어노테이션이다.
업로드중..
즉 @SpringBootConfiguration 어노테이션이 붙어있다면 해당 클래스를 스프링부트에 대한 설정정보가 담긴 클래스로 인식하며 그 내부의 @Bean을 찾아 빈을 등록한다.

물론 @Bean으로도 등록은 가능하다. 하지만 Configuration 어노테이션이 존재하지 않는다면 싱글톤을 보장받을 수 없다.

그렇다면 @Configuration 어노테이션과는 무슨차이일까? @SpringBootConfiguration은 @Configuration의 특수화된 버전이다. @COnfiguration과 달리 한 어플리케이션은 하나의 @SpringBootConfiguration만을 가진다. 그리고 @SpringBootTest에서 추가적인 이점을 가진다.

@ComponentScan

@ComponentScan이 달린 클래스는 자동으로 스캔하여 application context에 빈으로 등록해주는 역할을 한다. 서론에서 언급했던 부분이 바로 이것이다. 스프링에서 config파일에 이 어노테이션을 사용하여 컴포넌트를 스캔해줬었는데, 이게 여기 들어있었다!!
@Controller와 @Service, @Repository엔 @Component가 포함되기 때문에 이 어노테이션을 따로 추가하지 않아도 자동으로 스캔된다.

EnableAutoConfiguration

@EnableAutoConfiguration 어노테이션은 스프링부트의 마법같은 기능인 auto-configuration을 가능케하는 어노테이션이다.
스프링 기반 어플리케이션엔 수많은 config가 필요하다

예를들어 db와 관련된 config, JPA와 관련된 config, 로그와 관련된 config 등등..
기존 스프링에선 이를 XML파일을 사용해 해결했다. 매우 복잡한 과정이다.
그러나 스프링부트에서는 CLASSPATH에 관련 jar파일이 존재하면 자동으로 confiuration 해주는 기능을 제공하고, 그 기능을 가능토록 하는게 이 어노테이션인것!

결론

@SpringBootApplication 어노테이션에 @ComponentScan이 숨어있었기 때문이다!
@SpringBootApplication엔 세가지의 중요한 어노테이션이 포함되어있으니 꼭꼭 기억해두자

| 참고 |
https://coding-zzang.tistory.com/43

2개의 댓글

comment-user-thumbnail
2023년 10월 18일

네...알겟서요주인님...잘기억하겟어요....

1개의 답글