본문 바로가기
Spring/인프런 토비의 Spring Boot

섹션 6-2 [자동 구성 기반 애플리케이션] 합성 애노테이션 적용

by include_hoany 2024. 6. 14.

합성 애노테이션 적용

@SpringBootApplication
public class TobySpringBootApplication {
	public static void main(String[] args) {
		SpringApplication.run(TobySpringBootApplication.class, args);
	}
}

Spring Boot 프로젝트를 구성하면 우리가 직접 구현하지는 않는 서버를 구동시키는 Application class에서 사용되어지는 @SpringBootApplication 애노테이션을 직접 구현해보기 위해 합성 애노테이션으로 구성해보도록 하겠습니다.

 

package com.tobyspring.tobyspringboot;  
  
import org.springframework.context.annotation.ComponentScan;  
import org.springframework.context.annotation.Configuration;  
  
import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
  
/*  
    @Retention 의 디폴트값은 RetentionPolicy.CLASS 입니다.  
    RetentionPolicy.CLASS로 구성된다면 애노테이션 정보가 컴파일된
    class파일 까지는 존재하지만 runtime 메모리로 로딩할 때는 해당 애노테이션
    정보가 사라지게 됩니다.  
  
    따라서 우리는 해당 애노테이션 정보가 runtime 에도 메모리에 애노테이션 정보가  
    유지되어야 하므로 @Retention(RetentionPolicy.RUNTIME)으로 설정합니다.  
 */  
/*  
	@Target 애노테이션에 ElementType.TYPE을 적용한다면 class, interface, enum
	세가지 종류의 대상에게 부여할 수 있는 애노테이션을 구성할 수 있습니다.  
 */
@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.TYPE)  
@Configuration  
@ComponentScan  
public @interface MySpringBootAnnotation { }

합성 애노테이션으로 구성한 @MySpringBootAnnotation애노테이션을 활용하여 SpringBoot 서버를 실행시킬 수 있도록 구성해보겠습니다.

 

package com.tobyspring.tobyspringboot;  
  
  
import org.springframework.boot.SpringApplication;  
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;  
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.ComponentScan;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.DispatcherServlet;  
  
/*  
    기존에 존재하였는 @ComponentScan, @Configuration 애노테이션을  
    메타 애노테이션으로 가지고 있는 합성 @MySpringBootAnnotation을 구성하여  
    적용합니다.  
 */@MySpringBootAnnotation  
public class TobyspringbootApplication {  

    public static void main(String[] args) {  
       SpringApplication.run(TobyspringbootApplication.class, args);  
    }  
  
}

기존에 SpringBoot가 실행되기 위해 꼭 필요한 Bean정보는 별도로 Config class를 구현하여 분리하도록 하겠습니다.

 

package com.tobyspring.tobyspringboot;  
  
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;  
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.DispatcherServlet;  
  
/*  
    ServletWebServerFactory, DispatcherServlet
    Bean구성정보를TobyspringbootApplication 클래스에서 분리하여
    별도 Config 클래스에 구성합니다.  
  
    해당 Config, ServletWebServerFactory, DispatcherServlet class가  
    Spring Container에서 관리될 수 있도록 @Confuguration, @Bean애노테이션을  
    활용하여 Spring Container에 등록해줍니다.  
 */  
@Configuration  
public class Config {  
  
    @Bean  
    public ServletWebServerFactory servletWebServerFactory() {  
        return new TomcatServletWebServerFactory();  
    }  
  
    @Bean  
    public DispatcherServlet dispatcherServlet() {  
        return new DispatcherServlet();  
    }  
  
}

위처럼 구현하면 우리가 SpringBoot 프로젝트 구현시 자동으로 설정되던 Application 클래스와 얼추 비슷한 모습으로 구현할 수 있게 됩니다.