애노테이션을 합쳐놓은 것입니다.
하지만 합쳐놓는것을 나열하다보면 코드가 지져분해집니다.
이때 애노테이션을 합성해서 만들 수 있습니다.
ex) @RestController
현재 메인메소드에는 2개의 어노테이션을 합성하여 한개로 만들어 보겠습니다.
이유는 코드가 더 깔끔해지기 때문입니다.
클래스 레벨에 2개의 어노테이션 @Configuration
, @ComponentScan
과
빈 설정을 하는코드를 제외하면 처음 스프링 부트 프로젝트를 생성할때와 똑같습니다.
우리는 애노테이션부터 합성해서 스프링부트의 메인메소드와 똑같이 만들어 보겠습니다.
나중에 Bean관련 코드를 처리하겠습니다.
@Configuration // 구성 정보를 가지고 있는 클래스라는것을 알림
@ComponentScan
public class HellobootApplication {
@Bean
public ServletWebServerFactory servletWebServerFactory(){
return new TomcatServletWebServerFactory();
}
@Bean
public DispatcherServlet dispatcherServlet(){
// DispatcherServlet이 이용할 컨트롤러를 찾아야 하기때문에 ApplicationContext를 생성자로 주어야합니다.
// 스프링이 알아서 ApplicationContext를 주입해 줍니다!!
return new DispatcherServlet();
}
public static void main(String[] args) {
SpringApplication.run(HellobootApplication.class, args);
}
}
@Retention(RetentionPolicy.RUNTIME) // 런타임까지 애노테이션 정보가 유지되게 합니다.
@Target(ElementType.TYPE) // 클래스, 인터페이스, Enum에 부여합니다.
@Configuration
@ComponentScan
public @interface MySpringBootAnnotation {
}
메인메소드에 있는 2개의 애노테이션을 합성하여 custom하였습니다.
그리고 메인에서는 직접 만든 합성 애노테이션을 사용했습니다.
@MySpringBootAnnotation
public class HellobootApplication {
@Bean
public ServletWebServerFactory servletWebServerFactory(){
return new TomcatServletWebServerFactory();
}
@Bean
public DispatcherServlet dispatcherServlet(){
// DispatcherServlet이 이용할 컨트롤러를 찾아야 하기때문에 ApplicationContext를 생성자로 주어야합니다.
// 스프링이 알아서 ApplicationContext를 주입해 줍니다!!
return new DispatcherServlet();
}
public static void main(String[] args) {
SpringApplication.run(HellobootApplication.class, args);
}
}
이제는 Bean 설정코드를 Config
라는 클래스를 만들어 분리하겠습니다.
@Configuration // 메타 애노테이션으로 @Component를 갖고 있습니다.
public class Config {
@Bean
public ServletWebServerFactory servletWebServerFactory(){
return new TomcatServletWebServerFactory();
}
@Bean
public DispatcherServlet dispatcherServlet(){
// DispatcherServlet이 이용할 컨트롤러를 찾아야 하기때문에 ApplicationContext를 생성자로 주어야합니다.
// 스프링이 알아서 ApplicationContext를 주입해 줍니다!!
return new DispatcherServlet();
}
}
이제 메인메서드에는 스프링 부트와 똑같은 형태가 되었습니다!!
@MySpringBootAnnotation
public class HellobootApplication {
public static void main(String[] args) {
SpringApplication.run(HellobootApplication.class, args);
}
}
Compose Annotation을 사용해서 어노테이션을 깔끔하게 관리할 수 있었습니다.
또한, Bean
설정을 Config
클래스를 만들어 Bean설정만 관리하게하여
Main
메서드의 복잡성을 줄이고, Bean
설정을 한데모아 유지보수하기 더 편리해 졌습니다.
이렇게 설계를 잘 하고 스프링 부트의 어노테이션을 잘 활용하면 훨씬 가독성 좋고 유지보수에 편한 개발을 할 수 있다는 것을 알았습니다!