From 2fa612db5dd87588a6bf240b38e750bcd3696762 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Thu, 16 Sep 2021 23:53:59 +0900 Subject: [PATCH 01/15] =?UTF-8?q?refactor:=20=EB=A0=88=EA=B1=B0=EC=8B=9C?= =?UTF-8?q?=20Controller=EC=97=90=EC=84=9C=20String=EC=9D=84=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8D=98=EA=B2=83=EC=9D=84=20ModelView?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=98=ED=99=98=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 --- .../controller/LoginController.java | 26 ++++++++++++------- .../controller/LoginViewController.java | 10 ++++--- .../controller/LogoutController.java | 8 ++++-- .../java/nextstep/mvc/DispatcherServlet.java | 5 ++-- .../mvc/controller/asis/Controller.java | 3 ++- .../controller/asis/ForwardController.java | 7 ++--- 6 files changed, 38 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/techcourse/controller/LoginController.java b/app/src/main/java/com/techcourse/controller/LoginController.java index 946b3f4c03..089360a000 100644 --- a/app/src/main/java/com/techcourse/controller/LoginController.java +++ b/app/src/main/java/com/techcourse/controller/LoginController.java @@ -6,6 +6,9 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import nextstep.mvc.controller.asis.Controller; +import nextstep.mvc.view.JspView; +import nextstep.mvc.view.ModelAndView; +import nextstep.mvc.view.View; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,26 +17,29 @@ public class LoginController implements Controller { private static final Logger log = LoggerFactory.getLogger(LoginController.class); @Override - public String execute(HttpServletRequest req, HttpServletResponse res) { + public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) { if (UserSession.isLoggedIn(req.getSession())) { - return "redirect:/index.jsp"; + View view = new JspView("redirect:/index.jsp"); + return new ModelAndView(view); } return InMemoryUserRepository.findByAccount(req.getParameter("account")) - .map(user -> { - log.info("User : {}", user); - return login(req, user); - }) - .orElse("redirect:/401.jsp"); + .map(user -> { + log.info("User : {}", user); + return new ModelAndView(login(req, user)); + }) + .orElse(new ModelAndView( + new JspView("redirect:/401.jsp") + )); } - private String login(HttpServletRequest request, User user) { + private View login(HttpServletRequest request, User user) { if (user.checkPassword(request.getParameter("password"))) { final HttpSession session = request.getSession(); session.setAttribute(UserSession.SESSION_KEY, user); - return "redirect:/index.jsp"; + return new JspView("redirect:/index.jsp"); } else { - return "redirect:/401.jsp"; + return new JspView("redirect:/401.jsp"); } } } diff --git a/app/src/main/java/com/techcourse/controller/LoginViewController.java b/app/src/main/java/com/techcourse/controller/LoginViewController.java index c2fe2d1ec6..6ad5f2f515 100644 --- a/app/src/main/java/com/techcourse/controller/LoginViewController.java +++ b/app/src/main/java/com/techcourse/controller/LoginViewController.java @@ -3,6 +3,9 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import nextstep.mvc.controller.asis.Controller; +import nextstep.mvc.view.JspView; +import nextstep.mvc.view.ModelAndView; +import nextstep.mvc.view.View; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,12 +14,13 @@ public class LoginViewController implements Controller { private static final Logger log = LoggerFactory.getLogger(LoginViewController.class); @Override - public String execute(HttpServletRequest req, HttpServletResponse res) { + public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) { return UserSession.getUserFrom(req.getSession()) .map(user -> { log.info("logged in {}", user.getAccount()); - return "redirect:/index.jsp"; + View view = new JspView("redirect:/index.jsp"); + return new ModelAndView(view); }) - .orElse("/login.jsp"); + .orElse(new ModelAndView(new JspView("/login.jsp"))); } } diff --git a/app/src/main/java/com/techcourse/controller/LogoutController.java b/app/src/main/java/com/techcourse/controller/LogoutController.java index 5ab9ce73eb..197b7be395 100644 --- a/app/src/main/java/com/techcourse/controller/LogoutController.java +++ b/app/src/main/java/com/techcourse/controller/LogoutController.java @@ -4,13 +4,17 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import nextstep.mvc.controller.asis.Controller; +import nextstep.mvc.view.JspView; +import nextstep.mvc.view.ModelAndView; +import nextstep.mvc.view.View; public class LogoutController implements Controller { @Override - public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception { + public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) throws Exception { final HttpSession session = req.getSession(); session.removeAttribute(UserSession.SESSION_KEY); - return "redirect:/"; + View view = new JspView("redirect:/"); + return new ModelAndView(view); } } diff --git a/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java b/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java index aca027b430..09650532fd 100644 --- a/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java +++ b/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java @@ -44,8 +44,9 @@ protected void service(HttpServletRequest request, HttpServletResponse response) Object handler = getHandlerMapping(request); if (handler instanceof Controller) { - String viewName = ((Controller) handler).execute(request, response); - move(viewName, request, response); + ModelAndView modelAndView = ((Controller) handler).execute(request, response); + View view = modelAndView.getView(); + view.render(modelAndView.getModel(), request, response); } else if (handler instanceof HandlerExecution) { ModelAndView modelAndView = ((HandlerExecution) handler).handle(request, response); View view = modelAndView.getView(); diff --git a/mvc/src/main/java/nextstep/mvc/controller/asis/Controller.java b/mvc/src/main/java/nextstep/mvc/controller/asis/Controller.java index 545ca0ec56..28e4963059 100644 --- a/mvc/src/main/java/nextstep/mvc/controller/asis/Controller.java +++ b/mvc/src/main/java/nextstep/mvc/controller/asis/Controller.java @@ -2,7 +2,8 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import nextstep.mvc.view.ModelAndView; public interface Controller { - String execute(HttpServletRequest req, HttpServletResponse res) throws Exception; + ModelAndView execute(HttpServletRequest req, HttpServletResponse res) throws Exception; } diff --git a/mvc/src/main/java/nextstep/mvc/controller/asis/ForwardController.java b/mvc/src/main/java/nextstep/mvc/controller/asis/ForwardController.java index 42788e2738..6088a55ffc 100644 --- a/mvc/src/main/java/nextstep/mvc/controller/asis/ForwardController.java +++ b/mvc/src/main/java/nextstep/mvc/controller/asis/ForwardController.java @@ -2,8 +2,9 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; - import java.util.Objects; +import nextstep.mvc.view.JspView; +import nextstep.mvc.view.ModelAndView; public class ForwardController implements Controller { @@ -14,7 +15,7 @@ public ForwardController(String path) { } @Override - public String execute(HttpServletRequest request, HttpServletResponse response) { - return path; + public ModelAndView execute(HttpServletRequest request, HttpServletResponse response) { + return new ModelAndView(new JspView(path)); } } From db67d7b6e117d725cb6d9f951bf10bdf42deb441 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Fri, 17 Sep 2021 00:31:13 +0900 Subject: [PATCH 02/15] =?UTF-8?q?refactor:=20=EC=96=B4=EB=8C=91=ED=84=B0?= =?UTF-8?q?=20=ED=8C=A8=ED=84=B4=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=B4=20?= =?UTF-8?q?=ED=94=84=EB=A0=88=EC=9E=84=EC=9B=8C=ED=81=AC=20=EC=A7=80?= =?UTF-8?q?=EC=9B=90=20=EA=B8=B0=EB=8A=A5=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppWebApplicationInitializer.java | 14 +++++- .../java/nextstep/mvc/DispatcherServlet.java | 49 +++++++++---------- .../adapter/ControllerHandlerAdapter.java | 19 +++++++ .../adapter}/HandlerAdapter.java | 2 +- .../HandlerExecutionHandlerAdapter.java | 19 +++++++ 5 files changed, 73 insertions(+), 30 deletions(-) create mode 100644 mvc/src/main/java/nextstep/mvc/controller/adapter/ControllerHandlerAdapter.java rename mvc/src/main/java/nextstep/mvc/{ => controller/adapter}/HandlerAdapter.java (88%) create mode 100644 mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerExecutionHandlerAdapter.java diff --git a/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java b/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java index ab4dda5bf6..48da076fdd 100644 --- a/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java +++ b/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java @@ -3,6 +3,10 @@ import jakarta.servlet.ServletContext; import jakarta.servlet.ServletRegistration; import nextstep.mvc.DispatcherServlet; +import nextstep.mvc.HandlerMapping; +import nextstep.mvc.controller.adapter.ControllerHandlerAdapter; +import nextstep.mvc.controller.adapter.HandlerAdapter; +import nextstep.mvc.controller.adapter.HandlerExecutionHandlerAdapter; import nextstep.mvc.controller.tobe.AnnotationHandlerMapping; import nextstep.web.WebApplicationInitializer; import org.slf4j.Logger; @@ -16,8 +20,9 @@ public class AppWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) { final DispatcherServlet dispatcherServlet = new DispatcherServlet(); - dispatcherServlet.addHandlerMapping(new ManualHandlerMapping()); - dispatcherServlet.addHandlerMapping(new AnnotationHandlerMapping(BASE_PACKAGE)); + + addFrameWork(dispatcherServlet, new ManualHandlerMapping(), new ControllerHandlerAdapter()); + addFrameWork(dispatcherServlet, new AnnotationHandlerMapping(BASE_PACKAGE), new HandlerExecutionHandlerAdapter()); final ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet); dispatcher.setLoadOnStartup(1); @@ -25,4 +30,9 @@ public void onStartup(ServletContext servletContext) { LOGGER.info("Start AppWebApplication Initializer"); } + + private void addFrameWork(final DispatcherServlet dispatcherServlet, final HandlerMapping handlerMapping, final HandlerAdapter handlerAdapter) { + dispatcherServlet.addHandlerMapping(handlerMapping); + dispatcherServlet.addHandlerAdapter(handlerAdapter); + } } diff --git a/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java b/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java index 09650532fd..b66139d65a 100644 --- a/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java +++ b/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java @@ -1,6 +1,5 @@ package nextstep.mvc; -import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; @@ -8,9 +7,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import nextstep.mvc.controller.asis.Controller; -import nextstep.mvc.controller.tobe.HandlerExecution; -import nextstep.mvc.view.JspView; +import nextstep.mvc.controller.adapter.HandlerAdapter; import nextstep.mvc.view.ModelAndView; import nextstep.mvc.view.View; import org.slf4j.Logger; @@ -22,9 +19,11 @@ public class DispatcherServlet extends HttpServlet { private static final Logger LOGGER = LoggerFactory.getLogger(DispatcherServlet.class); private final List handlerMappings; + private final List handlerAdapters; public DispatcherServlet() { - this.handlerMappings = new ArrayList<>(); + handlerMappings = new ArrayList<>(); + handlerAdapters = new ArrayList<>(); } @Override @@ -32,7 +31,11 @@ public void init() { handlerMappings.forEach(HandlerMapping::initialize); } - public void addHandlerMapping(HandlerMapping handlerMapping) { + public void addHandlerAdapter(final HandlerAdapter handlerAdapter) { + handlerAdapters.add(handlerAdapter); + } + + public void addHandlerMapping(final HandlerMapping handlerMapping) { handlerMappings.add(handlerMapping); } @@ -42,24 +45,26 @@ protected void service(HttpServletRequest request, HttpServletResponse response) try { Object handler = getHandlerMapping(request); - - if (handler instanceof Controller) { - ModelAndView modelAndView = ((Controller) handler).execute(request, response); - View view = modelAndView.getView(); - view.render(modelAndView.getModel(), request, response); - } else if (handler instanceof HandlerExecution) { - ModelAndView modelAndView = ((HandlerExecution) handler).handle(request, response); - View view = modelAndView.getView(); - view.render(modelAndView.getModel(), request, response); - } else { - throw new Exception("맞는 핸들러가 없습니다."); + for (HandlerAdapter handlerAdapter : handlerAdapters) { + if (handlerAdapter.supports(handler)) { + viewRender(request, response, handler, handlerAdapter); + return; + } } + throw new Exception("맞는 핸들러가 없습니다."); } catch (Exception e) { LOGGER.error("Exception : {}", e.getMessage(), e); throw new ServletException(e.getMessage()); } } + private void viewRender(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final HandlerAdapter handlerAdapter) + throws Exception { + ModelAndView modelAndView = handlerAdapter.handle(request, response, handler); + View view = modelAndView.getView(); + view.render(modelAndView.getModel(), request, response); + } + private Object getHandlerMapping(final HttpServletRequest request) { return handlerMappings.stream() .map(handlerMapping -> handlerMapping.getHandler(request)) @@ -67,14 +72,4 @@ private Object getHandlerMapping(final HttpServletRequest request) { .findFirst() .orElseThrow(); } - - private void move(String viewName, HttpServletRequest request, HttpServletResponse response) throws Exception { - if (viewName.startsWith(JspView.REDIRECT_PREFIX)) { - response.sendRedirect(viewName.substring(JspView.REDIRECT_PREFIX.length())); - return; - } - - final RequestDispatcher requestDispatcher = request.getRequestDispatcher(viewName); - requestDispatcher.forward(request, response); - } } diff --git a/mvc/src/main/java/nextstep/mvc/controller/adapter/ControllerHandlerAdapter.java b/mvc/src/main/java/nextstep/mvc/controller/adapter/ControllerHandlerAdapter.java new file mode 100644 index 0000000000..7c47734aa9 --- /dev/null +++ b/mvc/src/main/java/nextstep/mvc/controller/adapter/ControllerHandlerAdapter.java @@ -0,0 +1,19 @@ +package nextstep.mvc.controller.adapter; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import nextstep.mvc.controller.asis.Controller; +import nextstep.mvc.view.ModelAndView; + +public class ControllerHandlerAdapter implements HandlerAdapter { + + @Override + public boolean supports(final Object handler) { + return handler instanceof Controller; + } + + @Override + public ModelAndView handle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception { + return ((Controller) handler).execute(request, response); + } +} diff --git a/mvc/src/main/java/nextstep/mvc/HandlerAdapter.java b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapter.java similarity index 88% rename from mvc/src/main/java/nextstep/mvc/HandlerAdapter.java rename to mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapter.java index b1666cb54e..54804d0506 100644 --- a/mvc/src/main/java/nextstep/mvc/HandlerAdapter.java +++ b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapter.java @@ -1,4 +1,4 @@ -package nextstep.mvc; +package nextstep.mvc.controller.adapter; import nextstep.mvc.view.ModelAndView; diff --git a/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerExecutionHandlerAdapter.java b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerExecutionHandlerAdapter.java new file mode 100644 index 0000000000..91ef0fc563 --- /dev/null +++ b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerExecutionHandlerAdapter.java @@ -0,0 +1,19 @@ +package nextstep.mvc.controller.adapter; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import nextstep.mvc.controller.tobe.HandlerExecution; +import nextstep.mvc.view.ModelAndView; + +public class HandlerExecutionHandlerAdapter implements HandlerAdapter { + + @Override + public boolean supports(final Object handler) { + return handler instanceof HandlerExecution; + } + + @Override + public ModelAndView handle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception { + return ((HandlerExecution) handler).handle(request, response); + } +} From 98ca581f1288d8e7f9380831525bea306513082e Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Fri, 17 Sep 2021 00:48:36 +0900 Subject: [PATCH 03/15] =?UTF-8?q?chore:=20jackson=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EB=B2=84=EC=A0=84=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mvc/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mvc/build.gradle b/mvc/build.gradle index 08abe3d299..98f7d4c02d 100644 --- a/mvc/build.gradle +++ b/mvc/build.gradle @@ -19,8 +19,8 @@ dependencies { implementation 'org.reflections:reflections:0.9.11' - implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.4' - + implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.5' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.3' testImplementation 'org.mockito:mockito-core:3.12.3' testImplementation 'org.assertj:assertj-core:3.20.2' From 10580b1366b3a5f3f61b043e519d8efeaff057e6 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Fri, 17 Sep 2021 02:10:25 +0900 Subject: [PATCH 04/15] =?UTF-8?q?feat:=20jsonView=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MultiInputController.java | 32 +++++++++++++++++++ .../techcourse/controller/UserController.java | 32 +++++++++++++++++++ .../main/java/com/techcourse/domain/User.java | 9 +++++- mvc/build.gradle | 2 +- .../main/java/nextstep/mvc/view/JsonView.java | 14 +++++++- 5 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/techcourse/controller/MultiInputController.java create mode 100644 app/src/main/java/com/techcourse/controller/UserController.java diff --git a/app/src/main/java/com/techcourse/controller/MultiInputController.java b/app/src/main/java/com/techcourse/controller/MultiInputController.java new file mode 100644 index 0000000000..ee14fa80ec --- /dev/null +++ b/app/src/main/java/com/techcourse/controller/MultiInputController.java @@ -0,0 +1,32 @@ +package com.techcourse.controller; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import nextstep.mvc.view.JsonView; +import nextstep.mvc.view.ModelAndView; +import nextstep.web.annotation.Controller; +import nextstep.web.annotation.RequestMapping; +import nextstep.web.support.RequestMethod; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Controller +public class MultiInputController { + + private static final Logger LOGGER = LoggerFactory.getLogger(MultiInputController.class); + + @RequestMapping(value = "/api/multi", method = RequestMethod.GET) + public ModelAndView show(HttpServletRequest request, HttpServletResponse response) { + String input1 = request.getParameter("input1"); + String input2 = request.getParameter("input2"); + + LOGGER.debug("input1 : {}", input1); + LOGGER.debug("input2 : {}", input2); + + ModelAndView modelAndView = new ModelAndView(new JsonView()); + + modelAndView.addObject("input1", input1); + modelAndView.addObject("input2", input2); + return modelAndView; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/techcourse/controller/UserController.java b/app/src/main/java/com/techcourse/controller/UserController.java new file mode 100644 index 0000000000..a241192a48 --- /dev/null +++ b/app/src/main/java/com/techcourse/controller/UserController.java @@ -0,0 +1,32 @@ +package com.techcourse.controller; + +import com.techcourse.domain.User; +import com.techcourse.repository.InMemoryUserRepository; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import nextstep.mvc.view.JsonView; +import nextstep.mvc.view.ModelAndView; +import nextstep.web.annotation.Controller; +import nextstep.web.annotation.RequestMapping; +import nextstep.web.support.RequestMethod; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Controller +public class UserController { + + private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class); + + @RequestMapping(value = "/api/user", method = RequestMethod.GET) + public ModelAndView show(HttpServletRequest request, HttpServletResponse response) { + final String account = request.getParameter("account"); + LOGGER.debug("user id : {}", account); + + final ModelAndView modelAndView = new ModelAndView(new JsonView()); + final User user = InMemoryUserRepository.findByAccount(account) + .orElseThrow(); + + modelAndView.addObject("user", user); + return modelAndView; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/techcourse/domain/User.java b/app/src/main/java/com/techcourse/domain/User.java index beb0919b7e..e7bea58157 100644 --- a/app/src/main/java/com/techcourse/domain/User.java +++ b/app/src/main/java/com/techcourse/domain/User.java @@ -28,7 +28,14 @@ public String toString() { "id=" + id + ", account='" + account + '\'' + ", email='" + email + '\'' + - ", password='" + password + '\'' + '}'; } + + public long getId() { + return id; + } + + public String getEmail() { + return email; + } } diff --git a/mvc/build.gradle b/mvc/build.gradle index 98f7d4c02d..3e553994f8 100644 --- a/mvc/build.gradle +++ b/mvc/build.gradle @@ -20,7 +20,7 @@ dependencies { implementation 'org.reflections:reflections:0.9.11' implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.5' - + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.3' testImplementation 'org.mockito:mockito-core:3.12.3' testImplementation 'org.assertj:assertj-core:3.20.2' diff --git a/mvc/src/main/java/nextstep/mvc/view/JsonView.java b/mvc/src/main/java/nextstep/mvc/view/JsonView.java index d54a91987f..18488e46dd 100644 --- a/mvc/src/main/java/nextstep/mvc/view/JsonView.java +++ b/mvc/src/main/java/nextstep/mvc/view/JsonView.java @@ -1,13 +1,25 @@ package nextstep.mvc.view; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; - +import java.io.PrintWriter; import java.util.Map; +import nextstep.web.support.MediaType; public class JsonView implements View { + ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + @Override public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { + response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); + PrintWriter writer = response.getWriter(); + + if (model.size() == 1) { + writer.print(OBJECT_MAPPER.writeValueAsString(model.values().toArray()[0])); + return; + } + writer.print(OBJECT_MAPPER.writeValueAsString(model)); } } From 3cafedba574345f9e996b8c483af42dda51c8986 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Fri, 17 Sep 2021 02:35:51 +0900 Subject: [PATCH 05/15] =?UTF-8?q?refactor:=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=EB=A5=BC=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=20MVC?= =?UTF-8?q?=EB=A1=9C=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 | 10 ++---- .../controller/ForwardController.java | 18 +++++++++++ .../controller/LoginController.java | 31 ++++++++++++++----- .../controller/LoginViewController.java | 26 ---------------- .../controller/LogoutController.java | 12 ++++--- .../{controller => domain}/UserSession.java | 4 +-- 6 files changed, 53 insertions(+), 48 deletions(-) create mode 100644 app/src/main/java/com/techcourse/controller/ForwardController.java delete mode 100644 app/src/main/java/com/techcourse/controller/LoginViewController.java rename app/src/main/java/com/techcourse/{controller => domain}/UserSession.java (87%) diff --git a/app/src/main/java/com/techcourse/ManualHandlerMapping.java b/app/src/main/java/com/techcourse/ManualHandlerMapping.java index f7b691011d..49e77d28a7 100644 --- a/app/src/main/java/com/techcourse/ManualHandlerMapping.java +++ b/app/src/main/java/com/techcourse/ManualHandlerMapping.java @@ -1,16 +1,14 @@ package com.techcourse; -import com.techcourse.controller.*; import jakarta.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; import nextstep.mvc.HandlerMapping; import nextstep.mvc.controller.asis.Controller; import nextstep.mvc.controller.asis.ForwardController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.HashMap; -import java.util.Map; - public class ManualHandlerMapping implements HandlerMapping { private static final Logger log = LoggerFactory.getLogger(ManualHandlerMapping.class); @@ -20,9 +18,7 @@ public class ManualHandlerMapping implements HandlerMapping { @Override public void initialize() { controllers.put("/", new ForwardController("/index.jsp")); - controllers.put("/login", new LoginController()); - controllers.put("/login/view", new LoginViewController()); - controllers.put("/logout", new LogoutController()); +// controllers.put("/logout", new LogoutController()); log.info("Initialized Handler Mapping!"); controllers.keySet().forEach(path -> log.info("Path : {}, Controller : {}", path, controllers.get(path).getClass())); diff --git a/app/src/main/java/com/techcourse/controller/ForwardController.java b/app/src/main/java/com/techcourse/controller/ForwardController.java new file mode 100644 index 0000000000..7439b4cdff --- /dev/null +++ b/app/src/main/java/com/techcourse/controller/ForwardController.java @@ -0,0 +1,18 @@ +package com.techcourse.controller; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import nextstep.mvc.view.JspView; +import nextstep.mvc.view.ModelAndView; +import nextstep.web.annotation.Controller; +import nextstep.web.annotation.RequestMapping; +import nextstep.web.support.RequestMethod; + +@Controller +public class ForwardController { + + @RequestMapping(value = "/", method = RequestMethod.GET) + public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) throws Exception { + return new ModelAndView(new JspView("/index.jsp")); + } +} diff --git a/app/src/main/java/com/techcourse/controller/LoginController.java b/app/src/main/java/com/techcourse/controller/LoginController.java index 089360a000..2468bc29b4 100644 --- a/app/src/main/java/com/techcourse/controller/LoginController.java +++ b/app/src/main/java/com/techcourse/controller/LoginController.java @@ -1,23 +1,38 @@ package com.techcourse.controller; import com.techcourse.domain.User; +import com.techcourse.domain.UserSession; import com.techcourse.repository.InMemoryUserRepository; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; -import nextstep.mvc.controller.asis.Controller; import nextstep.mvc.view.JspView; import nextstep.mvc.view.ModelAndView; import nextstep.mvc.view.View; +import nextstep.web.annotation.Controller; +import nextstep.web.annotation.RequestMapping; +import nextstep.web.support.RequestMethod; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class LoginController implements Controller { +@Controller +public class LoginController { - private static final Logger log = LoggerFactory.getLogger(LoginController.class); + private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class); - @Override - public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) { + @RequestMapping(value = "/login/view", method = RequestMethod.GET) + public ModelAndView view(HttpServletRequest req, HttpServletResponse res) { + return UserSession.getUserFrom(req.getSession()) + .map(user -> { + LOGGER.info("logged in {}", user.getAccount()); + View view = new JspView("redirect:/index.jsp"); + return new ModelAndView(view); + }) + .orElse(new ModelAndView(new JspView("/login.jsp"))); + } + + @RequestMapping(value = "/login", method = RequestMethod.POST) + public ModelAndView login(HttpServletRequest req, HttpServletResponse res) { if (UserSession.isLoggedIn(req.getSession())) { View view = new JspView("redirect:/index.jsp"); return new ModelAndView(view); @@ -25,15 +40,15 @@ public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) { return InMemoryUserRepository.findByAccount(req.getParameter("account")) .map(user -> { - log.info("User : {}", user); - return new ModelAndView(login(req, user)); + LOGGER.info("User : {}", user); + return new ModelAndView(loginCheck(req, user)); }) .orElse(new ModelAndView( new JspView("redirect:/401.jsp") )); } - private View login(HttpServletRequest request, User user) { + private View loginCheck(HttpServletRequest request, User user) { if (user.checkPassword(request.getParameter("password"))) { final HttpSession session = request.getSession(); session.setAttribute(UserSession.SESSION_KEY, user); diff --git a/app/src/main/java/com/techcourse/controller/LoginViewController.java b/app/src/main/java/com/techcourse/controller/LoginViewController.java deleted file mode 100644 index 6ad5f2f515..0000000000 --- a/app/src/main/java/com/techcourse/controller/LoginViewController.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.techcourse.controller; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import nextstep.mvc.controller.asis.Controller; -import nextstep.mvc.view.JspView; -import nextstep.mvc.view.ModelAndView; -import nextstep.mvc.view.View; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class LoginViewController implements Controller { - - private static final Logger log = LoggerFactory.getLogger(LoginViewController.class); - - @Override - public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) { - return UserSession.getUserFrom(req.getSession()) - .map(user -> { - log.info("logged in {}", user.getAccount()); - View view = new JspView("redirect:/index.jsp"); - return new ModelAndView(view); - }) - .orElse(new ModelAndView(new JspView("/login.jsp"))); - } -} diff --git a/app/src/main/java/com/techcourse/controller/LogoutController.java b/app/src/main/java/com/techcourse/controller/LogoutController.java index 197b7be395..bdde04fbc7 100644 --- a/app/src/main/java/com/techcourse/controller/LogoutController.java +++ b/app/src/main/java/com/techcourse/controller/LogoutController.java @@ -1,17 +1,21 @@ package com.techcourse.controller; +import com.techcourse.domain.UserSession; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; -import nextstep.mvc.controller.asis.Controller; import nextstep.mvc.view.JspView; import nextstep.mvc.view.ModelAndView; import nextstep.mvc.view.View; +import nextstep.web.annotation.Controller; +import nextstep.web.annotation.RequestMapping; +import nextstep.web.support.RequestMethod; -public class LogoutController implements Controller { +@Controller +public class LogoutController { - @Override - public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) throws Exception { + @RequestMapping(value = "/logout", method = RequestMethod.GET) + public ModelAndView logout(HttpServletRequest req, HttpServletResponse res) throws Exception { final HttpSession session = req.getSession(); session.removeAttribute(UserSession.SESSION_KEY); View view = new JspView("redirect:/"); diff --git a/app/src/main/java/com/techcourse/controller/UserSession.java b/app/src/main/java/com/techcourse/domain/UserSession.java similarity index 87% rename from app/src/main/java/com/techcourse/controller/UserSession.java rename to app/src/main/java/com/techcourse/domain/UserSession.java index 5a9e03beb3..27c48abef7 100644 --- a/app/src/main/java/com/techcourse/controller/UserSession.java +++ b/app/src/main/java/com/techcourse/domain/UserSession.java @@ -1,8 +1,6 @@ -package com.techcourse.controller; +package com.techcourse.domain; -import com.techcourse.domain.User; import jakarta.servlet.http.HttpSession; - import java.util.Optional; public class UserSession { From 50f304b951c3ed78c24ae5393d50a260c1164c81 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Fri, 17 Sep 2021 02:41:56 +0900 Subject: [PATCH 06/15] =?UTF-8?q?refactor:=20Legacy=20MVC=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppWebApplicationInitializer.java | 2 -- .../com/techcourse/ManualHandlerMapping.java | 33 ------------------- .../adapter/ControllerHandlerAdapter.java | 19 ----------- .../mvc/controller/asis/Controller.java | 9 ----- .../controller/asis/ForwardController.java | 21 ------------ 5 files changed, 84 deletions(-) delete mode 100644 app/src/main/java/com/techcourse/ManualHandlerMapping.java delete mode 100644 mvc/src/main/java/nextstep/mvc/controller/adapter/ControllerHandlerAdapter.java delete mode 100644 mvc/src/main/java/nextstep/mvc/controller/asis/Controller.java delete mode 100644 mvc/src/main/java/nextstep/mvc/controller/asis/ForwardController.java diff --git a/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java b/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java index 48da076fdd..e7fbce11b6 100644 --- a/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java +++ b/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java @@ -4,7 +4,6 @@ import jakarta.servlet.ServletRegistration; import nextstep.mvc.DispatcherServlet; import nextstep.mvc.HandlerMapping; -import nextstep.mvc.controller.adapter.ControllerHandlerAdapter; import nextstep.mvc.controller.adapter.HandlerAdapter; import nextstep.mvc.controller.adapter.HandlerExecutionHandlerAdapter; import nextstep.mvc.controller.tobe.AnnotationHandlerMapping; @@ -21,7 +20,6 @@ public class AppWebApplicationInitializer implements WebApplicationInitializer { public void onStartup(ServletContext servletContext) { final DispatcherServlet dispatcherServlet = new DispatcherServlet(); - addFrameWork(dispatcherServlet, new ManualHandlerMapping(), new ControllerHandlerAdapter()); addFrameWork(dispatcherServlet, new AnnotationHandlerMapping(BASE_PACKAGE), new HandlerExecutionHandlerAdapter()); final ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet); diff --git a/app/src/main/java/com/techcourse/ManualHandlerMapping.java b/app/src/main/java/com/techcourse/ManualHandlerMapping.java deleted file mode 100644 index 49e77d28a7..0000000000 --- a/app/src/main/java/com/techcourse/ManualHandlerMapping.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.techcourse; - -import jakarta.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.Map; -import nextstep.mvc.HandlerMapping; -import nextstep.mvc.controller.asis.Controller; -import nextstep.mvc.controller.asis.ForwardController; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ManualHandlerMapping implements HandlerMapping { - - private static final Logger log = LoggerFactory.getLogger(ManualHandlerMapping.class); - - private static final Map controllers = new HashMap<>(); - - @Override - public void initialize() { - controllers.put("/", new ForwardController("/index.jsp")); -// controllers.put("/logout", new LogoutController()); - - log.info("Initialized Handler Mapping!"); - controllers.keySet().forEach(path -> log.info("Path : {}, Controller : {}", path, controllers.get(path).getClass())); - } - - @Override - public Controller getHandler(HttpServletRequest request) { - final String requestURI = request.getRequestURI(); - log.debug("Request Mapping Uri : {}", requestURI); - return controllers.get(requestURI); - } -} diff --git a/mvc/src/main/java/nextstep/mvc/controller/adapter/ControllerHandlerAdapter.java b/mvc/src/main/java/nextstep/mvc/controller/adapter/ControllerHandlerAdapter.java deleted file mode 100644 index 7c47734aa9..0000000000 --- a/mvc/src/main/java/nextstep/mvc/controller/adapter/ControllerHandlerAdapter.java +++ /dev/null @@ -1,19 +0,0 @@ -package nextstep.mvc.controller.adapter; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import nextstep.mvc.controller.asis.Controller; -import nextstep.mvc.view.ModelAndView; - -public class ControllerHandlerAdapter implements HandlerAdapter { - - @Override - public boolean supports(final Object handler) { - return handler instanceof Controller; - } - - @Override - public ModelAndView handle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception { - return ((Controller) handler).execute(request, response); - } -} diff --git a/mvc/src/main/java/nextstep/mvc/controller/asis/Controller.java b/mvc/src/main/java/nextstep/mvc/controller/asis/Controller.java deleted file mode 100644 index 28e4963059..0000000000 --- a/mvc/src/main/java/nextstep/mvc/controller/asis/Controller.java +++ /dev/null @@ -1,9 +0,0 @@ -package nextstep.mvc.controller.asis; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import nextstep.mvc.view.ModelAndView; - -public interface Controller { - ModelAndView execute(HttpServletRequest req, HttpServletResponse res) throws Exception; -} diff --git a/mvc/src/main/java/nextstep/mvc/controller/asis/ForwardController.java b/mvc/src/main/java/nextstep/mvc/controller/asis/ForwardController.java deleted file mode 100644 index 6088a55ffc..0000000000 --- a/mvc/src/main/java/nextstep/mvc/controller/asis/ForwardController.java +++ /dev/null @@ -1,21 +0,0 @@ -package nextstep.mvc.controller.asis; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.util.Objects; -import nextstep.mvc.view.JspView; -import nextstep.mvc.view.ModelAndView; - -public class ForwardController implements Controller { - - private final String path; - - public ForwardController(String path) { - this.path = Objects.requireNonNull(path); - } - - @Override - public ModelAndView execute(HttpServletRequest request, HttpServletResponse response) { - return new ModelAndView(new JspView(path)); - } -} From 834708f44b993ff88ce293c33c60d8e7ad8c61aa Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Fri, 17 Sep 2021 02:52:59 +0900 Subject: [PATCH 07/15] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=ED=8F=AC=EB=A7=A4=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/techcourse/JwpApplication.java | 11 ++++---- .../controller/MultiInputController.java | 2 +- .../controller/RegisterController.java | 5 ++-- .../techcourse/controller/UserController.java | 2 +- .../main/java/com/techcourse/domain/User.java | 8 +++--- .../com/techcourse/domain/UserSession.java | 3 ++- .../repository/InMemoryUserRepository.java | 4 +-- .../web/filter/CharacterEncodingFilter.java | 10 ++++--- .../support/web/filter/ResourceFilter.java | 27 +++++++++++-------- app/src/main/resources/logback.xml | 18 ++++++------- .../controller/adapter/HandlerAdapter.java | 4 +-- mvc/src/main/java/nextstep/mvc/view/View.java | 2 +- .../NextstepServletContainerInitializer.java | 1 - .../web/WebApplicationInitializer.java | 1 + .../nextstep/web/annotation/Controller.java | 1 + .../nextstep/web/annotation/PathVariable.java | 7 ++++- .../web/annotation/RequestMapping.java | 4 +-- .../nextstep/web/annotation/RequestParam.java | 7 ++++- .../java/nextstep/web/support/MediaType.java | 1 + .../mvc/controller/ControllerScannerTest.java | 2 +- .../tobe/AnnotationHandlerMappingTest.java | 8 +++--- 21 files changed, 75 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/com/techcourse/JwpApplication.java b/app/src/main/java/com/techcourse/JwpApplication.java index fe11fe4e34..0eed065cbd 100644 --- a/app/src/main/java/com/techcourse/JwpApplication.java +++ b/app/src/main/java/com/techcourse/JwpApplication.java @@ -1,14 +1,13 @@ package com.techcourse; +import java.io.File; +import java.util.stream.Stream; import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.catalina.startup.Tomcat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.util.stream.Stream; - public class JwpApplication { private static final Logger log = LoggerFactory.getLogger(JwpApplication.class); @@ -31,9 +30,9 @@ public static void main(String[] args) throws Exception { private static int defaultPortIfNull(String[] args) { return Stream.of(args) - .findFirst() - .map(Integer::parseInt) - .orElse(DEFAULT_PORT); + .findFirst() + .map(Integer::parseInt) + .orElse(DEFAULT_PORT); } private static Context addWebapp(Tomcat tomcat) { diff --git a/app/src/main/java/com/techcourse/controller/MultiInputController.java b/app/src/main/java/com/techcourse/controller/MultiInputController.java index ee14fa80ec..f3463d7899 100644 --- a/app/src/main/java/com/techcourse/controller/MultiInputController.java +++ b/app/src/main/java/com/techcourse/controller/MultiInputController.java @@ -29,4 +29,4 @@ public ModelAndView show(HttpServletRequest request, HttpServletResponse respons modelAndView.addObject("input2", input2); return modelAndView; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/techcourse/controller/RegisterController.java b/app/src/main/java/com/techcourse/controller/RegisterController.java index ee33e8a566..25afdfcef9 100644 --- a/app/src/main/java/com/techcourse/controller/RegisterController.java +++ b/app/src/main/java/com/techcourse/controller/RegisterController.java @@ -13,13 +13,14 @@ @Controller public class RegisterController { - + @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView save(final HttpServletRequest req, final HttpServletResponse res) { User user = new User(2, req.getParameter("account"), req.getParameter("password"), - req.getParameter("email")); + req.getParameter("email") + ); InMemoryUserRepository.save(user); return new ModelAndView(new JspView("redirect:/index.jsp")); diff --git a/app/src/main/java/com/techcourse/controller/UserController.java b/app/src/main/java/com/techcourse/controller/UserController.java index a241192a48..e7ead6eb4c 100644 --- a/app/src/main/java/com/techcourse/controller/UserController.java +++ b/app/src/main/java/com/techcourse/controller/UserController.java @@ -29,4 +29,4 @@ public ModelAndView show(HttpServletRequest request, HttpServletResponse respons modelAndView.addObject("user", user); return modelAndView; } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/techcourse/domain/User.java b/app/src/main/java/com/techcourse/domain/User.java index e7bea58157..877901a6f2 100644 --- a/app/src/main/java/com/techcourse/domain/User.java +++ b/app/src/main/java/com/techcourse/domain/User.java @@ -25,10 +25,10 @@ public String getAccount() { @Override public String toString() { return "User{" + - "id=" + id + - ", account='" + account + '\'' + - ", email='" + email + '\'' + - '}'; + "id=" + id + + ", account='" + account + '\'' + + ", email='" + email + '\'' + + '}'; } public long getId() { diff --git a/app/src/main/java/com/techcourse/domain/UserSession.java b/app/src/main/java/com/techcourse/domain/UserSession.java index 27c48abef7..00e932b595 100644 --- a/app/src/main/java/com/techcourse/domain/UserSession.java +++ b/app/src/main/java/com/techcourse/domain/UserSession.java @@ -16,5 +16,6 @@ public static boolean isLoggedIn(HttpSession session) { return getUserFrom(session).isPresent(); } - private UserSession() {} + private UserSession() { + } } diff --git a/app/src/main/java/com/techcourse/repository/InMemoryUserRepository.java b/app/src/main/java/com/techcourse/repository/InMemoryUserRepository.java index b192d2a89d..ea936d48f3 100644 --- a/app/src/main/java/com/techcourse/repository/InMemoryUserRepository.java +++ b/app/src/main/java/com/techcourse/repository/InMemoryUserRepository.java @@ -1,7 +1,6 @@ package com.techcourse.repository; import com.techcourse.domain.User; - import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; @@ -23,5 +22,6 @@ public static Optional findByAccount(String account) { return Optional.ofNullable(database.get(account)); } - private InMemoryUserRepository() {} + private InMemoryUserRepository() { + } } diff --git a/app/src/main/java/com/techcourse/support/web/filter/CharacterEncodingFilter.java b/app/src/main/java/com/techcourse/support/web/filter/CharacterEncodingFilter.java index 217e63f8aa..b34fafe5db 100644 --- a/app/src/main/java/com/techcourse/support/web/filter/CharacterEncodingFilter.java +++ b/app/src/main/java/com/techcourse/support/web/filter/CharacterEncodingFilter.java @@ -1,8 +1,12 @@ package com.techcourse.support.web.filter; -import jakarta.servlet.*; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import jakarta.servlet.annotation.WebFilter; - import java.io.IOException; @WebFilter("/*") @@ -16,7 +20,7 @@ public void init(FilterConfig filterConfig) { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { + throws IOException, ServletException { request.setCharacterEncoding(DEFAULT_ENCODING); response.setCharacterEncoding(DEFAULT_ENCODING); chain.doFilter(request, response); diff --git a/app/src/main/java/com/techcourse/support/web/filter/ResourceFilter.java b/app/src/main/java/com/techcourse/support/web/filter/ResourceFilter.java index 5fd011dcea..9fab6d87f1 100644 --- a/app/src/main/java/com/techcourse/support/web/filter/ResourceFilter.java +++ b/app/src/main/java/com/techcourse/support/web/filter/ResourceFilter.java @@ -1,15 +1,20 @@ package com.techcourse.support.web.filter; -import jakarta.servlet.*; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.HttpServletRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @WebFilter("/*") public class ResourceFilter implements Filter { @@ -20,12 +25,12 @@ public class ResourceFilter implements Filter { static { resourcePrefixs.addAll(Arrays.asList( - "/css", - "/js", - "/assets", - "/fonts", - "/images", - "/favicon.ico" + "/css", + "/js", + "/assets", + "/fonts", + "/images", + "/favicon.ico" )); } @@ -38,7 +43,7 @@ public void init(FilterConfig filterConfig) { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { + throws IOException, ServletException { final HttpServletRequest req = (HttpServletRequest) request; final String path = req.getRequestURI().substring(req.getContextPath().length()); if (isResourceUrl(path)) { diff --git a/app/src/main/resources/logback.xml b/app/src/main/resources/logback.xml index 60de063540..4fefe1e333 100644 --- a/app/src/main/resources/logback.xml +++ b/app/src/main/resources/logback.xml @@ -1,15 +1,15 @@ - - - %d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n - - + + + %d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n + + - + - - - + + + \ No newline at end of file diff --git a/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapter.java b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapter.java index 54804d0506..d7a2c0603e 100644 --- a/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapter.java +++ b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapter.java @@ -1,11 +1,11 @@ package nextstep.mvc.controller.adapter; -import nextstep.mvc.view.ModelAndView; - import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import nextstep.mvc.view.ModelAndView; public interface HandlerAdapter { + boolean supports(Object handler); ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; diff --git a/mvc/src/main/java/nextstep/mvc/view/View.java b/mvc/src/main/java/nextstep/mvc/view/View.java index 493ed75c64..2d42f73bdb 100644 --- a/mvc/src/main/java/nextstep/mvc/view/View.java +++ b/mvc/src/main/java/nextstep/mvc/view/View.java @@ -2,9 +2,9 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; - import java.util.Map; public interface View { + void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception; } diff --git a/mvc/src/main/java/nextstep/web/NextstepServletContainerInitializer.java b/mvc/src/main/java/nextstep/web/NextstepServletContainerInitializer.java index f6d8bf4567..7d1798cb2a 100644 --- a/mvc/src/main/java/nextstep/web/NextstepServletContainerInitializer.java +++ b/mvc/src/main/java/nextstep/web/NextstepServletContainerInitializer.java @@ -4,7 +4,6 @@ import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.HandlesTypes; - import java.util.LinkedList; import java.util.List; import java.util.Set; diff --git a/mvc/src/main/java/nextstep/web/WebApplicationInitializer.java b/mvc/src/main/java/nextstep/web/WebApplicationInitializer.java index 60e6a89543..4f64bc1d47 100644 --- a/mvc/src/main/java/nextstep/web/WebApplicationInitializer.java +++ b/mvc/src/main/java/nextstep/web/WebApplicationInitializer.java @@ -4,5 +4,6 @@ import jakarta.servlet.ServletException; public interface WebApplicationInitializer { + void onStartup(ServletContext servletContext) throws ServletException; } diff --git a/mvc/src/main/java/nextstep/web/annotation/Controller.java b/mvc/src/main/java/nextstep/web/annotation/Controller.java index cb264235b4..6a9bbcf428 100644 --- a/mvc/src/main/java/nextstep/web/annotation/Controller.java +++ b/mvc/src/main/java/nextstep/web/annotation/Controller.java @@ -8,6 +8,7 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Controller { + String value() default ""; String path() default ""; diff --git a/mvc/src/main/java/nextstep/web/annotation/PathVariable.java b/mvc/src/main/java/nextstep/web/annotation/PathVariable.java index 4f2a9b50a5..99c4ce7fd0 100644 --- a/mvc/src/main/java/nextstep/web/annotation/PathVariable.java +++ b/mvc/src/main/java/nextstep/web/annotation/PathVariable.java @@ -1,11 +1,16 @@ package nextstep.web.annotation; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface PathVariable { + String value() default ""; String name() default ""; diff --git a/mvc/src/main/java/nextstep/web/annotation/RequestMapping.java b/mvc/src/main/java/nextstep/web/annotation/RequestMapping.java index bb8c9e6e7b..8e3dc94bec 100644 --- a/mvc/src/main/java/nextstep/web/annotation/RequestMapping.java +++ b/mvc/src/main/java/nextstep/web/annotation/RequestMapping.java @@ -1,15 +1,15 @@ package nextstep.web.annotation; -import nextstep.web.support.RequestMethod; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import nextstep.web.support.RequestMethod; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface RequestMapping { + String value() default ""; RequestMethod[] method() default {}; diff --git a/mvc/src/main/java/nextstep/web/annotation/RequestParam.java b/mvc/src/main/java/nextstep/web/annotation/RequestParam.java index 2813247c4a..6bfb71425e 100644 --- a/mvc/src/main/java/nextstep/web/annotation/RequestParam.java +++ b/mvc/src/main/java/nextstep/web/annotation/RequestParam.java @@ -1,11 +1,16 @@ package nextstep.web.annotation; -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParam { + String value() default ""; String name() default ""; diff --git a/mvc/src/main/java/nextstep/web/support/MediaType.java b/mvc/src/main/java/nextstep/web/support/MediaType.java index f881e02174..6a26352ef3 100644 --- a/mvc/src/main/java/nextstep/web/support/MediaType.java +++ b/mvc/src/main/java/nextstep/web/support/MediaType.java @@ -1,5 +1,6 @@ package nextstep.web.support; public class MediaType { + public static final String APPLICATION_JSON_UTF8_VALUE = "application/json;charset=UTF-8"; } diff --git a/mvc/src/test/java/nextstep/mvc/controller/ControllerScannerTest.java b/mvc/src/test/java/nextstep/mvc/controller/ControllerScannerTest.java index 096d631c5d..3046839d15 100644 --- a/mvc/src/test/java/nextstep/mvc/controller/ControllerScannerTest.java +++ b/mvc/src/test/java/nextstep/mvc/controller/ControllerScannerTest.java @@ -26,4 +26,4 @@ private void annotationClassesCheck(final Set> typesAnnotatedWithContro assertThat(controllerNames).containsExactlyInAnyOrderElementsOf(classNames); } -} \ No newline at end of file +} diff --git a/mvc/src/test/java/nextstep/mvc/controller/tobe/AnnotationHandlerMappingTest.java b/mvc/src/test/java/nextstep/mvc/controller/tobe/AnnotationHandlerMappingTest.java index acb134f8d1..46a563a702 100644 --- a/mvc/src/test/java/nextstep/mvc/controller/tobe/AnnotationHandlerMappingTest.java +++ b/mvc/src/test/java/nextstep/mvc/controller/tobe/AnnotationHandlerMappingTest.java @@ -1,15 +1,15 @@ package nextstep.mvc.controller.tobe; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import nextstep.mvc.view.ModelAndView; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - class AnnotationHandlerMappingTest { private AnnotationHandlerMapping handlerMapping; From 14eb85c28a0ee224e9b7815028f53ef848a17a93 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Mon, 20 Sep 2021 17:36:21 +0900 Subject: [PATCH 08/15] =?UTF-8?q?refactor:=20=EC=A4=91=EB=B3=B5=EB=90=98?= =?UTF-8?q?=EB=8A=94=20Viewname=EC=9D=84=20Enum=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ForwardController.java | 3 ++- .../controller/LoginController.java | 21 +++++++++---------- .../controller/RegisterController.java | 6 +++--- .../techcourse/controller/TestController.java | 5 +++-- .../java/nextstep/web/support/JspPage.java | 20 ++++++++++++++++++ 5 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 mvc/src/main/java/nextstep/web/support/JspPage.java diff --git a/app/src/main/java/com/techcourse/controller/ForwardController.java b/app/src/main/java/com/techcourse/controller/ForwardController.java index 7439b4cdff..3f9f8c395f 100644 --- a/app/src/main/java/com/techcourse/controller/ForwardController.java +++ b/app/src/main/java/com/techcourse/controller/ForwardController.java @@ -6,6 +6,7 @@ import nextstep.mvc.view.ModelAndView; import nextstep.web.annotation.Controller; import nextstep.web.annotation.RequestMapping; +import nextstep.web.support.JspPage; import nextstep.web.support.RequestMethod; @Controller @@ -13,6 +14,6 @@ public class ForwardController { @RequestMapping(value = "/", method = RequestMethod.GET) public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) throws Exception { - return new ModelAndView(new JspView("/index.jsp")); + return new ModelAndView(new JspView(JspPage.INDEX.value())); } } diff --git a/app/src/main/java/com/techcourse/controller/LoginController.java b/app/src/main/java/com/techcourse/controller/LoginController.java index 2468bc29b4..a469b98e27 100644 --- a/app/src/main/java/com/techcourse/controller/LoginController.java +++ b/app/src/main/java/com/techcourse/controller/LoginController.java @@ -11,6 +11,7 @@ import nextstep.mvc.view.View; import nextstep.web.annotation.Controller; import nextstep.web.annotation.RequestMapping; +import nextstep.web.support.JspPage; import nextstep.web.support.RequestMethod; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,19 +23,17 @@ public class LoginController { @RequestMapping(value = "/login/view", method = RequestMethod.GET) public ModelAndView view(HttpServletRequest req, HttpServletResponse res) { - return UserSession.getUserFrom(req.getSession()) - .map(user -> { - LOGGER.info("logged in {}", user.getAccount()); - View view = new JspView("redirect:/index.jsp"); - return new ModelAndView(view); - }) - .orElse(new ModelAndView(new JspView("/login.jsp"))); + if (UserSession.isLoggedIn(req.getSession())) { + View view = new JspView(JspPage.INDEX.value()); + return new ModelAndView(view); + } + return new ModelAndView(new JspView(JspPage.LOGIN.value())); } @RequestMapping(value = "/login", method = RequestMethod.POST) public ModelAndView login(HttpServletRequest req, HttpServletResponse res) { if (UserSession.isLoggedIn(req.getSession())) { - View view = new JspView("redirect:/index.jsp"); + View view = new JspView(String.format("redirect:%s", JspPage.INDEX.value())); return new ModelAndView(view); } @@ -44,7 +43,7 @@ public ModelAndView login(HttpServletRequest req, HttpServletResponse res) { return new ModelAndView(loginCheck(req, user)); }) .orElse(new ModelAndView( - new JspView("redirect:/401.jsp") + new JspView(String.format("redirect:%s", JspPage.UNAUTHORIZED.value())) )); } @@ -52,9 +51,9 @@ private View loginCheck(HttpServletRequest request, User user) { if (user.checkPassword(request.getParameter("password"))) { final HttpSession session = request.getSession(); session.setAttribute(UserSession.SESSION_KEY, user); - return new JspView("redirect:/index.jsp"); + return new JspView(String.format("redirect:%s", JspPage.INDEX.value())); } else { - return new JspView("redirect:/401.jsp"); + return new JspView(String.format("redirect:%s", JspPage.UNAUTHORIZED.value())); } } } diff --git a/app/src/main/java/com/techcourse/controller/RegisterController.java b/app/src/main/java/com/techcourse/controller/RegisterController.java index 25afdfcef9..5562dd6225 100644 --- a/app/src/main/java/com/techcourse/controller/RegisterController.java +++ b/app/src/main/java/com/techcourse/controller/RegisterController.java @@ -9,6 +9,7 @@ import nextstep.mvc.view.ModelAndView; import nextstep.web.annotation.Controller; import nextstep.web.annotation.RequestMapping; +import nextstep.web.support.JspPage; import nextstep.web.support.RequestMethod; @Controller @@ -22,12 +23,11 @@ public ModelAndView save(final HttpServletRequest req, final HttpServletResponse req.getParameter("email") ); InMemoryUserRepository.save(user); - - return new ModelAndView(new JspView("redirect:/index.jsp")); + return new ModelAndView(new JspView(String.format("redirect:%s", JspPage.INDEX.value()))); } @RequestMapping(value = "/register/view", method = RequestMethod.GET) public ModelAndView show(final HttpServletRequest req, final HttpServletResponse res) { - return new ModelAndView(new JspView("/register.jsp")); + return new ModelAndView(new JspView(JspPage.REGISTER.value())); } } \ No newline at end of file diff --git a/app/src/main/java/com/techcourse/controller/TestController.java b/app/src/main/java/com/techcourse/controller/TestController.java index b746b86f0b..a279ecf355 100644 --- a/app/src/main/java/com/techcourse/controller/TestController.java +++ b/app/src/main/java/com/techcourse/controller/TestController.java @@ -6,6 +6,7 @@ import nextstep.mvc.view.ModelAndView; import nextstep.web.annotation.Controller; import nextstep.web.annotation.RequestMapping; +import nextstep.web.support.JspPage; import nextstep.web.support.RequestMethod; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,7 +19,7 @@ public class TestController { @RequestMapping(value = "/get-test", method = RequestMethod.GET) public ModelAndView findUserId(final HttpServletRequest request, final HttpServletResponse response) { LOGGER.info("test controller get method"); - ModelAndView modelAndView = new ModelAndView(new JspView("/get-test.jsp")); + ModelAndView modelAndView = new ModelAndView(new JspView(JspPage.GET_TEST.value())); modelAndView.addObject("id", request.getAttribute("id")); return modelAndView; } @@ -26,7 +27,7 @@ public ModelAndView findUserId(final HttpServletRequest request, final HttpServl @RequestMapping(value = "/post-test", method = RequestMethod.POST) public ModelAndView save(final HttpServletRequest request, final HttpServletResponse response) { LOGGER.info("test controller post method"); - ModelAndView modelAndView = new ModelAndView(new JspView("/post-test.jsp")); + ModelAndView modelAndView = new ModelAndView(new JspView(JspPage.POST_TEST.value())); modelAndView.addObject("id", request.getAttribute("id")); return modelAndView; } diff --git a/mvc/src/main/java/nextstep/web/support/JspPage.java b/mvc/src/main/java/nextstep/web/support/JspPage.java new file mode 100644 index 0000000000..d2c74eb172 --- /dev/null +++ b/mvc/src/main/java/nextstep/web/support/JspPage.java @@ -0,0 +1,20 @@ +package nextstep.web.support; + +public enum JspPage { + INDEX("/index.jsp"), + LOGIN("/login.jsp"), + REGISTER("/register.jsp"), + UNAUTHORIZED("/401.jsp"), + GET_TEST("/get-test.jsp"), + POST_TEST("/post-test.jsp"); + + private final String page; + + JspPage(final String page) { + this.page = page; + } + + public String value() { + return page; + } +} From 5faa6c5d8d113868e150385ddcdb45ba7becbe38 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Mon, 20 Sep 2021 17:42:08 +0900 Subject: [PATCH 09/15] =?UTF-8?q?refactor:=20GET,=20=20POST=20=EC=88=9C?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/controller/RegisterController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/techcourse/controller/RegisterController.java b/app/src/main/java/com/techcourse/controller/RegisterController.java index 5562dd6225..7dc75d10ce 100644 --- a/app/src/main/java/com/techcourse/controller/RegisterController.java +++ b/app/src/main/java/com/techcourse/controller/RegisterController.java @@ -15,6 +15,11 @@ @Controller public class RegisterController { + @RequestMapping(value = "/register/view", method = RequestMethod.GET) + public ModelAndView show(final HttpServletRequest req, final HttpServletResponse res) { + return new ModelAndView(new JspView(JspPage.REGISTER.value())); + } + @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView save(final HttpServletRequest req, final HttpServletResponse res) { User user = new User(2, @@ -25,9 +30,4 @@ public ModelAndView save(final HttpServletRequest req, final HttpServletResponse InMemoryUserRepository.save(user); return new ModelAndView(new JspView(String.format("redirect:%s", JspPage.INDEX.value()))); } - - @RequestMapping(value = "/register/view", method = RequestMethod.GET) - public ModelAndView show(final HttpServletRequest req, final HttpServletResponse res) { - return new ModelAndView(new JspView(JspPage.REGISTER.value())); - } } \ No newline at end of file From a847513c1eed81936b50829121a4319d1e13f9d7 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Mon, 20 Sep 2021 17:43:12 +0900 Subject: [PATCH 10/15] =?UTF-8?q?refactor:=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/techcourse/domain/UserSession.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/techcourse/domain/UserSession.java b/app/src/main/java/com/techcourse/domain/UserSession.java index 00e932b595..a326c47375 100644 --- a/app/src/main/java/com/techcourse/domain/UserSession.java +++ b/app/src/main/java/com/techcourse/domain/UserSession.java @@ -7,6 +7,9 @@ public class UserSession { public static final String SESSION_KEY = "user"; + private UserSession() { + } + public static Optional getUserFrom(HttpSession session) { final User user = (User) session.getAttribute(SESSION_KEY); return Optional.ofNullable(user); @@ -15,7 +18,4 @@ public static Optional getUserFrom(HttpSession session) { public static boolean isLoggedIn(HttpSession session) { return getUserFrom(session).isPresent(); } - - private UserSession() { - } } From 53ead6439b49163cc76c8a0d160f7f6ec5d4d2f8 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Mon, 20 Sep 2021 17:43:51 +0900 Subject: [PATCH 11/15] =?UTF-8?q?refactor:=20=EB=B9=A0=EC=A0=B8=EC=9E=88?= =?UTF-8?q?=EB=8D=98=20=EC=A0=91=EA=B7=BC=EC=A0=9C=EC=96=B4=EC=9E=90=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 --- mvc/src/main/java/nextstep/mvc/view/JsonView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mvc/src/main/java/nextstep/mvc/view/JsonView.java b/mvc/src/main/java/nextstep/mvc/view/JsonView.java index 18488e46dd..4411a11718 100644 --- a/mvc/src/main/java/nextstep/mvc/view/JsonView.java +++ b/mvc/src/main/java/nextstep/mvc/view/JsonView.java @@ -9,7 +9,7 @@ public class JsonView implements View { - ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); @Override public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { From 5ffc626daf8e52707157a559f377abb0243eed63 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Mon, 20 Sep 2021 18:11:28 +0900 Subject: [PATCH 12/15] =?UTF-8?q?refactor:=20HandlerMappings=20=EC=9D=BC?= =?UTF-8?q?=EA=B8=89=EC=BB=AC=EB=A0=89=EC=85=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppWebApplicationInitializer.java | 2 +- .../java/nextstep/mvc/DispatcherServlet.java | 19 ++++-------- .../handler}/HandlerMapping.java | 2 +- .../controller/handler/HandlerMappings.java | 31 +++++++++++++++++++ .../tobe/AnnotationHandlerMapping.java | 2 +- 5 files changed, 40 insertions(+), 16 deletions(-) rename mvc/src/main/java/nextstep/mvc/{ => controller/handler}/HandlerMapping.java (79%) create mode 100644 mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMappings.java diff --git a/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java b/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java index e7fbce11b6..a821d60e25 100644 --- a/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java +++ b/app/src/main/java/com/techcourse/AppWebApplicationInitializer.java @@ -3,7 +3,7 @@ import jakarta.servlet.ServletContext; import jakarta.servlet.ServletRegistration; import nextstep.mvc.DispatcherServlet; -import nextstep.mvc.HandlerMapping; +import nextstep.mvc.controller.handler.HandlerMapping; import nextstep.mvc.controller.adapter.HandlerAdapter; import nextstep.mvc.controller.adapter.HandlerExecutionHandlerAdapter; import nextstep.mvc.controller.tobe.AnnotationHandlerMapping; diff --git a/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java b/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java index b66139d65a..59bf5e431b 100644 --- a/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java +++ b/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java @@ -6,8 +6,9 @@ import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import nextstep.mvc.controller.adapter.HandlerAdapter; +import nextstep.mvc.controller.handler.HandlerMapping; +import nextstep.mvc.controller.handler.HandlerMappings; import nextstep.mvc.view.ModelAndView; import nextstep.mvc.view.View; import org.slf4j.Logger; @@ -18,17 +19,17 @@ public class DispatcherServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger LOGGER = LoggerFactory.getLogger(DispatcherServlet.class); - private final List handlerMappings; + private final HandlerMappings handlerMappings; private final List handlerAdapters; public DispatcherServlet() { - handlerMappings = new ArrayList<>(); + handlerMappings = new HandlerMappings(); handlerAdapters = new ArrayList<>(); } @Override public void init() { - handlerMappings.forEach(HandlerMapping::initialize); + handlerMappings.initialize(); } public void addHandlerAdapter(final HandlerAdapter handlerAdapter) { @@ -44,7 +45,7 @@ protected void service(HttpServletRequest request, HttpServletResponse response) LOGGER.debug("Method : {}, Request URI : {}", request.getMethod(), request.getRequestURI()); try { - Object handler = getHandlerMapping(request); + Object handler = handlerMappings.getHandlerMapping(request); for (HandlerAdapter handlerAdapter : handlerAdapters) { if (handlerAdapter.supports(handler)) { viewRender(request, response, handler, handlerAdapter); @@ -64,12 +65,4 @@ private void viewRender(final HttpServletRequest request, final HttpServletRespo View view = modelAndView.getView(); view.render(modelAndView.getModel(), request, response); } - - private Object getHandlerMapping(final HttpServletRequest request) { - return handlerMappings.stream() - .map(handlerMapping -> handlerMapping.getHandler(request)) - .filter(Objects::nonNull) - .findFirst() - .orElseThrow(); - } } diff --git a/mvc/src/main/java/nextstep/mvc/HandlerMapping.java b/mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMapping.java similarity index 79% rename from mvc/src/main/java/nextstep/mvc/HandlerMapping.java rename to mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMapping.java index 7da7184209..63df96eb0b 100644 --- a/mvc/src/main/java/nextstep/mvc/HandlerMapping.java +++ b/mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMapping.java @@ -1,4 +1,4 @@ -package nextstep.mvc; +package nextstep.mvc.controller.handler; import jakarta.servlet.http.HttpServletRequest; diff --git a/mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMappings.java b/mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMappings.java new file mode 100644 index 0000000000..480d7981b2 --- /dev/null +++ b/mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMappings.java @@ -0,0 +1,31 @@ +package nextstep.mvc.controller.handler; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class HandlerMappings { + + private final List handlerMappings; + + public HandlerMappings() { + this.handlerMappings = new ArrayList<>(); + } + + public void initialize() { + handlerMappings.forEach(HandlerMapping::initialize); + } + + public void add(final HandlerMapping handlerMapping) { + handlerMappings.add(handlerMapping); + } + + public Object getHandlerMapping(final HttpServletRequest request) { + return handlerMappings.stream() + .map(handlerMapping -> handlerMapping.getHandler(request)) + .filter(Objects::nonNull) + .findFirst() + .orElseThrow(); + } +} diff --git a/mvc/src/main/java/nextstep/mvc/controller/tobe/AnnotationHandlerMapping.java b/mvc/src/main/java/nextstep/mvc/controller/tobe/AnnotationHandlerMapping.java index e94dee80ca..d791d151d9 100644 --- a/mvc/src/main/java/nextstep/mvc/controller/tobe/AnnotationHandlerMapping.java +++ b/mvc/src/main/java/nextstep/mvc/controller/tobe/AnnotationHandlerMapping.java @@ -5,7 +5,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -import nextstep.mvc.HandlerMapping; +import nextstep.mvc.controller.handler.HandlerMapping; import nextstep.mvc.controller.ControllerScanner; import nextstep.web.annotation.Controller; import nextstep.web.annotation.RequestMapping; From 9a1dd20f795a87d073dca74da161a3741b3a7281 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Mon, 20 Sep 2021 18:21:51 +0900 Subject: [PATCH 13/15] =?UTF-8?q?refactor:=20HandlerAdapters=20=EC=9D=BC?= =?UTF-8?q?=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/mvc/DispatcherServlet.java | 16 ++++--------- .../controller/adapter/HandlerAdapters.java | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapters.java diff --git a/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java b/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java index 59bf5e431b..ab17d4305c 100644 --- a/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java +++ b/mvc/src/main/java/nextstep/mvc/DispatcherServlet.java @@ -4,9 +4,8 @@ import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.List; import nextstep.mvc.controller.adapter.HandlerAdapter; +import nextstep.mvc.controller.adapter.HandlerAdapters; import nextstep.mvc.controller.handler.HandlerMapping; import nextstep.mvc.controller.handler.HandlerMappings; import nextstep.mvc.view.ModelAndView; @@ -20,11 +19,11 @@ public class DispatcherServlet extends HttpServlet { private static final Logger LOGGER = LoggerFactory.getLogger(DispatcherServlet.class); private final HandlerMappings handlerMappings; - private final List handlerAdapters; + private final HandlerAdapters handlerAdapters; public DispatcherServlet() { handlerMappings = new HandlerMappings(); - handlerAdapters = new ArrayList<>(); + handlerAdapters = new HandlerAdapters(); } @Override @@ -46,13 +45,8 @@ protected void service(HttpServletRequest request, HttpServletResponse response) try { Object handler = handlerMappings.getHandlerMapping(request); - for (HandlerAdapter handlerAdapter : handlerAdapters) { - if (handlerAdapter.supports(handler)) { - viewRender(request, response, handler, handlerAdapter); - return; - } - } - throw new Exception("맞는 핸들러가 없습니다."); + HandlerAdapter handlerAdapter = handlerAdapters.getHandlerAdapter(handler); + viewRender(request, response, handler, handlerAdapter); } catch (Exception e) { LOGGER.error("Exception : {}", e.getMessage(), e); throw new ServletException(e.getMessage()); diff --git a/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapters.java b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapters.java new file mode 100644 index 0000000000..eb17067b43 --- /dev/null +++ b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapters.java @@ -0,0 +1,24 @@ +package nextstep.mvc.controller.adapter; + +import java.util.ArrayList; +import java.util.List; + +public class HandlerAdapters { + + private final List handlerAdapters; + + public HandlerAdapters() { + this.handlerAdapters = new ArrayList<>(); + } + + public void add(final HandlerAdapter handlerAdapter) { + handlerAdapters.add(handlerAdapter); + } + + public HandlerAdapter getHandlerAdapter(final Object handler) { + return handlerAdapters.stream() + .filter(handlerAdapter -> handlerAdapter.supports(handler)) + .findFirst() + .orElseThrow(); + } +} From e1c19b3e639201cc9a6fe8a4a2c52b18a59a0477 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Mon, 20 Sep 2021 18:25:16 +0900 Subject: [PATCH 14/15] =?UTF-8?q?refactor:=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/mvc/controller/adapter/HandlerAdapters.java | 2 +- .../java/nextstep/mvc/controller/handler/HandlerMappings.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapters.java b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapters.java index eb17067b43..bdde185b4f 100644 --- a/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapters.java +++ b/mvc/src/main/java/nextstep/mvc/controller/adapter/HandlerAdapters.java @@ -19,6 +19,6 @@ public HandlerAdapter getHandlerAdapter(final Object handler) { return handlerAdapters.stream() .filter(handlerAdapter -> handlerAdapter.supports(handler)) .findFirst() - .orElseThrow(); + .orElseThrow(() -> new IllegalArgumentException("맞는 핸들러가 없습니다.")); } } diff --git a/mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMappings.java b/mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMappings.java index 480d7981b2..f41a45985f 100644 --- a/mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMappings.java +++ b/mvc/src/main/java/nextstep/mvc/controller/handler/HandlerMappings.java @@ -26,6 +26,6 @@ public Object getHandlerMapping(final HttpServletRequest request) { .map(handlerMapping -> handlerMapping.getHandler(request)) .filter(Objects::nonNull) .findFirst() - .orElseThrow(); + .orElseThrow(() -> new IllegalArgumentException("맞는 핸들러가 없습니다.")); } } From a4caf77cf5744cff4fcc6e4900a1d09383fa0559 Mon Sep 17 00:00:00 2001 From: unluckyjung Date: Mon, 20 Sep 2021 18:54:19 +0900 Subject: [PATCH 15/15] =?UTF-8?q?refactor:=20=EB=A6=AC=EB=8B=A4=EC=9D=B4?= =?UTF-8?q?=EB=9E=99=ED=8C=85=EB=8F=84=20Enum=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/techcourse/controller/ForwardController.java | 2 +- .../java/com/techcourse/controller/LoginController.java | 8 ++++---- .../java/com/techcourse/controller/LogoutController.java | 2 +- mvc/src/main/java/nextstep/web/support/JspPage.java | 4 ++++ 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/techcourse/controller/ForwardController.java b/app/src/main/java/com/techcourse/controller/ForwardController.java index 3f9f8c395f..de7007b198 100644 --- a/app/src/main/java/com/techcourse/controller/ForwardController.java +++ b/app/src/main/java/com/techcourse/controller/ForwardController.java @@ -13,7 +13,7 @@ public class ForwardController { @RequestMapping(value = "/", method = RequestMethod.GET) - public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) throws Exception { + public ModelAndView execute(HttpServletRequest req, HttpServletResponse res) { return new ModelAndView(new JspView(JspPage.INDEX.value())); } } diff --git a/app/src/main/java/com/techcourse/controller/LoginController.java b/app/src/main/java/com/techcourse/controller/LoginController.java index a469b98e27..0de2e62a74 100644 --- a/app/src/main/java/com/techcourse/controller/LoginController.java +++ b/app/src/main/java/com/techcourse/controller/LoginController.java @@ -33,7 +33,7 @@ public ModelAndView view(HttpServletRequest req, HttpServletResponse res) { @RequestMapping(value = "/login", method = RequestMethod.POST) public ModelAndView login(HttpServletRequest req, HttpServletResponse res) { if (UserSession.isLoggedIn(req.getSession())) { - View view = new JspView(String.format("redirect:%s", JspPage.INDEX.value())); + View view = new JspView(JspPage.INDEX.redirect()); return new ModelAndView(view); } @@ -43,7 +43,7 @@ public ModelAndView login(HttpServletRequest req, HttpServletResponse res) { return new ModelAndView(loginCheck(req, user)); }) .orElse(new ModelAndView( - new JspView(String.format("redirect:%s", JspPage.UNAUTHORIZED.value())) + new JspView(JspPage.UNAUTHORIZED.redirect()) )); } @@ -51,9 +51,9 @@ private View loginCheck(HttpServletRequest request, User user) { if (user.checkPassword(request.getParameter("password"))) { final HttpSession session = request.getSession(); session.setAttribute(UserSession.SESSION_KEY, user); - return new JspView(String.format("redirect:%s", JspPage.INDEX.value())); + return new JspView(JspPage.INDEX.redirect()); } else { - return new JspView(String.format("redirect:%s", JspPage.UNAUTHORIZED.value())); + return new JspView(JspPage.UNAUTHORIZED.redirect()); } } } diff --git a/app/src/main/java/com/techcourse/controller/LogoutController.java b/app/src/main/java/com/techcourse/controller/LogoutController.java index bdde04fbc7..4c9f239a6e 100644 --- a/app/src/main/java/com/techcourse/controller/LogoutController.java +++ b/app/src/main/java/com/techcourse/controller/LogoutController.java @@ -15,7 +15,7 @@ public class LogoutController { @RequestMapping(value = "/logout", method = RequestMethod.GET) - public ModelAndView logout(HttpServletRequest req, HttpServletResponse res) throws Exception { + public ModelAndView logout(HttpServletRequest req, HttpServletResponse res) { final HttpSession session = req.getSession(); session.removeAttribute(UserSession.SESSION_KEY); View view = new JspView("redirect:/"); diff --git a/mvc/src/main/java/nextstep/web/support/JspPage.java b/mvc/src/main/java/nextstep/web/support/JspPage.java index d2c74eb172..1685560d95 100644 --- a/mvc/src/main/java/nextstep/web/support/JspPage.java +++ b/mvc/src/main/java/nextstep/web/support/JspPage.java @@ -17,4 +17,8 @@ public enum JspPage { public String value() { return page; } + + public String redirect() { + return String.format("redirect:%s", page); + } }