합성 애노테이션

Sol's·2023년 5월 28일
0

토비의 스프링 부트

목록 보기
16/31

합성 애노테이션 (Compose Annotation)

애노테이션을 합쳐놓은 것입니다.
하지만 합쳐놓는것을 나열하다보면 코드가 지져분해집니다.
이때 애노테이션을 합성해서 만들 수 있습니다.
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);
    }
}

MySpringBootAnnotation

@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 설정 분리하기

이제는 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설정을 한데모아 유지보수하기 더 편리해 졌습니다.

이렇게 설계를 잘 하고 스프링 부트의 어노테이션을 잘 활용하면 훨씬 가독성 좋고 유지보수에 편한 개발을 할 수 있다는 것을 알았습니다!

profile
배우고, 생각하고, 행동해라

0개의 댓글