서블릿 컨테이너와 스프링컨테이너

Sol's·2023년 5월 24일
0

앞에서는 서블릿 컨테이너에 직접 hello라는 서블릿 객체를 넣어서 로직을처리했습니다.
이번에는 Spring ContainerSpring Container에 HelloController를 주입하고,
주입된 HelloController를 주입받아 사용해 보겠습니다.

Spring Container를사용하는 이유

  1. 서블릿 컨테이너에서는 HellowController가 어떻게 만들어졌는지 신경쓰지 않고,
    필요할때 그냥 주입받아서 사용할 수 있습니다.

  2. 싱글톤
    Spring Container에 Bean으로 등록이 된다면 Heap 영역에 객체를 딱 한번만 생성하기 때문에 효율적입니다.

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

Spring Container 만들기

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();
    }

}
  1. 스프링 컨테이너를 만들고
GenericApplicationContext applicationContext = new GenericApplicationContext(); // 스프링 컨테이너 생성
  1. 오브젝트와 메타정보를 넣고
applicationContext.registerBean(HelloController.class); // 메타정보를 넣어 Bean을 생성
        applicationContext.refresh(); // Bean을 만드는 명령어
  1. 서블릿 컨테이너에서 생성된 Bean을 불러와 컨트롤러를 사용했습니다.
// 컨트롤러 클래스를 사용하기
                        HelloController helloController = applicationContext.getBean(HelloController.class);
                        String ret = helloController.hello(name); // 생략
profile
배우고, 생각하고, 행동해라

0개의 댓글