공통로직을 FrontController(서블릿 역할)로 처리하고 하나의 서블릿으로 Cilent와 소통
요청을 FrontController에서 전부 받기때문에
맨 앞에서공통로직(인증, 중복코드, 보안)
등을 처리하고
맨 뒤에서공통로직
을 다듬어 반환합니다.
스프링에서는 DispatcherServlet
이 FrontController로 구현되어 있습니다.
public static void main(String[] args) {
ServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
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");
resp.setStatus(HttpStatus.OK.value()); // 상태코드
resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE); // 타입
resp.getWriter().print("Hello Servlet" + name); // 바디
} else if (req.getRequestURI().equals("/user")) {
// 로직처리
} else {
resp.setStatus(HttpStatus.NOT_FOUND.value());
}
}
}).addMapping("/*"); // 모든 요청을 다 받는다.
});
webServer.start();
}
FrontController 패턴으로 모든요청을 받아 공통로직을 처리하였습니다.
.addMapping("/*")
으로 모든 요청을 받아 내부에서 URI
에 따라 분배 할 수 있습니다.
"/hello"
엔드포인트만 처리하였지만, 클래스를 분리하여 더 만들 수 있습니다.
이제 컨트롤러를 구현해서 사용해 보겠습니다.
public class HelloController {
public String hello(String name){
return "Hello " + name;
}
}
서블릿을 주입할때 HelloController
를 생성하고 그 안에서 직접 사용하였습니다.
public static void main(String[] args) {
ServletWebServerFactory 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 {
// 인증, 보안, 다국어, 공통기능 처리
// url 요청 처리
if (req.getRequestURI().equals("/hello") && req.getMethod().equals(HttpMethod.GET.name())) {
String name = req.getParameter("name");
// 컨트롤러 클래스를 사용하기
String ret = helloController.hello(name);
resp.setStatus(HttpStatus.OK.value()); // 상태코드
resp.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN_VALUE); // 타입
resp.getWriter().print(ret); // 바디
} else if (req.getRequestURI().equals("/user")) {
// 로직처리
} else {
resp.setStatus(HttpStatus.NOT_FOUND.value());
}
}
}).addMapping("/*"); // 모든 요청을 다 받는다.
});
webServer.start();
}
역시 동작이 잘 되고있습니다!
역시나 스프링 부트의 위대함을 느꼈습니다...