앞에서는 서블릿 컨테이너에 직접 hello라는 서블릿 객체를 넣어서 로직을처리했습니다.
이번에는 Spring Container를 Spring Container에 HelloController를 주입하고,
주입된 HelloController를 주입받아 사용해 보겠습니다.
서블릿 컨테이너에서는 HellowController가 어떻게 만들어졌는지 신경쓰지 않고,
필요할때 그냥 주입받아서 사용할 수 있습니다.
싱글톤
Spring Container에 Bean으로 등록이 된다면 Heap 영역에 객체를 딱 한번만 생성하기 때문에 효율적입니다.

스프링 컨테이너는 Business Objects와 Configuration Metadata를 조합해 Bean을 만들어 서버 애플리케이션으로 만들어 줍니다.

package tobyspring.helloboot;
import org.apache.catalina.startup.Tomcat;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServer;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HellobootApplication {
public static void main(String[] args) {
GenericApplicationContext applicationContext = new GenericApplicationContext(); // 스프링 컨테이너 생성
applicationContext.registerBean(HelloController.class); // 메타정보를 넣어 Bean을 생성
applicationContext.refresh(); // Bean을 만드는 명령어
// 서블릿 펙토리 : 서블릿 컨테이너를 만드는 것을 쉽게 도와줍니다.
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
// serverFactory.getWebServer : 서블릿 컨테이너 생성하는 메소드입니다.
// 따라서 webServer 가 서블릿 컨테이너 입니다.
WebServer webServer = serverFactory.getWebServer(servletContext -> {
servletContext.addServlet("frontcontroller", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 인증, 보안, 다국어, 공통기능 처리
// url 요청 처리
if (req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())) {
String name = req.getParameter("name");
// 컨트롤러 클래스를 사용하기
HelloController helloController = applicationContext.getBean(HelloController.class);
String ret = helloController.hello(name); // 생략
resp.setContentType(MediaType.TEXT_PLAIN_VALUE); // 타입
resp.getWriter().print(ret); // 바디
}
else {
resp.setStatus(HttpStatus.NOT_FOUND.value());
}
}
}).addMapping("/*"); // 모든 요청을 다 받는다.
});
webServer.start();
}
}
GenericApplicationContext applicationContext = new GenericApplicationContext(); // 스프링 컨테이너 생성
applicationContext.registerBean(HelloController.class); // 메타정보를 넣어 Bean을 생성
applicationContext.refresh(); // Bean을 만드는 명령어
Bean을 불러와 컨트롤러를 사용했습니다.// 컨트롤러 클래스를 사용하기
HelloController helloController = applicationContext.getBean(HelloController.class);
String ret = helloController.hello(name); // 생략