독립 실행형 Servlet 기본원리

떡ol·2023년 4월 4일
0

우리는 보통 웹서버를 구축하는 일을 Spring boot를 통해서 간단하게 구축합니다.
Spring boot를 통해 Container를 설정하고 만드는일을 건너띄고 순수하게 웹 어플리게이션에 집중해서 개발할 수 있게 도와줍니다. 때문에 그 내부에 어떤식으로 동작하는지 알 필요가 없습니다.
앞으로도 알 필요는 없겠다만 한번은 알아두면 좋을 것같아서 Spring을 공부할 때처럼 기록으로 남길려고 합니다.

인프런 토비선생님의 스프링부트 강의내용을 옮긴 글입니다.

Container란 Web Component가 모여있는 것을 말합니다. 동적인 다양한 컨텐츠를 제공하는데 의미가 있습니다.


위에 그림과 같이 가운데 Servlet Container에는 xml, classloader, war 등등 Spring에서 설정해봤던 익숙한 Component로 구성되어 있습니다. 초기 Java Web Server를 구축할때는 이러한 Component들을 하나하나씩 추가하고 설정해야했습니다.

학습에 앞서 Spring boot 프로젝트를 하나 만들어봅니다. 해당 프로젝트의 Application은 다음과 같이 정의되어있습니다.

public class PracticeApplication {

public static void main(String[] args) {
	SpringApplication.run(PracticeApplication.class, args);
}

이 부분을 다음과 같이 수정해봅니다.

public class PracticeApplication {

public static void main(String[] args) {
	// 서버를 셋팅해주는 매서드를 설정합니다. tomcat 및 다양한 webServer들은 java 내장 라이브러리에 들어가있어 실행 가능합니다.
	TomcatServletWebServerFactory server= new TomcatServletWebServerFactory();
	WebServer webServer = server.getWebServer(servletContext -> {
		HelloController helloController = new HelloController();
		//기본 서블릿이 등록되는 과정 우리는 이러한 과정을 스프링을 통해 편리하게 이용하고 있었다.
		/*
		servletContext.addServlet("hello", new HttpServlet() {
			@Override
			protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
				String name = req.getParameter("name");
				resp.setStatus(HttpStatus.OK.value());
				resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
				resp.getWriter().println("Hello Servlet"+name);
			}
		}).addMapping("/hello");
		*/
		// 해당부분은 더 나아가 frontController라 명하고 url 맵핑 및 특정 유저 객체에 기능을 인계가능합니다.
		servletContext.addServlet("frontController", new HttpServlet() {
			@Override
			protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
				if(req.getRequestURI().equals("/index") && req.getMethod().equals(HttpMethod.GET.name())){
					resp.setStatus(HttpStatus.OK.value());
					resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
					resp.getWriter().println("index");
				}else if(req.getRequestURI().equals("/user")){
					resp.getWriter().println("user");
				}else if(req.getRequestURI().equals("/hello")){
					String result = helloController.hello("i'm Balenciaga ");

					resp.setStatus(HttpStatus.OK.value());
					resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
					resp.getWriter().println(result);
				}else{
					resp.setStatus(HttpStatus.NOT_FOUND.value());
				}
			}
		}).addMapping("/*");
	});
	webServer.start();
}

}

크게 설정할 부분은 없어 보입니다. 한번 해보고 다음에는 안 쓸 것들이긴 합니다. 그래도 초기에는 이런식으로 웹서버를 구축하고 개발했다 정도만 알고 가면 좋을거 같습니다.
다음 포스팅에서는 Spring에 기본 원리를 알아가겠습니다.

profile
하이

0개의 댓글