-
[SPRING] @SpringBootApplicationstudy/spring 2020. 8. 29. 23:04
스프링부트를 사용해서 백엔드 개발을 공부하고 있었지만 정작 내가 직접 구현하지 않는 부분에 대해서는 파악하지 못하고 있다는 것을 느꼈다.
그 부분들을 찾아서 정리해나가려고 한다.
그 첫 번째는 @SpringBootApplication 이다.
@SpringBootApplication
스프링 부트 프로젝트를 만들면 자동으로 생성되는 애플리케이션 클래스에 선언되어 있는 어노테이션이다.
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
@SpringBootApplication을 찾아들어가보면
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { ... }
위 코드를 확인할 수 있다.
위 코드는 @SpringBootApplication에 대한 정보들을 담고 있다.
위의 코드에서 볼 수 있듯 @SpringBootApplication은 3가지 역할을 수행한다.
- SpringBootConfiguration
- EnableAutoConfiguration
- ComponentScan
@SpringBootApplication에 선언된 어노테이션들에 대해서 알아보겠다.
1. @SpringBootConfiguration
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; }
@SpringBootConfiguration은 스프링 부트의 설정을 나타내는 어노테이션이다.
스프링에서 사용하는 @Configuration을 대체하며 스프링 부트의 전용 어노테이션이다.
@Configuration과는 달리 설정 파일들을 자동으로 찾아준다.
2. @EnableAutoConfiguration
@EnableAutoConfiguration 은 자동 설정의 핵심이 되는 어노테이션이다.
미리 정의되어 있는 Bean들을 가져와서 등록해주는 역할을 한다.
미리 정의되어 있는 Bean이라고 함을 무엇을 말하는 걸까?
그 빈들은 External Libraries 중 spring-boot-autoconfigure 에 정의되어 있다.
이중 MEAT-INF 디렉터리 하위에 spring.factories 파일에 자동으로 가져올 Bean들이 정의되어 있다.
위의 사진처럼 aop, batch 등 각종 스프링 설정들이 기본으로 잡혀있는 것을 볼 수 있다.
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; ... }
@EnableAutoConfiguration 에서는 @Import 를 통해서 AutoConfigurationImportSelector 클래스를 이중 자동설정으로 지원한다.
AutoConfigurationImportSelector 클래스는 자동 설정할 후보 빈들을 불러오고 제외하거나 중복된 설정들을 제외하는 등의 작업을 거친 후에 자동 설정할 빈을 결정하는 역할을 한다.
3. @ComponentScan
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Repeatable(ComponentScans.class) public @interface ComponentScan { ... }
@ComponentScan은 basePackages 프로퍼티 값에 별도로 경로를 설정하지 않으면 해당 어노테이션이 위치한 패키지가 루트 경로가 되고 그 경로 안에 있는 패키지들을 돌면서 특정 어노테이션을 찾아서 Bean으로 등록시켜주는 역할을 한다.
위에서 말하는 특정 어노테이션이라 함은
@Component @Configuration @Repository @Service @Controller @RestController 을 말한다.기타 어노테이션들
- @Target : 어노테이션이 적용할 위치를 결정한다.
enum 파일에 지정된 타입들을 통해 어노테이션을 적용할 위치를 지정한다.
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Formal parameter declaration */ PARAMETER, ... }
- @Rentention : 어떤 시점까지 어노테이션이 영향을 미치는지를 결정한다.
괄호 안에 RetentionPolicy 형식의 값을 할당할 수 있다.
RetentionPolicy는 열거형으로 되어있는 구조다.
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { /** * Returns the retention policy. * @return the retention policy */ RetentionPolicy value(); }
public enum RetentionPolicy { //소스까지 유지가 됨. 컴파일 시 사라짐 SOURCE, //컴파일까지만 유지됨. 컴파일 후 생성되는 class 파일에는 남아있지만 런타임 때는 사라짐 CLASS, //자바가 JVM에서 실행되는 동안에도 유지됨 RUNTIME }
- @Documented : 문서에도 어노테이션의 정보가 표현된다.
javadoc으로 api 문서를 만들 때 어노테이션에 대한 설명도 포함하도록 지정해주는 것이다.
- @Inherited : 자식클래스가 어노테이션을 상속받을 수 있게 해준다.
참고
'study > spring' 카테고리의 다른 글
[SPRING] JPA의 영속성 컨텍스트 (0) 2020.08.30 [SPRING] Spring Batch Chunk 지향처리 (0) 2020.08.21 [SPRING] DispatcherServlet (0) 2020.08.04 [SPRING] Reqeust 흐름과 WAS (0) 2020.07.26 [SPRING] Spring vs. Spring boot (0) 2020.07.23