자바코드 구성 정보 사용하기(Factory Method)

Sol's·2023년 5월 25일
0

스프링 컨테이너를 사용하기 위해 스프링 컨테이너가 사용하는 구성정보 (클래스) 를 제공해야합니다.

즉, 우리가 만든 코드를 어떻게 Object로 만들어서 스프링 컨테이너에 컴포넌트로 등록해 두고
스프링 컨테이너안에 Bean(Object)이 또다른 Bean(Object)를 의존(사용)한다면
관계를 어떻게 맺어줄 것인지, 어느 시점에 관계를 주입해 줄것인지 알아보겠습니다.

Factory Method

팩토리 메소드는 어떤 오브젝트를 생성하는 로직을 담당하는 메소드입니다.
Bean오브젝트를 펙토리 메소드에서 전부 진행하게 할것입니다.

  1. 클래스에 Configuration를 붙여 스프링 컨테이너에게 구성정보를 갖고있다고 알려줘야합니다.
  2. @Bean 어노테이션을 통해 스프링 컨테이너에게 Bean이라는 정보를 알려줍니다.
  3. 필요한 의존 오브젝트는 스프링 컨테이너에게 파라미터로 받아옵니다.
@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

가장 중요한 것은 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을 만드는 명령어
    }

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

0개의 댓글