스프링 컨테이너를 사용하기 위해 스프링 컨테이너가 사용하는 구성정보 (클래스) 를 제공해야합니다.
즉, 우리가 만든 코드를 어떻게 Object로 만들어서 스프링 컨테이너에 컴포넌트로 등록해 두고
스프링 컨테이너안에Bean(Object)
이 또다른Bean(Object)
를 의존(사용)한다면
관계를 어떻게 맺어줄 것인지, 어느 시점에 관계를 주입해 줄것인지 알아보겠습니다.
팩토리 메소드는 어떤
오브젝트를 생성하는 로직
을 담당하는 메소드입니다.
Bean
오브젝트를 펙토리 메소드에서 전부 진행하게 할것입니다.
Configuration
를 붙여 스프링 컨테이너에게 구성정보를 갖고있다고 알려줘야합니다.@Bean
어노테이션을 통해 스프링 컨테이너에게 Bean
이라는 정보를 알려줍니다.@Configuration // 구성 정보를 가지고 있는 클래스라는것을 알림
public class HellobootApplication {
// 스프링 컨테이너에게 필요한 의존 오브젝트를 파라미터로 받아옵니다.
@Bean
public HelloController helloController(HelloService helloService){
return new HelloController(helloService);
}
@Bean
public HelloService helloService(){
return new SimpleHelloService();
}
팩토리 메소드
에서는 return type을 인터페이스
로 하는게 좋습니다.
Bean
을 주입받는 쪽에서 생성자로 어떤 타입을 받을지 결정하는게 좋습니다.
스프링 컨테이너
는 클래스에Configuration
가 붙어있고@Bean
이 붙어있는 것을 찾아Bean
으로 등록합니다.
가장 중요한 것은
Configuration
이 붙은 클래스가AnnotationConfigWebApplicationContext
에 처음으로 등록된다는 것입니다.
@Configuration // 구성 정보를 가지고 있는 클래스라는것을 알림
public class HellobootApplication {
// 스프링 컨테이너에게 필요한 의존 오브젝트를 파라미터로 받아옵니다.
@Bean
public HelloController helloController(HelloService helloService){
return new HelloController(helloService);
}
@Bean
public HelloService helloService(){
return new SimpleHelloService();
}
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을 만드는 명령어
}
}