스프링 컨테이너가 사용하는 구성정보
우리가 만든 코드를 어떻게 오브젝트로 만들어서
컨테이너 내에 컴포넌트로 등록해두고
스프링 컨테이너 안에 들어있는 빈이라고 불리는 오브젝트가
또다른 오브젝트를 사용한다면 (의존한다면)
이 관게를 어떻게 맺어줄 것인가
어느시점에 오브젝트를 주입시켜 줄 것인가
이런 정보를 스프링 컨테이너에
구성정보로 제공해줘야한다.
구성정보로 제공하는 방법은 여러가지고 있는데
외부 설정 파일을 이용하는 방법도 있지만
쉽고 간결한 방법중 하나인
독특한 방법이 잇는데
이번시간에 사용해볼 것이다.
factory method를 사용해 보는 것이다.
팩토리 메서드는 오브젝트를 생성하는 로직을 담고 있는 것이다.
팩토리 메서드에서 빈 오브젝트를 생성하고
의존관계 주입하고
리턴하는 오브젝트를
스프링 컨테이너에
빈으로 등록해서
이후에 사용하면 된다고 알려주면 된다.
앞에서 서블릿 컨테이너하고 비교할때
스프링 컨테이너는 서블릿 등록하는 것처럼
서블릿 오브젝트를 직접 만들어서 넣어줄 필요가 없다고 했는데
왜 여기서는 직접 만들어서 넣어주려고 할까요
일반적으로 이 방식을 계속 사용할 필요는 없다.
정말 필요가 있을때 사용하는 것인데
어떤 경우에는 빈 오브젝트를 만들고
초기화 하는 작업이 복잡한 경우가 있는데
복잡한 설정 정보로 나열하는 대신에
자바 코드로 만들면 간결하고 슁ㅂ다.
어떤 경우에 활용하면 좋을지
설명해 줄텐데
일단 사용해보자.
package com.example.tobyboot;
import com.example.tobyboot.toby.HelloController;
import com.example.tobyboot.toby.HelloService;
import com.example.tobyboot.toby.SimpleHelloService;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
@Configuration
public class TobybootApplication {
@Bean
public HelloController helloController(HelloService helloService) {
return new HelloController(helloService);
}
@Bean
public HelloService helloService() {
return new SimpleHelloService();
}
public static void main(String[] args) {
// spring container 만드는 작업
// 익명 클래스
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext() {
@Override
protected void onRefresh() {
// 생략 하면 안됨.
super.onRefresh();
// 서블릿 컨테이너를 초기화하는 코드
TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
// servlet container를 코드로 실행하면서 servlet을 등록하는 작업
WebServer webServer = serverFactory.getWebServer(servletContext -> {
servletContext.addServlet("dispatcherServlet",
new DispatcherServlet(this))
.addMapping("/*");
});
// 톰캣 서블릿 컨테이너가 동작한다.
webServer.start();
}
};
// bean 등록
applicationContext.register(TobybootApplication.class);
// 초기화 작업
applicationContext.refresh();
System.out.println("Hello containerless Standalone Application");
}
}
'강의 > 토비의 스프링부트' 카테고리의 다른 글
테스트 코드 (0) | 2023.02.22 |
---|---|
Bean의 생명주기 메소 (0) | 2023.02.21 |
di 적용 (0) | 2023.02.20 |
Dependency injection (0) | 2023.02.20 |
프론트 컨트롤러 // 스프링 컨테이너 (0) | 2023.02.20 |