펙토리 메소드를 만들어서 직접 스프링 컨테이너에 Bean을 등록하는 것보다 간편하게 Bean을 등록하는 방법이 있습니다.
@Component
어노테이션을 이용해서 간편하게 등록 할 수 있습니다.
@Controller
, @RestController
, @Service
, @Repository
안에는 @Component
가 붙어있어 자동으로
Bean
으로 등록됩니다!
간편하게
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이 등록되는지 찾기 힘들 수도 있습니다.
이 단점은, 패키지를 잘 나누어서 해결할 수 있습니다.