From a63c0b4b5f088201b76f79761a23b9b594e3e3ff Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 15:23:02 +0900 Subject: [PATCH 01/34] =?UTF-8?q?refactor:=20controllers=20=EB=B6=88?= =?UTF-8?q?=EB=B3=80=20=EB=A7=B5=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java index be311f3970..2f97d4fad4 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java @@ -2,6 +2,7 @@ import com.interface21.context.stereotype.Controller; import com.interface21.webmvc.servlet.exception.ControllerScanException; +import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -33,6 +34,6 @@ private void addController(Class annotatedControllerType) { } public Map, Object> getControllers() { - return controllers; + return Collections.unmodifiableMap(controllers); } } From 72d2c84aaa9348f4660d52205bf38008e39fd3db Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 15:27:51 +0900 Subject: [PATCH 02/34] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20ConcurrentMap=20HashMap=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webmvc/servlet/mvc/tobe/ControllerScanner.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java index 2f97d4fad4..e39b4eba33 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java @@ -3,15 +3,15 @@ import com.interface21.context.stereotype.Controller; import com.interface21.webmvc.servlet.exception.ControllerScanException; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import org.reflections.Reflections; public class ControllerScanner { private final Object[] basePackage; - private final Map, Object> controllers = new ConcurrentHashMap(); + private final Map, Object> controllers = new HashMap<>(); public ControllerScanner(Object... basePackage) { this.basePackage = basePackage; From a7b85bfb9c07077eb7c8a45ecd7cc90e7896cd8f Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 16:05:47 +0900 Subject: [PATCH 03/34] =?UTF-8?q?refactor:=20=EC=9D=98=EB=AF=B8=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=EC=83=81=EC=88=98=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20inline=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webmvc/servlet/mvc/tobe/ControllerScanner.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java index e39b4eba33..3e0406d53f 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScanner.java @@ -2,26 +2,28 @@ import com.interface21.context.stereotype.Controller; import com.interface21.webmvc.servlet.exception.ControllerScanException; +import java.lang.annotation.Annotation; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Set; import org.reflections.Reflections; public class ControllerScanner { + private static final Class CONTROLLER_ANNOTATION = Controller.class; + private final Object[] basePackage; private final Map, Object> controllers = new HashMap<>(); public ControllerScanner(Object... basePackage) { this.basePackage = basePackage; - scanControllers(); + scanController(); } - private void scanControllers() { + private void scanController() { Reflections reflections = new Reflections(basePackage); - Set> annotatedControllerTypes = reflections.getTypesAnnotatedWith(Controller.class); - annotatedControllerTypes.forEach(this::addController); + reflections.getTypesAnnotatedWith(CONTROLLER_ANNOTATION) + .forEach(this::addController); } private void addController(Class annotatedControllerType) { From b88810f85475dc4857136aab43a2debf5a9aba31 Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 16:09:09 +0900 Subject: [PATCH 04/34] =?UTF-8?q?feat:=20HandlerMapping=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98=20=EB=B0=8F=20AnnotationHandlerMapping=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=83=80=EC=9E=85=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java | 6 +++--- .../webmvc/servlet/mvc/tobe/HandlerMapping.java | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMapping.java diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java index 275716bbe4..d82bd05ec0 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java @@ -12,7 +12,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AnnotationHandlerMapping { +public class AnnotationHandlerMapping implements HandlerMapping { private static final Logger log = LoggerFactory.getLogger(AnnotationHandlerMapping.class); @@ -24,7 +24,7 @@ public AnnotationHandlerMapping(ControllerScanner controllerScanner) { this.controllerScanner = controllerScanner; } - + @Override public Object getHandler(final HttpServletRequest request) { String requestURI = request.getRequestURI(); RequestMethod method = RequestMethod.valueOf(request.getMethod()); @@ -56,7 +56,7 @@ private void addHandler(final Method method, final Object controllerInstance) { private List createHandlerKeys(final Method method) { RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); - + return Arrays.stream(getMappingMethods(requestMapping)) .map(requestMethod -> new HandlerKey(requestMapping.value(), requestMethod)) .toList(); diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMapping.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMapping.java new file mode 100644 index 0000000000..4713216ac3 --- /dev/null +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMapping.java @@ -0,0 +1,8 @@ +package com.interface21.webmvc.servlet.mvc.tobe; + +import jakarta.servlet.http.HttpServletRequest; + +public interface HandlerMapping { + + Object getHandler(HttpServletRequest request); +} From 396230b4e179948f9ab2f6e7c419cdfcd1fa808f Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 16:19:49 +0900 Subject: [PATCH 05/34] =?UTF-8?q?feat:=20ManualHandlerMapping=EC=9D=B4=20H?= =?UTF-8?q?andlerMapping=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20=EA=B5=AC=ED=98=84=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/DispatcherServlet.java | 2 +- .../com/techcourse/ManualHandlerMapping.java | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index b0aff7e654..6a06ca6db5 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -32,7 +32,7 @@ protected void service(final HttpServletRequest request, final HttpServletRespon log.debug("Method : {}, Request URI : {}", request.getMethod(), requestURI); try { - final var controller = manualHandlerMapping.getHandler(requestURI); + final var controller = manualHandlerMapping.getHandler(request); final var viewName = controller.execute(request, response); final var jspView = new JspView(viewName); diff --git a/app/src/main/java/com/techcourse/ManualHandlerMapping.java b/app/src/main/java/com/techcourse/ManualHandlerMapping.java index 2116056394..2c57290530 100644 --- a/app/src/main/java/com/techcourse/ManualHandlerMapping.java +++ b/app/src/main/java/com/techcourse/ManualHandlerMapping.java @@ -1,15 +1,20 @@ package com.techcourse; -import com.techcourse.controller.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.interface21.webmvc.servlet.mvc.asis.Controller; import com.interface21.webmvc.servlet.mvc.asis.ForwardController; - +import com.interface21.webmvc.servlet.mvc.tobe.HandlerMapping; +import com.techcourse.controller.LoginController; +import com.techcourse.controller.LoginViewController; +import com.techcourse.controller.LogoutController; +import com.techcourse.controller.RegisterController; +import com.techcourse.controller.RegisterViewController; +import jakarta.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class ManualHandlerMapping { +public class ManualHandlerMapping implements HandlerMapping { private static final Logger log = LoggerFactory.getLogger(ManualHandlerMapping.class); @@ -28,8 +33,9 @@ public void initialize() { .forEach(path -> log.info("Path : {}, Controller : {}", path, controllers.get(path).getClass())); } - public Controller getHandler(final String requestURI) { - log.debug("Request Mapping Uri : {}", requestURI); - return controllers.get(requestURI); + @Override + public Controller getHandler(final HttpServletRequest request) { + log.debug("Request Mapping Uri : {}", request.getRequestURI()); + return controllers.get(request.getRequestURI()); } } From 7afb900bfe412c392e14f7aa496b968b5c63d1a3 Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 16:21:28 +0900 Subject: [PATCH 06/34] =?UTF-8?q?feat:=20HandlerMappingRegistry=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mvc/tobe/HandlerMappingRegistry.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMappingRegistry.java diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMappingRegistry.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMappingRegistry.java new file mode 100644 index 0000000000..7c258a5019 --- /dev/null +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMappingRegistry.java @@ -0,0 +1,22 @@ +package com.interface21.webmvc.servlet.mvc.tobe; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class HandlerMappingRegistry { + + private final List handlerMappings = new ArrayList<>(); + + public void addHandlerMapping(HandlerMapping handlerMapping) { + handlerMappings.add(handlerMapping); + } + + public Optional getHandler(HttpServletRequest httpServletRequest) { + return handlerMappings.stream() + .filter(hm -> hm.getHandler(httpServletRequest) != null) + .map(hm -> hm.getHandler(httpServletRequest)) + .findFirst(); + } +} From cfb38ea9a7fc316c6e13621a0e914a79e0cb9ecd Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 16:59:37 +0900 Subject: [PATCH 07/34] =?UTF-8?q?feat:=20DispatcherServlet=EC=9D=B4=20?= =?UTF-8?q?=EB=B3=B5=EC=88=98=EC=9D=98=20HandlerMapping=EC=9D=84=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/DispatcherServlet.java | 36 ++++++++++++++----- .../webmvc/servlet/ModelAndView.java | 10 ++++++ 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index 6a06ca6db5..d8efe174b9 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -1,11 +1,18 @@ package com.techcourse; +import com.interface21.webmvc.servlet.ModelAndView; +import com.interface21.webmvc.servlet.mvc.asis.Controller; +import com.interface21.webmvc.servlet.mvc.tobe.AnnotationHandlerMapping; +import com.interface21.webmvc.servlet.mvc.tobe.ControllerScanner; +import com.interface21.webmvc.servlet.mvc.tobe.HandlerExecution; +import com.interface21.webmvc.servlet.mvc.tobe.HandlerMappingRegistry; import com.interface21.webmvc.servlet.view.JspView; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.util.HashMap; +import java.util.NoSuchElementException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,29 +21,42 @@ public class DispatcherServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(DispatcherServlet.class); - private ManualHandlerMapping manualHandlerMapping; + private HandlerMappingRegistry handlerMappingRegistry = new HandlerMappingRegistry(); public DispatcherServlet() { } @Override public void init() { - manualHandlerMapping = new ManualHandlerMapping(); + ManualHandlerMapping manualHandlerMapping = new ManualHandlerMapping(); + AnnotationHandlerMapping annotationHandlerMapping = new AnnotationHandlerMapping(new ControllerScanner()); + manualHandlerMapping.initialize(); + annotationHandlerMapping.initialize(); + + handlerMappingRegistry.addHandlerMapping(manualHandlerMapping); + handlerMappingRegistry.addHandlerMapping(annotationHandlerMapping); } @Override protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException { - final String requestURI = request.getRequestURI(); - log.debug("Method : {}, Request URI : {}", request.getMethod(), requestURI); + log.debug("Method : {}, Request URI : {}", request.getMethod(), request.getRequestURI()); try { - final var controller = manualHandlerMapping.getHandler(request); - final var viewName = controller.execute(request, response); - final var jspView = new JspView(viewName); + final var handler = handlerMappingRegistry.getHandler(request) + .orElseThrow(() -> new NoSuchElementException("요청을 처리 할 수 있는 핸들러를 조회하지 못했습니다")); + + if (handler instanceof Controller) { + final var viewName = ((Controller) handler).execute(request, response); + final var jspView = new JspView(viewName); + jspView.render(new HashMap<>(), request, response); + } + if (handler instanceof HandlerExecution) { + ModelAndView mav = ((HandlerExecution) handler).handle(request, response); + mav.render(request, response); + } - jspView.render(new HashMap<>(), request, response); } catch (Throwable e) { log.error("Exception : {}", e.getMessage(), e); throw new ServletException(e.getMessage()); diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java b/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java index d5a3eadeac..533e2813c3 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java @@ -1,5 +1,7 @@ package com.interface21.webmvc.servlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -30,4 +32,12 @@ public Map getModel() { public View getView() { return view; } + + public void render(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { + try { + view.render(model, httpServletRequest, httpServletResponse); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } From 9c2d0ca7501f540f618e95c656ae3c21fa7303ec Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 17:06:17 +0900 Subject: [PATCH 08/34] =?UTF-8?q?feat:=20HandlerAdapter=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webmvc/servlet/mvc/tobe/HandlerAdapter.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapter.java diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapter.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapter.java new file mode 100644 index 0000000000..ed70cb0508 --- /dev/null +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapter.java @@ -0,0 +1,12 @@ +package com.interface21.webmvc.servlet.mvc.tobe; + +import com.interface21.webmvc.servlet.ModelAndView; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +public interface HandlerAdapter { + + boolean supports(Object handler); + + ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; +} From a45941ed029f280a4a5d4528e56ecd83e07164c8 Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 17:10:00 +0900 Subject: [PATCH 09/34] =?UTF-8?q?feat:=20RequestMappingHandlerAdapter=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tobe/RequestMappingHandlerAdapter.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/RequestMappingHandlerAdapter.java diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/RequestMappingHandlerAdapter.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/RequestMappingHandlerAdapter.java new file mode 100644 index 0000000000..8042a96e85 --- /dev/null +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/RequestMappingHandlerAdapter.java @@ -0,0 +1,20 @@ +package com.interface21.webmvc.servlet.mvc.tobe; + +import com.interface21.webmvc.servlet.ModelAndView; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +public class RequestMappingHandlerAdapter implements HandlerAdapter { + + @Override + public boolean supports(Object handler) { + return handler instanceof HandlerExecution; + } + + @Override + public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + HandlerExecution handlerExecution = (HandlerExecution) handler; + return handlerExecution.handle(request, response); + } +} From c00a55e5db0b9838a410de2c2603ffc58ce77c83 Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 17:22:24 +0900 Subject: [PATCH 10/34] =?UTF-8?q?feat:=20ManualHandlerAdapter=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mvc/tobe/ManualHandlerAdapter.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ManualHandlerAdapter.java diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ManualHandlerAdapter.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ManualHandlerAdapter.java new file mode 100644 index 0000000000..8164eeecaa --- /dev/null +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ManualHandlerAdapter.java @@ -0,0 +1,23 @@ +package com.interface21.webmvc.servlet.mvc.tobe; + +import com.interface21.webmvc.servlet.ModelAndView; +import com.interface21.webmvc.servlet.mvc.asis.Controller; +import com.interface21.webmvc.servlet.view.JspView; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +public class ManualHandlerAdapter implements HandlerAdapter { + + @Override + public boolean supports(Object handler) { + return handler instanceof Controller; + } + + @Override + public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + String viewName = ((Controller) handler).execute(request, response); + JspView jspView = new JspView(viewName); + return new ModelAndView(jspView); + } +} From b8723759f62343e1a7fab32ce720b36605f7966d Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 18:45:58 +0900 Subject: [PATCH 11/34] =?UTF-8?q?feat:=20HandlerAdapterRegistry=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mvc/tobe/HandlerAdapterRegistry.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapterRegistry.java diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapterRegistry.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapterRegistry.java new file mode 100644 index 0000000000..59b6162684 --- /dev/null +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapterRegistry.java @@ -0,0 +1,22 @@ +package com.interface21.webmvc.servlet.mvc.tobe; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; + +public class HandlerAdapterRegistry { + + private final List handlerAdapters = new ArrayList<>(); + + public void addHandlerAdapter(HandlerAdapter handlerAdapter) { + handlerAdapters.add(handlerAdapter); + } + + public HandlerAdapter getHandlerAdapter(Object handler) { + return handlerAdapters.stream() + .filter(handlerAdapter -> handlerAdapter.supports(handler)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException("핸들러를 처리할 수 있는 Adapter를 찾지 못했습니다")); + } +} + From e70874719d68b7c13c0990edf142a548234f925c Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 19:16:33 +0900 Subject: [PATCH 12/34] temp: --- .../com/techcourse/DispatcherServlet.java | 39 +++++++------------ .../com/techcourse/ManualHandlerMapping.java | 2 +- .../tobe/{ => adapter}/HandlerAdapter.java | 2 +- .../{ => adapter}/HandlerAdapterRegistry.java | 7 ++-- .../{ => adapter}/ManualHandlerAdapter.java | 2 +- .../RequestMappingHandlerAdapter.java | 3 +- .../AnnotationHandlerMapping.java | 5 ++- .../tobe/{ => mapping}/HandlerMapping.java | 2 +- .../{ => mapping}/HandlerMappingRegistry.java | 9 ++++- .../tobe/AnnotationHandlerMappingTest.java | 1 + 10 files changed, 37 insertions(+), 35 deletions(-) rename mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/{ => adapter}/HandlerAdapter.java (85%) rename mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/{ => adapter}/HandlerAdapterRegistry.java (72%) rename mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/{ => adapter}/ManualHandlerAdapter.java (93%) rename mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/{ => adapter}/RequestMappingHandlerAdapter.java (83%) rename mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/{ => mapping}/AnnotationHandlerMapping.java (92%) rename mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/{ => mapping}/HandlerMapping.java (70%) rename mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/{ => mapping}/HandlerMappingRegistry.java (70%) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index d8efe174b9..88ae4d9210 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -1,17 +1,15 @@ package com.techcourse; import com.interface21.webmvc.servlet.ModelAndView; -import com.interface21.webmvc.servlet.mvc.asis.Controller; -import com.interface21.webmvc.servlet.mvc.tobe.AnnotationHandlerMapping; +import com.interface21.webmvc.servlet.mvc.tobe.mapping.AnnotationHandlerMapping; import com.interface21.webmvc.servlet.mvc.tobe.ControllerScanner; -import com.interface21.webmvc.servlet.mvc.tobe.HandlerExecution; -import com.interface21.webmvc.servlet.mvc.tobe.HandlerMappingRegistry; -import com.interface21.webmvc.servlet.view.JspView; +import com.interface21.webmvc.servlet.mvc.tobe.adapter.HandlerAdapter; +import com.interface21.webmvc.servlet.mvc.tobe.adapter.HandlerAdapterRegistry; +import com.interface21.webmvc.servlet.mvc.tobe.mapping.HandlerMappingRegistry; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.util.HashMap; import java.util.NoSuchElementException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,6 +20,7 @@ public class DispatcherServlet extends HttpServlet { private static final Logger log = LoggerFactory.getLogger(DispatcherServlet.class); private HandlerMappingRegistry handlerMappingRegistry = new HandlerMappingRegistry(); + private HandlerAdapterRegistry handlerAdapterRegistry = new HandlerAdapterRegistry(); public DispatcherServlet() { } @@ -29,37 +28,27 @@ public DispatcherServlet() { @Override public void init() { ManualHandlerMapping manualHandlerMapping = new ManualHandlerMapping(); - AnnotationHandlerMapping annotationHandlerMapping = new AnnotationHandlerMapping(new ControllerScanner()); - manualHandlerMapping.initialize(); - annotationHandlerMapping.initialize(); + handlerMappingRegistry.addHandlerMapping(manualHandlerMapping); handlerMappingRegistry.addHandlerMapping(manualHandlerMapping); handlerMappingRegistry.addHandlerMapping(annotationHandlerMapping); + + handlerAdapterRegistry. } @Override protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException { log.debug("Method : {}, Request URI : {}", request.getMethod(), request.getRequestURI()); - try { - final var handler = handlerMappingRegistry.getHandler(request) + Object handler = handlerMappingRegistry.getHandler(request) .orElseThrow(() -> new NoSuchElementException("요청을 처리 할 수 있는 핸들러를 조회하지 못했습니다")); - - if (handler instanceof Controller) { - final var viewName = ((Controller) handler).execute(request, response); - final var jspView = new JspView(viewName); - jspView.render(new HashMap<>(), request, response); - } - if (handler instanceof HandlerExecution) { - ModelAndView mav = ((HandlerExecution) handler).handle(request, response); - mav.render(request, response); - } - - } catch (Throwable e) { - log.error("Exception : {}", e.getMessage(), e); - throw new ServletException(e.getMessage()); + HandlerAdapter handlerAdapter = handlerAdapterRegistry.getHandlerAdapter(handler); + ModelAndView modelAndView = handlerAdapter.handle(request, response, handler); + modelAndView.render(request, response); + } catch (Exception e) { + throw new RuntimeException(e); } } } diff --git a/app/src/main/java/com/techcourse/ManualHandlerMapping.java b/app/src/main/java/com/techcourse/ManualHandlerMapping.java index 2c57290530..b952316c8b 100644 --- a/app/src/main/java/com/techcourse/ManualHandlerMapping.java +++ b/app/src/main/java/com/techcourse/ManualHandlerMapping.java @@ -2,7 +2,7 @@ import com.interface21.webmvc.servlet.mvc.asis.Controller; import com.interface21.webmvc.servlet.mvc.asis.ForwardController; -import com.interface21.webmvc.servlet.mvc.tobe.HandlerMapping; +import com.interface21.webmvc.servlet.mvc.tobe.mapping.HandlerMapping; import com.techcourse.controller.LoginController; import com.techcourse.controller.LoginViewController; import com.techcourse.controller.LogoutController; diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapter.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapter.java similarity index 85% rename from mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapter.java rename to mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapter.java index ed70cb0508..73143b1a8e 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapter.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapter.java @@ -1,4 +1,4 @@ -package com.interface21.webmvc.servlet.mvc.tobe; +package com.interface21.webmvc.servlet.mvc.tobe.adapter; import com.interface21.webmvc.servlet.ModelAndView; import jakarta.servlet.http.HttpServletRequest; diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapterRegistry.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistry.java similarity index 72% rename from mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapterRegistry.java rename to mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistry.java index 59b6162684..9691ed447a 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerAdapterRegistry.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistry.java @@ -1,4 +1,4 @@ -package com.interface21.webmvc.servlet.mvc.tobe; +package com.interface21.webmvc.servlet.mvc.tobe.adapter; import java.util.ArrayList; import java.util.List; @@ -8,8 +8,9 @@ public class HandlerAdapterRegistry { private final List handlerAdapters = new ArrayList<>(); - public void addHandlerAdapter(HandlerAdapter handlerAdapter) { - handlerAdapters.add(handlerAdapter); + public HandlerAdapterRegistry() { + handlerAdapters.add(new ManualHandlerAdapter()); + handlerAdapters.add(new RequestMappingHandlerAdapter()); } public HandlerAdapter getHandlerAdapter(Object handler) { diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ManualHandlerAdapter.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/ManualHandlerAdapter.java similarity index 93% rename from mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ManualHandlerAdapter.java rename to mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/ManualHandlerAdapter.java index 8164eeecaa..35219b7a6c 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/ManualHandlerAdapter.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/ManualHandlerAdapter.java @@ -1,4 +1,4 @@ -package com.interface21.webmvc.servlet.mvc.tobe; +package com.interface21.webmvc.servlet.mvc.tobe.adapter; import com.interface21.webmvc.servlet.ModelAndView; import com.interface21.webmvc.servlet.mvc.asis.Controller; diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/RequestMappingHandlerAdapter.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/RequestMappingHandlerAdapter.java similarity index 83% rename from mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/RequestMappingHandlerAdapter.java rename to mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/RequestMappingHandlerAdapter.java index 8042a96e85..4e9158e906 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/RequestMappingHandlerAdapter.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/RequestMappingHandlerAdapter.java @@ -1,6 +1,7 @@ -package com.interface21.webmvc.servlet.mvc.tobe; +package com.interface21.webmvc.servlet.mvc.tobe.adapter; import com.interface21.webmvc.servlet.ModelAndView; +import com.interface21.webmvc.servlet.mvc.tobe.HandlerExecution; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/AnnotationHandlerMapping.java similarity index 92% rename from mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java rename to mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/AnnotationHandlerMapping.java index d82bd05ec0..2b563fea08 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/AnnotationHandlerMapping.java @@ -1,8 +1,11 @@ -package com.interface21.webmvc.servlet.mvc.tobe; +package com.interface21.webmvc.servlet.mvc.tobe.mapping; import com.interface21.web.bind.annotation.RequestMapping; import com.interface21.web.bind.annotation.RequestMethod; import com.interface21.webmvc.servlet.exception.HandlerInitializationException; +import com.interface21.webmvc.servlet.mvc.tobe.ControllerScanner; +import com.interface21.webmvc.servlet.mvc.tobe.HandlerExecution; +import com.interface21.webmvc.servlet.mvc.tobe.HandlerKey; import jakarta.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.Arrays; diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMapping.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMapping.java similarity index 70% rename from mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMapping.java rename to mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMapping.java index 4713216ac3..793c761955 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMapping.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMapping.java @@ -1,4 +1,4 @@ -package com.interface21.webmvc.servlet.mvc.tobe; +package com.interface21.webmvc.servlet.mvc.tobe.mapping; import jakarta.servlet.http.HttpServletRequest; diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMappingRegistry.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java similarity index 70% rename from mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMappingRegistry.java rename to mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java index 7c258a5019..a86f566604 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerMappingRegistry.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java @@ -1,5 +1,6 @@ -package com.interface21.webmvc.servlet.mvc.tobe; +package com.interface21.webmvc.servlet.mvc.tobe.mapping; +import com.interface21.webmvc.servlet.mvc.tobe.ControllerScanner; import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; @@ -9,6 +10,12 @@ public class HandlerMappingRegistry { private final List handlerMappings = new ArrayList<>(); + public HandlerMappingRegistry() { + new ControllerScanner(); + new AnnotationHandlerMapping(); + handlerMappings.add(); + } + public void addHandlerMapping(HandlerMapping handlerMapping) { handlerMappings.add(handlerMapping); } diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java index 394c5e2fde..64ddbda073 100644 --- a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java @@ -4,6 +4,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import com.interface21.webmvc.servlet.mvc.tobe.mapping.AnnotationHandlerMapping; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; From 60da14b05d2236902f32e01c90cba0917922165c Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 19:47:47 +0900 Subject: [PATCH 13/34] =?UTF-8?q?feat:=20HandlerMapping=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=EC=97=90=20initialize=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/ManualHandlerMapping.java | 1 + .../tobe/mapping/AnnotationHandlerMapping.java | 17 +++++++++-------- .../mvc/tobe/mapping/HandlerMapping.java | 2 ++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/techcourse/ManualHandlerMapping.java b/app/src/main/java/com/techcourse/ManualHandlerMapping.java index b952316c8b..baf7f229e0 100644 --- a/app/src/main/java/com/techcourse/ManualHandlerMapping.java +++ b/app/src/main/java/com/techcourse/ManualHandlerMapping.java @@ -20,6 +20,7 @@ public class ManualHandlerMapping implements HandlerMapping { private static final Map controllers = new HashMap<>(); + @Override public void initialize() { controllers.put("/", new ForwardController("/index.jsp")); controllers.put("/login", new LoginController()); diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/AnnotationHandlerMapping.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/AnnotationHandlerMapping.java index 2b563fea08..e8a7d9cb48 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/AnnotationHandlerMapping.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/AnnotationHandlerMapping.java @@ -22,9 +22,16 @@ public class AnnotationHandlerMapping implements HandlerMapping { private final Map handlerExecutions; private final ControllerScanner controllerScanner; - public AnnotationHandlerMapping(ControllerScanner controllerScanner) { + public AnnotationHandlerMapping(Object... basePackage) { this.handlerExecutions = new HashMap<>(); - this.controllerScanner = controllerScanner; + this.controllerScanner = new ControllerScanner(basePackage); + } + + @Override + public void initialize() { + Map, Object> controllers = controllerScanner.getControllers(); + controllers.forEach(this::addHandlers); + log.info("Initialized AnnotationHandlerMapping!"); } @Override @@ -36,12 +43,6 @@ public Object getHandler(final HttpServletRequest request) { return handlerExecutions.get(handlerKey); } - public void initialize() { - Map, Object> controllers = controllerScanner.getControllers(); - controllers.forEach(this::addHandlers); - log.info("Initialized AnnotationHandlerMapping!"); - } - private void addHandlers(final Class controllerType, final Object instance) { try { Arrays.stream(controllerType.getMethods()) diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMapping.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMapping.java index 793c761955..017da7e674 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMapping.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMapping.java @@ -4,5 +4,7 @@ public interface HandlerMapping { + void initialize(); + Object getHandler(HttpServletRequest request); } From 24b4318454d34783cca43b47805e1b03506a2e0a Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 19:50:49 +0900 Subject: [PATCH 14/34] =?UTF-8?q?feat:=20HandlerAdapterRegistry,=20Handler?= =?UTF-8?q?MappingRegistry=20=EA=B8=B0=EB=B0=98=20DispatcherServlet?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/DispatcherServlet.java | 23 ++++++++----------- .../DispatcherServletInitializer.java | 21 +++++++++++++++-- .../tobe/adapter/HandlerAdapterRegistry.java | 6 +++-- .../tobe/mapping/HandlerMappingRegistry.java | 8 +++---- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index 88ae4d9210..f656c42120 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -1,8 +1,6 @@ package com.techcourse; import com.interface21.webmvc.servlet.ModelAndView; -import com.interface21.webmvc.servlet.mvc.tobe.mapping.AnnotationHandlerMapping; -import com.interface21.webmvc.servlet.mvc.tobe.ControllerScanner; import com.interface21.webmvc.servlet.mvc.tobe.adapter.HandlerAdapter; import com.interface21.webmvc.servlet.mvc.tobe.adapter.HandlerAdapterRegistry; import com.interface21.webmvc.servlet.mvc.tobe.mapping.HandlerMappingRegistry; @@ -19,22 +17,21 @@ public class DispatcherServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(DispatcherServlet.class); - private HandlerMappingRegistry handlerMappingRegistry = new HandlerMappingRegistry(); - private HandlerAdapterRegistry handlerAdapterRegistry = new HandlerAdapterRegistry(); + private final HandlerMappingRegistry handlerMappingRegistry; + private final HandlerAdapterRegistry handlerAdapterRegistry; - public DispatcherServlet() { + + public DispatcherServlet( + HandlerMappingRegistry handlerMappingRegistry, + HandlerAdapterRegistry handlerAdapterRegistry + ) { + this.handlerMappingRegistry = handlerMappingRegistry; + this.handlerAdapterRegistry = handlerAdapterRegistry; } @Override public void init() { - ManualHandlerMapping manualHandlerMapping = new ManualHandlerMapping(); - manualHandlerMapping.initialize(); - handlerMappingRegistry.addHandlerMapping(manualHandlerMapping); - - handlerMappingRegistry.addHandlerMapping(manualHandlerMapping); - handlerMappingRegistry.addHandlerMapping(annotationHandlerMapping); - - handlerAdapterRegistry. + handlerMappingRegistry.initialize(); } @Override diff --git a/app/src/main/java/com/techcourse/DispatcherServletInitializer.java b/app/src/main/java/com/techcourse/DispatcherServletInitializer.java index d07ddf2033..f9fa50f7c7 100644 --- a/app/src/main/java/com/techcourse/DispatcherServletInitializer.java +++ b/app/src/main/java/com/techcourse/DispatcherServletInitializer.java @@ -1,9 +1,14 @@ package com.techcourse; +import com.interface21.web.WebApplicationInitializer; +import com.interface21.webmvc.servlet.mvc.tobe.adapter.HandlerAdapterRegistry; +import com.interface21.webmvc.servlet.mvc.tobe.adapter.ManualHandlerAdapter; +import com.interface21.webmvc.servlet.mvc.tobe.adapter.RequestMappingHandlerAdapter; +import com.interface21.webmvc.servlet.mvc.tobe.mapping.AnnotationHandlerMapping; +import com.interface21.webmvc.servlet.mvc.tobe.mapping.HandlerMappingRegistry; import jakarta.servlet.ServletContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.interface21.web.WebApplicationInitializer; /** * Base class for {@link WebApplicationInitializer} @@ -17,7 +22,7 @@ public class DispatcherServletInitializer implements WebApplicationInitializer { @Override public void onStartup(final ServletContext servletContext) { - final var dispatcherServlet = new DispatcherServlet(); + final var dispatcherServlet = createDispatcherServlet(); final var registration = servletContext.addServlet(DEFAULT_SERVLET_NAME, dispatcherServlet); if (registration == null) { @@ -30,4 +35,16 @@ public void onStartup(final ServletContext servletContext) { log.info("Start AppWebApplication Initializer"); } + + private DispatcherServlet createDispatcherServlet() { + HandlerMappingRegistry handlerMappingRegistry = new HandlerMappingRegistry(); + handlerMappingRegistry.addHandlerMapping(new ManualHandlerMapping()); + handlerMappingRegistry.addHandlerMapping(new AnnotationHandlerMapping(getClass().getPackageName())); + + HandlerAdapterRegistry handlerAdapterRegistry = new HandlerAdapterRegistry(); + handlerAdapterRegistry.addHandlerAdapter(new RequestMappingHandlerAdapter()); + handlerAdapterRegistry.addHandlerAdapter(new ManualHandlerAdapter()); + + return new DispatcherServlet(handlerMappingRegistry, handlerAdapterRegistry); + } } diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistry.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistry.java index 9691ed447a..8e023c6381 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistry.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistry.java @@ -9,8 +9,10 @@ public class HandlerAdapterRegistry { private final List handlerAdapters = new ArrayList<>(); public HandlerAdapterRegistry() { - handlerAdapters.add(new ManualHandlerAdapter()); - handlerAdapters.add(new RequestMappingHandlerAdapter()); + } + + public void addHandlerAdapter(HandlerAdapter handlerAdapter) { + handlerAdapters.add(handlerAdapter); } public HandlerAdapter getHandlerAdapter(Object handler) { diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java index a86f566604..adef1b2e5d 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java @@ -1,6 +1,5 @@ package com.interface21.webmvc.servlet.mvc.tobe.mapping; -import com.interface21.webmvc.servlet.mvc.tobe.ControllerScanner; import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; @@ -11,9 +10,10 @@ public class HandlerMappingRegistry { private final List handlerMappings = new ArrayList<>(); public HandlerMappingRegistry() { - new ControllerScanner(); - new AnnotationHandlerMapping(); - handlerMappings.add(); + } + + public void initialize() { + handlerMappings.forEach(HandlerMapping::initialize); } public void addHandlerMapping(HandlerMapping handlerMapping) { From 16f7583fa68021af2246b7c3b8dd595f05c8ae89 Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 20:05:04 +0900 Subject: [PATCH 15/34] =?UTF-8?q?feat:=20RegisterController=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EA=B8=B0=EB=B0=98?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EA=B5=AC=ED=98=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/ManualHandlerMapping.java | 2 -- .../controller/RegisterController.java | 16 +++++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/techcourse/ManualHandlerMapping.java b/app/src/main/java/com/techcourse/ManualHandlerMapping.java index baf7f229e0..707afa9d38 100644 --- a/app/src/main/java/com/techcourse/ManualHandlerMapping.java +++ b/app/src/main/java/com/techcourse/ManualHandlerMapping.java @@ -6,7 +6,6 @@ import com.techcourse.controller.LoginController; import com.techcourse.controller.LoginViewController; import com.techcourse.controller.LogoutController; -import com.techcourse.controller.RegisterController; import com.techcourse.controller.RegisterViewController; import jakarta.servlet.http.HttpServletRequest; import java.util.HashMap; @@ -27,7 +26,6 @@ public void initialize() { controllers.put("/login/view", new LoginViewController()); controllers.put("/logout", new LogoutController()); controllers.put("/register/view", new RegisterViewController()); - controllers.put("/register", new RegisterController()); log.info("Initialized Handler Mapping!"); controllers.keySet() diff --git a/app/src/main/java/com/techcourse/controller/RegisterController.java b/app/src/main/java/com/techcourse/controller/RegisterController.java index 782abfb219..508a2c816e 100644 --- a/app/src/main/java/com/techcourse/controller/RegisterController.java +++ b/app/src/main/java/com/techcourse/controller/RegisterController.java @@ -1,21 +1,27 @@ package com.techcourse.controller; +import com.interface21.web.bind.annotation.RequestMapping; +import com.interface21.web.bind.annotation.RequestMethod; +import com.interface21.webmvc.servlet.ModelAndView; +import com.interface21.webmvc.servlet.View; +import com.interface21.webmvc.servlet.view.JspView; import com.techcourse.domain.User; import com.techcourse.repository.InMemoryUserRepository; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import com.interface21.webmvc.servlet.mvc.asis.Controller; -public class RegisterController implements Controller { +@com.interface21.context.stereotype.Controller +public class RegisterController { - @Override - public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception { + @RequestMapping(value = "/register", method = RequestMethod.POST) + public ModelAndView registerUser(final HttpServletRequest req, final HttpServletResponse res) throws Exception { final var user = new User(2, req.getParameter("account"), req.getParameter("password"), req.getParameter("email")); InMemoryUserRepository.save(user); - return "redirect:/index.jsp"; + View view = new JspView("redirect:/index.jsp"); + return new ModelAndView(view); } } From 973cb283748c13818a74d897922b05b505c6529c Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 20:08:08 +0900 Subject: [PATCH 16/34] =?UTF-8?q?refactor:=20HandlerMapping=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A5=BC=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EC=B6=94=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/techcourse/DispatcherServlet.java | 4 +--- .../servlet/mvc/tobe/mapping/HandlerMappingRegistry.java | 7 ++++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index f656c42120..eba9791680 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -8,7 +8,6 @@ import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.util.NoSuchElementException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,8 +38,7 @@ protected void service(final HttpServletRequest request, final HttpServletRespon throws ServletException { log.debug("Method : {}, Request URI : {}", request.getMethod(), request.getRequestURI()); try { - Object handler = handlerMappingRegistry.getHandler(request) - .orElseThrow(() -> new NoSuchElementException("요청을 처리 할 수 있는 핸들러를 조회하지 못했습니다")); + Object handler = handlerMappingRegistry.getHandler(request); HandlerAdapter handlerAdapter = handlerAdapterRegistry.getHandlerAdapter(handler); ModelAndView modelAndView = handlerAdapter.handle(request, response, handler); modelAndView.render(request, response); diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java index adef1b2e5d..78dac52766 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java @@ -3,7 +3,7 @@ import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; -import java.util.Optional; +import java.util.NoSuchElementException; public class HandlerMappingRegistry { @@ -20,10 +20,11 @@ public void addHandlerMapping(HandlerMapping handlerMapping) { handlerMappings.add(handlerMapping); } - public Optional getHandler(HttpServletRequest httpServletRequest) { + public Object getHandler(HttpServletRequest httpServletRequest) { return handlerMappings.stream() .filter(hm -> hm.getHandler(httpServletRequest) != null) .map(hm -> hm.getHandler(httpServletRequest)) - .findFirst(); + .findFirst() + .orElseThrow(() -> new NoSuchElementException("요청을 처리할 수 있는 핸들러 매핑 정보가 없습니다")); } } From 89e7045bc2ad8ed3b9aaca5129ddb63cecab0268 Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 20:16:46 +0900 Subject: [PATCH 17/34] =?UTF-8?q?test:=20HandlerAdapterRegistryTest=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/HandlerAdapterRegistryTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistryTest.java diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistryTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistryTest.java new file mode 100644 index 0000000000..ad79d37900 --- /dev/null +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/HandlerAdapterRegistryTest.java @@ -0,0 +1,56 @@ +package com.interface21.webmvc.servlet.mvc.tobe.adapter; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.NoSuchElementException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("HandlerAdapterRegistry 테스트") +class HandlerAdapterRegistryTest { + + private HandlerAdapterRegistry handlerAdapterRegistry; + private HandlerAdapter mockAdapter1; + private HandlerAdapter mockAdapter2; + + @BeforeEach + void setUp() { + handlerAdapterRegistry = new HandlerAdapterRegistry(); + mockAdapter1 = mock(HandlerAdapter.class); + mockAdapter2 = mock(HandlerAdapter.class); + } + + @Test + @DisplayName("지원하는 Adapter 반환 테스트") + void returnCorrectAdapter() { + Object handler = new Object(); + when(mockAdapter1.supports(handler)).thenReturn(false); + when(mockAdapter2.supports(handler)).thenReturn(true); + + handlerAdapterRegistry.addHandlerAdapter(mockAdapter1); + handlerAdapterRegistry.addHandlerAdapter(mockAdapter2); + + HandlerAdapter result = handlerAdapterRegistry.getHandlerAdapter(handler); + assertThat(result).isEqualTo(mockAdapter2); + } + + @Test + @DisplayName("지원하는 Adapter가 없을 때 예외 발생 테스트") + void throwExceptionIfNoAdapter() { + Object handler = new Object(); + + when(mockAdapter1.supports(handler)).thenReturn(false); + when(mockAdapter2.supports(handler)).thenReturn(false); + + handlerAdapterRegistry.addHandlerAdapter(mockAdapter1); + handlerAdapterRegistry.addHandlerAdapter(mockAdapter2); + + assertThatThrownBy(() -> handlerAdapterRegistry.getHandlerAdapter(handler)) + .isInstanceOf(NoSuchElementException.class) + .hasMessageContaining("핸들러를 처리할 수 있는 Adapter를 찾지 못했습니다"); + } +} From 92dc9ee11d93d7d6ee691b37f9c09961c25d8669 Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 20:22:05 +0900 Subject: [PATCH 18/34] =?UTF-8?q?test:=20ManualHandlerAdapterTest=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/ManualHandlerAdapterTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/ManualHandlerAdapterTest.java diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/ManualHandlerAdapterTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/ManualHandlerAdapterTest.java new file mode 100644 index 0000000000..3b204ec828 --- /dev/null +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/ManualHandlerAdapterTest.java @@ -0,0 +1,50 @@ +package com.interface21.webmvc.servlet.mvc.tobe.adapter; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.interface21.webmvc.servlet.ModelAndView; +import com.interface21.webmvc.servlet.mvc.asis.Controller; +import com.interface21.webmvc.servlet.view.JspView; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("ManualHandlerAdapter 테스트") +class ManualHandlerAdapterTest { + + private ManualHandlerAdapter manualHandlerAdapter; + private Controller mockController; + private HttpServletRequest mockRequest; + private HttpServletResponse mockResponse; + + @BeforeEach + void setUp() { + manualHandlerAdapter = new ManualHandlerAdapter(); + mockController = mock(Controller.class); + mockRequest = mock(HttpServletRequest.class); + mockResponse = mock(HttpServletResponse.class); + } + + @Test + @DisplayName("Handler 지원 여부 확인") + void supports() { + Assertions.assertAll( + () -> assertThat(manualHandlerAdapter.supports(mockController)).isTrue(), + () -> assertThat(manualHandlerAdapter.supports(new Object())).isFalse() + ); + } + + @Test + @DisplayName("Handler 처리 및 ModelAndView 반환") + void handle() throws Exception { + when(mockController.execute(mockRequest, mockResponse)).thenReturn("/test.jsp"); + + ModelAndView modelAndView = manualHandlerAdapter.handle(mockRequest, mockResponse, mockController); + assertThat(modelAndView.getView()).isInstanceOf(JspView.class); + } +} From e572cfc35a848408794cbb3ab0d87e3e9dd1e075 Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 20:26:31 +0900 Subject: [PATCH 19/34] =?UTF-8?q?test:=20RequestMappingHandlerAdapterTest?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RequestMappingHandlerAdapterTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/RequestMappingHandlerAdapterTest.java diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/RequestMappingHandlerAdapterTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/RequestMappingHandlerAdapterTest.java new file mode 100644 index 0000000000..b88986221a --- /dev/null +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/adapter/RequestMappingHandlerAdapterTest.java @@ -0,0 +1,46 @@ +package com.interface21.webmvc.servlet.mvc.tobe.adapter; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; + +import com.interface21.webmvc.servlet.mvc.tobe.HandlerExecution; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("RequestMappingHandlerAdapter 테스트") +class RequestMappingHandlerAdapterTest { + + private RequestMappingHandlerAdapter handlerAdapter; + private HandlerExecution mockHandlerExecution; + private HttpServletRequest mockRequest; + private HttpServletResponse mockResponse; + + @BeforeEach + void setUp() { + handlerAdapter = new RequestMappingHandlerAdapter(); + mockHandlerExecution = mock(HandlerExecution.class); + mockRequest = mock(HttpServletRequest.class); + mockResponse = mock(HttpServletResponse.class); + } + + @Test + @DisplayName("HandlerExecution 지원 여부 테스트") + void supportsHandlerExecution() { + Assertions.assertAll( + () -> assertThat(handlerAdapter.supports(mockHandlerExecution)).isTrue(), + () -> assertThat(handlerAdapter.supports(new Object())).isFalse() + ); + } + + @Test + @DisplayName("잘못된 핸들러 타입 처리 시 예외 발생 테스트") + void throwExceptionForInvalidHandler() { + assertThatThrownBy(() -> handlerAdapter.handle(mockRequest, mockResponse, new Object())) + .isInstanceOf(ClassCastException.class); + } +} From a1fe327206b1d6210af1eed5dd05911a3ee0a54d Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 20:28:49 +0900 Subject: [PATCH 20/34] =?UTF-8?q?test:=20HandlerMappingRegistryTest=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tobe/AnnotationHandlerMappingTest.java | 2 + .../mapping/HandlerMappingRegistryTest.java | 57 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistryTest.java diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java index 64ddbda073..1272c5725d 100644 --- a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java @@ -8,8 +8,10 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +@DisplayName("AnnotationHandlerMapping 테스트") class AnnotationHandlerMappingTest { private AnnotationHandlerMapping handlerMapping; diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistryTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistryTest.java new file mode 100644 index 0000000000..7355fe37d0 --- /dev/null +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistryTest.java @@ -0,0 +1,57 @@ +package com.interface21.webmvc.servlet.mvc.tobe.mapping; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.NoSuchElementException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("HandlerMappingRegistry 테스트") +class HandlerMappingRegistryTest { + + private HandlerMappingRegistry handlerMappingRegistry; + private HandlerMapping mockHandlerMapping1; + private HandlerMapping mockHandlerMapping2; + private HttpServletRequest mockRequest; + + @BeforeEach + void setUp() { + handlerMappingRegistry = new HandlerMappingRegistry(); + mockHandlerMapping1 = mock(HandlerMapping.class); + mockHandlerMapping2 = mock(HandlerMapping.class); + mockRequest = mock(HttpServletRequest.class); + } + + @Test + @DisplayName("지원하는 핸들러 반환 테스트") + void returnCorrectHandler() { + Object expectedHandler = new Object(); + when(mockHandlerMapping1.getHandler(mockRequest)).thenReturn(null); + when(mockHandlerMapping2.getHandler(mockRequest)).thenReturn(expectedHandler); + + handlerMappingRegistry.addHandlerMapping(mockHandlerMapping1); + handlerMappingRegistry.addHandlerMapping(mockHandlerMapping2); + + Object result = handlerMappingRegistry.getHandler(mockRequest); + assertThat(result).isEqualTo(expectedHandler); + } + + @Test + @DisplayName("지원하는 핸들러가 없을 때 예외 발생 테스트") + void throwExceptionIfNoHandler() { + when(mockHandlerMapping1.getHandler(mockRequest)).thenReturn(null); + when(mockHandlerMapping2.getHandler(mockRequest)).thenReturn(null); + + handlerMappingRegistry.addHandlerMapping(mockHandlerMapping1); + handlerMappingRegistry.addHandlerMapping(mockHandlerMapping2); + + assertThatThrownBy(() -> handlerMappingRegistry.getHandler(mockRequest)) + .isInstanceOf(NoSuchElementException.class) + .hasMessageContaining("요청을 처리할 수 있는 핸들러 매핑 정보가 없습니다"); + } +} From f1705f1098add8a8356663c9dbd7e9f7b3eef15f Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 20:30:17 +0900 Subject: [PATCH 21/34] =?UTF-8?q?test:=20ControllerScannerTest=20=EB=B6=88?= =?UTF-8?q?=EB=B3=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webmvc/servlet/mvc/tobe/ControllerScannerTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScannerTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScannerTest.java index 78798e6ed4..f4e27a8e8c 100644 --- a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScannerTest.java +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScannerTest.java @@ -1,6 +1,7 @@ package com.interface21.webmvc.servlet.mvc.tobe; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import com.interface21.context.stereotype.Controller; import java.util.Map; @@ -30,6 +31,14 @@ void testScanControllers() { () -> assertThat(controllers.get(SampleController.class)).isInstanceOf(SampleController.class) ); } + + @DisplayName("컨트롤러가 unmodifiableMap으로 반환되는지 확인") + @Test + void controllersReturnedAsUnmodifiableMap() { + Map, Object> controllers = controllerScanner.getControllers(); + assertThatThrownBy(() -> controllers.put(Object.class, new Object())) + .isInstanceOf(UnsupportedOperationException.class); + } @Controller private static class SampleController { From c037eaf24a030bc57b37f580f2f898314b6edb91 Mon Sep 17 00:00:00 2001 From: libienz Date: Sat, 28 Sep 2024 20:32:03 +0900 Subject: [PATCH 22/34] =?UTF-8?q?test:=20=EC=8B=A4=ED=8C=A8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java index 1272c5725d..e3ce1efc7e 100644 --- a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/AnnotationHandlerMappingTest.java @@ -18,7 +18,7 @@ class AnnotationHandlerMappingTest { @BeforeEach void setUp() { - handlerMapping = new AnnotationHandlerMapping(new ControllerScanner("samples")); + handlerMapping = new AnnotationHandlerMapping("samples"); handlerMapping.initialize(); } From 0e4f6f303f89528392b2671077a88641e578df6e Mon Sep 17 00:00:00 2001 From: libienz Date: Sun, 29 Sep 2024 15:13:42 +0900 Subject: [PATCH 23/34] =?UTF-8?q?refactor:=20=EC=97=AC=EB=9F=AC=20?= =?UTF-8?q?=EA=B3=B3=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EC=86=8D=EC=84=B1=20=EB=B3=80=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/techcourse/ManualHandlerMapping.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/techcourse/ManualHandlerMapping.java b/app/src/main/java/com/techcourse/ManualHandlerMapping.java index 707afa9d38..742260be0a 100644 --- a/app/src/main/java/com/techcourse/ManualHandlerMapping.java +++ b/app/src/main/java/com/techcourse/ManualHandlerMapping.java @@ -34,7 +34,8 @@ public void initialize() { @Override public Controller getHandler(final HttpServletRequest request) { - log.debug("Request Mapping Uri : {}", request.getRequestURI()); - return controllers.get(request.getRequestURI()); + String requestURI = request.getRequestURI(); + log.debug("Request Mapping Uri : {}", requestURI); + return controllers.get(requestURI); } } From 636b21f3be7ee8a996bd1435defbc64c02535fc2 Mon Sep 17 00:00:00 2001 From: libienz Date: Sun, 29 Sep 2024 15:15:19 +0900 Subject: [PATCH 24/34] =?UTF-8?q?refactor:=20Stream=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B0=98=EB=B3=B5=EC=A0=81=EC=9D=B8=20get?= =?UTF-8?q?=20=ED=98=B8=EC=B6=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servlet/mvc/tobe/mapping/HandlerMappingRegistry.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java index 78dac52766..0641fc0fb9 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/mapping/HandlerMappingRegistry.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; +import java.util.Objects; public class HandlerMappingRegistry { @@ -22,8 +23,8 @@ public void addHandlerMapping(HandlerMapping handlerMapping) { public Object getHandler(HttpServletRequest httpServletRequest) { return handlerMappings.stream() - .filter(hm -> hm.getHandler(httpServletRequest) != null) .map(hm -> hm.getHandler(httpServletRequest)) + .filter(Objects::nonNull) .findFirst() .orElseThrow(() -> new NoSuchElementException("요청을 처리할 수 있는 핸들러 매핑 정보가 없습니다")); } From 84e7424989837e3cf7f23e051ccb7671f08339cf Mon Sep 17 00:00:00 2001 From: libienz Date: Sun, 29 Sep 2024 15:50:33 +0900 Subject: [PATCH 25/34] =?UTF-8?q?feat:=20DispatcherServlet=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EA=B7=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/techcourse/DispatcherServlet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index eba9791680..764816307f 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -43,7 +43,8 @@ protected void service(final HttpServletRequest request, final HttpServletRespon ModelAndView modelAndView = handlerAdapter.handle(request, response, handler); modelAndView.render(request, response); } catch (Exception e) { - throw new RuntimeException(e); + log.error("Exception : {}", e.getMessage(), e); + throw new ServletException("요청을 처리하는 것에 실패했습니다", e); } } } From 3ea2fbaad53891521d73e9a89a27c7aef7eda22e Mon Sep 17 00:00:00 2001 From: libienz Date: Sun, 29 Sep 2024 16:29:21 +0900 Subject: [PATCH 26/34] =?UTF-8?q?test:=20DisplayName=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webmvc/servlet/mvc/tobe/ControllerScannerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScannerTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScannerTest.java index f4e27a8e8c..e8edaf71e0 100644 --- a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScannerTest.java +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/ControllerScannerTest.java @@ -31,8 +31,8 @@ void testScanControllers() { () -> assertThat(controllers.get(SampleController.class)).isInstanceOf(SampleController.class) ); } - - @DisplayName("컨트롤러가 unmodifiableMap으로 반환되는지 확인") + + @DisplayName("컨트롤러스캐너에서 반환한 컨트롤러 정보를 변경하려고 한다면 예외가 발생한다") @Test void controllersReturnedAsUnmodifiableMap() { Map, Object> controllers = controllerScanner.getControllers(); From 7575bb6dac711312c58c14e60e580a475c87a3aa Mon Sep 17 00:00:00 2001 From: libienz Date: Sun, 29 Sep 2024 16:29:49 +0900 Subject: [PATCH 27/34] =?UTF-8?q?refactor:=20logging=EA=B3=BC=20rethrow?= =?UTF-8?q?=EB=A5=BC=20=ED=95=A8=EA=BB=98=20=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20DispatcherServlet=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/techcourse/DispatcherServlet.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index 764816307f..19b22fd8b7 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -43,7 +43,6 @@ protected void service(final HttpServletRequest request, final HttpServletRespon ModelAndView modelAndView = handlerAdapter.handle(request, response, handler); modelAndView.render(request, response); } catch (Exception e) { - log.error("Exception : {}", e.getMessage(), e); throw new ServletException("요청을 처리하는 것에 실패했습니다", e); } } From df3008cf697b768614b10f6fcb40046ef0a3a35d Mon Sep 17 00:00:00 2001 From: libienz Date: Sun, 29 Sep 2024 16:43:53 +0900 Subject: [PATCH 28/34] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20try-catch=20=EC=A0=9C=EA=B1=B0=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/interface21/webmvc/servlet/ModelAndView.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java b/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java index 533e2813c3..e90ddce61a 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java @@ -33,11 +33,8 @@ public View getView() { return view; } - public void render(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { - try { - view.render(model, httpServletRequest, httpServletResponse); - } catch (Exception e) { - throw new RuntimeException(e); - } + public void render(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) + throws Exception { + view.render(model, httpServletRequest, httpServletResponse); } } From a9de0507cadb771c6d14b6f6d94e2b2e34a3ba34 Mon Sep 17 00:00:00 2001 From: libienz Date: Sun, 29 Sep 2024 16:45:43 +0900 Subject: [PATCH 29/34] =?UTF-8?q?feat:=20RegisterController=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/controller/RegisterController.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/techcourse/controller/RegisterController.java b/app/src/main/java/com/techcourse/controller/RegisterController.java index 508a2c816e..a85773519a 100644 --- a/app/src/main/java/com/techcourse/controller/RegisterController.java +++ b/app/src/main/java/com/techcourse/controller/RegisterController.java @@ -13,8 +13,16 @@ @com.interface21.context.stereotype.Controller public class RegisterController { + private static final String REGISTER_JSP = "/register.jsp"; + + @RequestMapping(value = "/register", method = RequestMethod.GET) + public ModelAndView registerPage(final HttpServletRequest req, HttpServletResponse res) { + JspView jspView = new JspView(REGISTER_JSP); + return new ModelAndView(jspView); + } + @RequestMapping(value = "/register", method = RequestMethod.POST) - public ModelAndView registerUser(final HttpServletRequest req, final HttpServletResponse res) throws Exception { + public ModelAndView registerUser(final HttpServletRequest req, final HttpServletResponse res) { final var user = new User(2, req.getParameter("account"), req.getParameter("password"), From 6258284888e2abdf5e9870d863609795e1b15e33 Mon Sep 17 00:00:00 2001 From: libienz Date: Mon, 30 Sep 2024 00:42:39 +0900 Subject: [PATCH 30/34] =?UTF-8?q?refactor:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=8A=A4=EC=BA=94=20=EB=8C=80=EC=83=81=EC=9D=84=20?= =?UTF-8?q?Application=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/techcourse/DispatcherServletInitializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServletInitializer.java b/app/src/main/java/com/techcourse/DispatcherServletInitializer.java index f9fa50f7c7..f5b0ffdd33 100644 --- a/app/src/main/java/com/techcourse/DispatcherServletInitializer.java +++ b/app/src/main/java/com/techcourse/DispatcherServletInitializer.java @@ -39,7 +39,7 @@ public void onStartup(final ServletContext servletContext) { private DispatcherServlet createDispatcherServlet() { HandlerMappingRegistry handlerMappingRegistry = new HandlerMappingRegistry(); handlerMappingRegistry.addHandlerMapping(new ManualHandlerMapping()); - handlerMappingRegistry.addHandlerMapping(new AnnotationHandlerMapping(getClass().getPackageName())); + handlerMappingRegistry.addHandlerMapping(new AnnotationHandlerMapping(Application.class)); HandlerAdapterRegistry handlerAdapterRegistry = new HandlerAdapterRegistry(); handlerAdapterRegistry.addHandlerAdapter(new RequestMappingHandlerAdapter()); From 723f5c40e70207a517bbf6cee0b221cff1445273 Mon Sep 17 00:00:00 2001 From: libienz Date: Mon, 30 Sep 2024 00:58:37 +0900 Subject: [PATCH 31/34] =?UTF-8?q?refactor:=20modelAndView=EA=B0=80=20null?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=EC=9D=98=20=EB=B6=84=EA=B8=B0?= =?UTF-8?q?=EB=A5=BC=20=EC=B2=98=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=20Dis?= =?UTF-8?q?patcherServlet=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/techcourse/DispatcherServlet.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index 19b22fd8b7..19ea2fad58 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -41,7 +41,9 @@ protected void service(final HttpServletRequest request, final HttpServletRespon Object handler = handlerMappingRegistry.getHandler(request); HandlerAdapter handlerAdapter = handlerAdapterRegistry.getHandlerAdapter(handler); ModelAndView modelAndView = handlerAdapter.handle(request, response, handler); - modelAndView.render(request, response); + if (modelAndView != null) { + modelAndView.render(request, response); + } } catch (Exception e) { throw new ServletException("요청을 처리하는 것에 실패했습니다", e); } From f159ffe035777107298e30f0b1520d4ba5835bc0 Mon Sep 17 00:00:00 2001 From: libienz Date: Mon, 30 Sep 2024 01:07:02 +0900 Subject: [PATCH 32/34] =?UTF-8?q?refactor:=20modelAndView=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=EC=9D=84=20=EB=AA=A8=EB=8D=B8=EA=B3=BC=20=EB=B7=B0?= =?UTF-8?q?=EB=A5=BC=20=EB=AC=B6=EC=96=B4=EB=86=93=EB=8A=94=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC=20=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=ED=95=9C=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/techcourse/DispatcherServlet.java | 4 +++- .../java/com/interface21/webmvc/servlet/ModelAndView.java | 7 ------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index 19ea2fad58..8c60460d1b 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -1,6 +1,7 @@ package com.techcourse; import com.interface21.webmvc.servlet.ModelAndView; +import com.interface21.webmvc.servlet.View; import com.interface21.webmvc.servlet.mvc.tobe.adapter.HandlerAdapter; import com.interface21.webmvc.servlet.mvc.tobe.adapter.HandlerAdapterRegistry; import com.interface21.webmvc.servlet.mvc.tobe.mapping.HandlerMappingRegistry; @@ -42,7 +43,8 @@ protected void service(final HttpServletRequest request, final HttpServletRespon HandlerAdapter handlerAdapter = handlerAdapterRegistry.getHandlerAdapter(handler); ModelAndView modelAndView = handlerAdapter.handle(request, response, handler); if (modelAndView != null) { - modelAndView.render(request, response); + View view = modelAndView.getView(); + view.render(modelAndView.getModel(), request, response); } } catch (Exception e) { throw new ServletException("요청을 처리하는 것에 실패했습니다", e); diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java b/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java index e90ddce61a..d5a3eadeac 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java @@ -1,7 +1,5 @@ package com.interface21.webmvc.servlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -32,9 +30,4 @@ public Map getModel() { public View getView() { return view; } - - public void render(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) - throws Exception { - view.render(model, httpServletRequest, httpServletResponse); - } } From 7ed1d12a07048bc7b716c7693ffbf57934b3fb6a Mon Sep 17 00:00:00 2001 From: libienz Date: Mon, 30 Sep 2024 01:08:50 +0900 Subject: [PATCH 33/34] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20RegisterViewController=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/techcourse/ManualHandlerMapping.java | 2 -- .../controller/RegisterViewController.java | 13 ------------- 2 files changed, 15 deletions(-) delete mode 100644 app/src/main/java/com/techcourse/controller/RegisterViewController.java diff --git a/app/src/main/java/com/techcourse/ManualHandlerMapping.java b/app/src/main/java/com/techcourse/ManualHandlerMapping.java index 742260be0a..6cf5383abf 100644 --- a/app/src/main/java/com/techcourse/ManualHandlerMapping.java +++ b/app/src/main/java/com/techcourse/ManualHandlerMapping.java @@ -6,7 +6,6 @@ import com.techcourse.controller.LoginController; import com.techcourse.controller.LoginViewController; import com.techcourse.controller.LogoutController; -import com.techcourse.controller.RegisterViewController; import jakarta.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; @@ -25,7 +24,6 @@ public void initialize() { controllers.put("/login", new LoginController()); controllers.put("/login/view", new LoginViewController()); controllers.put("/logout", new LogoutController()); - controllers.put("/register/view", new RegisterViewController()); log.info("Initialized Handler Mapping!"); controllers.keySet() diff --git a/app/src/main/java/com/techcourse/controller/RegisterViewController.java b/app/src/main/java/com/techcourse/controller/RegisterViewController.java deleted file mode 100644 index c88dc2814b..0000000000 --- a/app/src/main/java/com/techcourse/controller/RegisterViewController.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.techcourse.controller; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import com.interface21.webmvc.servlet.mvc.asis.Controller; - -public class RegisterViewController implements Controller { - - @Override - public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception { - return "/register.jsp"; - } -} From fea477ef64f01e5b71b8f294ca4c57ac6ddbdb07 Mon Sep 17 00:00:00 2001 From: libienz Date: Mon, 30 Sep 2024 01:09:11 +0900 Subject: [PATCH 34/34] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20final=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=82=AC=EC=9A=A9=20=ED=86=B5=EC=9D=BC=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/techcourse/controller/RegisterController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/techcourse/controller/RegisterController.java b/app/src/main/java/com/techcourse/controller/RegisterController.java index a85773519a..26029f809e 100644 --- a/app/src/main/java/com/techcourse/controller/RegisterController.java +++ b/app/src/main/java/com/techcourse/controller/RegisterController.java @@ -16,7 +16,7 @@ public class RegisterController { private static final String REGISTER_JSP = "/register.jsp"; @RequestMapping(value = "/register", method = RequestMethod.GET) - public ModelAndView registerPage(final HttpServletRequest req, HttpServletResponse res) { + public ModelAndView registerPage(final HttpServletRequest req, final HttpServletResponse res) { JspView jspView = new JspView(REGISTER_JSP); return new ModelAndView(jspView); }