@Component 스캔을 통해 Bean 등록하

Sol's·2023년 5월 25일
0

펙토리 메소드를 만들어서 직접 스프링 컨테이너에 Bean을 등록하는 것보다 간편하게 Bean을 등록하는 방법이 있습니다.
@Component어노테이션을 이용해서 간편하게 등록 할 수 있습니다.

@Controller, @RestController, @Service, @Repository 안에는 @Component가 붙어있어 자동으로
Bean으로 등록됩니다!

@Component

간편하게 Bean으로 등록할 클래스에 @Componet를 붙여주면 됩니다.
그 후 @Configuration이 붙은 applicationContext.register(HellobootApplication.class)를 하는
즉, 스프링 컨테이너를 만드는 클래스에
@ComponetScan을 사용하면 @Componet가 붙은 클래스를 전부 Bean으로 등록합니다.

@Component
public class SimpleHelloService implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}
@RequestMapping
@Component
public class HelloController {

   ```생략
}

@ComponetScan가 붙은 메인 클래스

@Configuration // 구성 정보를 가지고 있는 클래스라는것을 알림
@ComponentScan
public class HellobootApplication {

    public static void main(String[] args) {
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(){
            @Override
            protected void onRefresh() {
                super.onRefresh();
                // 서블릿 펙토리 : 서블릿 컨테이너를 만드는 것을 쉽게 도와줍니다.
                ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
                // serverFactory.getWebServer : 서블릿 컨테이너 생성하는 메소드입니다.
                // 따라서 webServer 가 서블릿 컨테이너 입니다.
                WebServer webServer = serverFactory.getWebServer(servletContext -> {
                    servletContext.addServlet("dispatcherServlet",
                            new DispatcherServlet(this) // DispatcherServlet이 작업을 위임할 applicationContext를 등록
                    ).addMapping("/*"); // 모든 요청을 다 받는다.
                });
                webServer.start();
            }
        }; // 스프링 컨테이너 생성
        applicationContext.register(HellobootApplication.class);
        applicationContext.refresh(); // Bean을 만드는 명령어
    }

}

어노테이션 기반 스캔의 장/단점

새로운 기능을 만들어서 추가할때 매번 구성정보를 등록하지 않아도 됩니다!
즉, 유지보수가 굉장히 편해집니다.

하지만, Bean으로 등록되는 클래스가 많아지다보면 어떤 Bean이 등록되는지 찾기 힘들 수도 있습니다.
이 단점은, 패키지를 잘 나누어서 해결할 수 있습니다.

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

0개의 댓글