지난 시간에는 ServletContext 에 서블릿을 등록하고 특정 URL을 가진 요청이 도착하면 응답을 만들어 리턴하는 것을 해보았다. 이 코드를 조금 다듬어볼 생각.

코드에서 이렇게 String 을 하드코딩해서 넣는 건 오타의 위험성이 있다. 그래서 이런 건 스프링에서 미리 등록해놓은 Enum 들을 활용하면 편리하다. HttpHeaders 라는 Enum 안에 들어가면 Content-Type 이라는 상수로 정의되어있다. text/plain 또한 많이 사용하는 것이라 MediaType 에 정의되어있다. 상태쪽도 HttpStatus 에 들어가있다. HttpStatus.OK 는 Enum 값이고 200이란 숫자는 value 를 호출해 넘겨받으면 된다.

이건 서블릿에서뿐만 아니라 우리가 Http Response를 직접 관리하는 그런 Spring MVC Application 에서도 얼마든지 사용할 수 있다.

public class HellobootApplication {
	public static void main(String[] args) {
		ServletWebServerFactory = new TomcatServletWebServerFactory();
		WebServer webServer = serverFactory.getWebServer(servletContext -> {
				servletContext.addServlet("hello", new HttpServlet() {
					@Override
					protected void service(HttpSrvletRequest req, HttpServletResponse res) throws ServletException, IOException {
						res.setStatus(HttpStatus.OK.value());
						res.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
						res.getWriter().println("Hello Servlet");
					}
			}).addMapping("/hello");
		
		});
			webServer.start();
	} 
}

우리가 서블릿을 만들긴 했는데 응답 부분만 다뤘다.

요청으로 들어오는 건 어떻게 Control 할 수 있을까? 요청 중 URL 부분은 어느 서블릿을 사용할지 매핑하는데 이미 사용되었고 그거 말고 처음 만들었던 예제처럼 우리가 처음 스프링 부트로 만들었던 예제에서처럼 QueryString 에 name 이라는 파라미터를 전달받아 거기에 대한 동적인 응답을 만들어내는 코드를 작성해볼 것.

파라미터로 넘어오는 것은 HttpServletRequest 타입의 getParameter 메소드를 이용하면 된다. 그래서 name 이라는 이름의 파라미터가 있으면 그 값을 돌려달라는 의미로 name 을 받고 이렇게 받은 거를 hello 뒤에 붙여서 리턴하는데 사용하면 요청을 받아 이 요청을 가지고 응답을 생성하는데 사용하는 코드까지 완료할 수 있다.

public class HellobootApplication {
	public static void main(String[] args) {
		ServletWebServerFactory = new TomcatServletWebServerFactory();
		WebServer webServer = serverFactory.getWebServer(servletContext -> {
				servletContext.addServlet("hello", new HttpServlet() {
					@Override
					protected void service(HttpSrvletRequest req, HttpServletResponse res) throws ServletException, IOException {
						String name = req.getParameter("name");
						
						res.setStatus(HttpStatus.OK.value());
						res.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
						res.getWriter().println("Hello" + name);
					}
			}).addMapping("/hello");
		
		});
			webServer.start();
	} 
}