ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRING] @SpringBootApplication
    study/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 : 자식클래스가 어노테이션을 상속받을 수 있게 해준다.

     

     

    참고

    https://velog.io/@adam2/SpringBoot-%EC%9E%90%EB%8F%99-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95AutoConfiguration

     

    [SpringBoot] 자동환경설정::AutoConfiguration

    스프링부트가 어떻게 자동으로 환경설정 하는지 알아봅시다.

    velog.io

    https://jdm.kr/blog/216

     

    자바 어노테이션(Java Annotations) :: JDM's Blog

    Annotation 어노테이션Annontion은 잘만 쓰면 정말 유용한 자바의 구문입니다. 기본적인 종류는 몇가지에 한정 되지만 본인의 입맛대로 커스텀 어노테이션Custom Annotation도 만들어낼 수 있습니다. 따라

    jdm.kr

     

    '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
Designed by Tistory.