Hello 컨트롤러 매핑과 바인딩
맵핑은 웹 요청에 들어있는 정보를 활용해서 어떤 로직을 수행하는 코드를 호출할 것인가 결정하는 작업이다. /hello 요청이 들어오면 helloController에 hello메소드를 호출해서 로직을 수행하고 그 결과를 리턴하게 한다.
바인딩은 헬로 컨트롤러는 웹 요청이나 웹 응답을 직접 노출하는 기술적인 타입을 사용하지 않았습니다. 컨트롤러를 구현한다 하더라도 직접적으로 웹 요청과 응답을 다루는 오브젝트를 사용하지 않습니다. 따라서 파라미터로 넘어온 name값을 String 타입으로 hello 메소드를 호출할 때 인자값으로 넘겨주는 작업을 바인딩이라고 합니다. form을 통해서 굉장히 많은 정보들이 넘어왔을때 dto등을 java bean 형태의 오브젝트를 만들어서 그 안에 데이터를 집어넣어서 처리하는 오브젝트에 파라미터를 넘겨주는 작업들을 바인딩이라고 합니다.
웹 MVC에서 이야기하는 바인딩은 훨씬 복잡하고 많은 지식이 필요한 부분이지만 우리가 직접 구현해본 프론트 컨트롤러에서의 매핑 파라미터를 HelloControlle hello 메소드로 전달하는 바인딩 처럼 기본적인 원리는 같습니다.
package com.tobyspring.tobyspringboot;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import jdk.jfr.ContentType;
public class TobyspringbootApplication {
public static void main(String[] args) {
/*
Spring Boot에서 Tomcat Sublet 컨테이너를 내장해서 프로그앰에서 코드로
쉽게 사용할 수 있도록 제공하는 클래스 TomcatServletWebServerFactory
*/
TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
/*
웹서버 서블릿 컨테이너를 생성하는 함수 serverFactory.getWebServer()
리턴타입이 디폴트로 설정한 Tomcat이라는 명칭은 사라지고 WebServer명칭으로 된이유는
스프링 부트가 톰캣 외에 제티나 언더토우같은 다양한 서블릿 컨테이너를 지원할 수 있고
지원하되 일관된 방식으로 사용할 수 있도록 동작하게할 수 있도록 추상화 해놨기 때문이다.
*/
WebServer webServer = serverFactory.getWebServer(new ServletContextInitializer() {
// /hello 경로에 대한 요청을 처리할 수 있는 객체를 구현
HelloController helloController = new HelloController();
/*
serverFactory를 통해서 서블릿 컨테이너가 생성되었다면 서블릿 컨테이너에
서블릿을 등록한다. 서블릿을 등록하는건 webserver생성시 ServletContextInitializer을
구현하는 객체를 매개변수로 전달하면 된다.
*/
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addServlet("frontController", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 인증, 보안, 다국어처리, 공통 기능 등등 구현을 여기서 한다.
// 현재 접근하는 경로가 /hello인지 확인한다.
// 현재 요청 메소드가 GET인지 확인한다.
if (req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())) {
// 파라미터를 전달받는데 name으로 선언된 파라미터를 추출한다.
String name = req.getParameter("name");
// 요청을 처리할 객체에로 파라미터를 전달한다.
String ret = helloController.hello(name);
// 응답코드 설정
resp.setStatus(HttpStatus.OK.value());
// 헤더에 Content Type 명시
resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE);
// Content Type과 일치하는 응답값 바디를 입력
resp.getWriter().println(ret);
} else if(req.getRequestURI().equals("/user")) {
//
} else {
resp.setStatus(HttpStatus.NOT_FOUND.value());
}
}
// / 모든 요청에대해 처리하기 위해 모든 경로에 해당하는 정규표현식 경로 설정
}).addMapping("/*");
}
});
/*
Servlet 컨테이너 동작 함수
*/
webServer.start();
}
}
'Spring > 인프런 토비의 Spring Boot' 카테고리의 다른 글
섹션 4-2 [독립 실행형 스프링 애플리케이션] 의존 오브젝트 추가 (0) | 2024.06.01 |
---|---|
섹션 4-1 [독립 실행형 스프링 애플리케이션] 스프링 컨테이너 사용 (0) | 2024.06.01 |
섹션 3-6 [독립 실행형 서블릿 애플리케이션] 프론트 컨트롤러 전환 (0) | 2024.05.30 |
섹션 3-5 [독립 실행형 서블릿 애플리케이션] 프론트 컨트롤러 (0) | 2024.05.30 |
섹션 3-4 [독립 실행형 서블릿 애플리케이션] 서블릿 요청 처리 (0) | 2024.05.30 |