#1. 스프링 컨테이너 사용

Untitled

public class HellobootApplication {

	public static void main(String[] args) {

		//스프링 컨테이너 생성 : ApplicationContext
		GenericApplicationContext applicationContext = new GenericApplicationContext();
		applicationContext.registerBean(HelloController.class); // 어떤 클래스를 이용하여 Bean Object를 만들어 줄 것인가를 지정
		applicationContext.refresh(); // Container 초기화 -> Bean Object를 생성

		//서블릿 컨테이너 생성
		TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
		WebServer webServer = serverFactory.getWebServer(servletContext -> {
//			HelloController helloController = new HelloController();

			servletContext.addServlet("frontcontroller", new HttpServlet() { //어댑터 클래스
				@Override
				protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //서블릿의 실제 기능 구현
					//인증, 보안, 다국어 처리 등 공통 기능
					if (req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())){
						String name = req.getParameter("name");

						//Binding: 웹 요청을 가지고 처리하는 로직 코드에서 사용할 수 있도록 새로운 타입으로 변환하는 것
						HelloController helloController = applicationContext.getBean(HelloController.class);
						String ret = helloController.hello(name);

//						resp.setStatus(HttpStatus.OK.value()); //status(200)
						resp.setContentType(MediaType.TEXT_PLAIN_VALUE); //"Content-Type", "text/plain"
						resp.getWriter().println(ret) ;
					} else{
						resp.setStatus(HttpStatus.NOT_FOUND.value());
					}
				}
				//서블릿 컨테이너에서 어떤 서블릿을 사용해야할 지 정하는 Mapping을 설정해야 함.
			}).addMapping("/*"); //모든 요청을 해당 서블릿이 처리
		});
		webServer.start(); //Tomcat Start
	}
}

#2. 의존 오브젝트 추가

위와 같이 작성했을 때, Front Container가 직접 new 키워드를 사용하여 Object를 만들어 쓰는것과 차이가 무엇일까? → Spring Container가 고정적으로 할 수 있는 일들을 이후에 적용 가능하도록 기본 구조를 짜놓는다는 것

[실습]

“SimpleHelloService”

public class SimpleHelloService {

    String sayHello(String name) {

        return "Hello " + name;
    }
}

“HelloController”

import java.util.Objects;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(String name){

        // Object 생성
        SimpleHelloService helloService = new SimpleHelloService();

        // Null 여부 체크
        // null -> exception
        return helloService.sayHello(Objects.requireNonNull(name));
    }
}