From 8aff47bee7429c66a30c13a3fc3d891830efa8d3 Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Wed, 18 Sep 2024 18:13:02 +0900 Subject: [PATCH 01/16] =?UTF-8?q?test:=20Junit3TestRunner=20=ED=95=99?= =?UTF-8?q?=EC=8A=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/test/java/reflection/Junit3TestRunner.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/study/src/test/java/reflection/Junit3TestRunner.java b/study/src/test/java/reflection/Junit3TestRunner.java index b4e465240c..98781abf2e 100644 --- a/study/src/test/java/reflection/Junit3TestRunner.java +++ b/study/src/test/java/reflection/Junit3TestRunner.java @@ -1,13 +1,18 @@ package reflection; import org.junit.jupiter.api.Test; +import java.lang.reflect.Method; class Junit3TestRunner { @Test void run() throws Exception { Class clazz = Junit3Test.class; - - // TODO Junit3Test에서 test로 시작하는 메소드 실행 + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().startsWith("test")) { + method.invoke(new Junit3Test()); + } + } } } From 4227de7ab1993c1ea585fddf998a54d425249e4a Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Wed, 18 Sep 2024 18:15:28 +0900 Subject: [PATCH 02/16] =?UTF-8?q?test:=20Junit4TestRunner=20=ED=95=99?= =?UTF-8?q?=EC=8A=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/test/java/reflection/Junit4TestRunner.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/study/src/test/java/reflection/Junit4TestRunner.java b/study/src/test/java/reflection/Junit4TestRunner.java index 8a6916bc24..03c85f3c02 100644 --- a/study/src/test/java/reflection/Junit4TestRunner.java +++ b/study/src/test/java/reflection/Junit4TestRunner.java @@ -1,13 +1,18 @@ package reflection; import org.junit.jupiter.api.Test; +import java.lang.reflect.Method; class Junit4TestRunner { @Test void run() throws Exception { Class clazz = Junit4Test.class; - - // TODO Junit4Test에서 @MyTest 애노테이션이 있는 메소드 실행 + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + if (method.isAnnotationPresent(MyTest.class)) { + method.invoke(new Junit4Test()); + } + } } } From 7016c1cfb27b8bbb5ca96bc6d9fe33b0b06741fd Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Wed, 18 Sep 2024 18:58:58 +0900 Subject: [PATCH 03/16] =?UTF-8?q?test:=20ReflectionTest=20=ED=95=99?= =?UTF-8?q?=EC=8A=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/reflection/ReflectionTest.java | 56 ++++++++++--------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/study/src/test/java/reflection/ReflectionTest.java b/study/src/test/java/reflection/ReflectionTest.java index 370f0932b9..bef8fe5d5b 100644 --- a/study/src/test/java/reflection/ReflectionTest.java +++ b/study/src/test/java/reflection/ReflectionTest.java @@ -3,10 +3,11 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Date; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -18,26 +19,27 @@ class ReflectionTest { @Test void givenObject_whenGetsClassName_thenCorrect() { final Class clazz = Question.class; - - assertThat(clazz.getSimpleName()).isEqualTo(""); - assertThat(clazz.getName()).isEqualTo(""); - assertThat(clazz.getCanonicalName()).isEqualTo(""); + assertThat(clazz.getSimpleName()).isEqualTo("Question"); + assertThat(clazz.getName()).isEqualTo("reflection.Question"); + assertThat(clazz.getCanonicalName()).isEqualTo("reflection.Question"); } @Test void givenClassName_whenCreatesObject_thenCorrect() throws ClassNotFoundException { final Class clazz = Class.forName("reflection.Question"); - assertThat(clazz.getSimpleName()).isEqualTo(""); - assertThat(clazz.getName()).isEqualTo(""); - assertThat(clazz.getCanonicalName()).isEqualTo(""); + assertThat(clazz.getSimpleName()).isEqualTo("Question"); + assertThat(clazz.getName()).isEqualTo("reflection.Question"); + assertThat(clazz.getCanonicalName()).isEqualTo("reflection.Question"); } @Test void givenObject_whenGetsFieldNamesAtRuntime_thenCorrect() { final Object student = new Student(); - final Field[] fields = null; - final List actualFieldNames = null; + final Field[] fields = student.getClass().getDeclaredFields(); + final List actualFieldNames = Arrays.stream(fields) + .map(Field::getName) + .toList(); assertThat(actualFieldNames).contains("name", "age"); } @@ -45,8 +47,10 @@ void givenObject_whenGetsFieldNamesAtRuntime_thenCorrect() { @Test void givenClass_whenGetsMethods_thenCorrect() { final Class animalClass = Student.class; - final Method[] methods = null; - final List actualMethods = null; + final Method[] methods = animalClass.getDeclaredMethods(); + final List actualMethods = Arrays.stream(methods) + .map(Method::getName) + .toList(); assertThat(actualMethods) .hasSize(3) @@ -56,7 +60,7 @@ void givenClass_whenGetsMethods_thenCorrect() { @Test void givenClass_whenGetsAllConstructors_thenCorrect() { final Class questionClass = Question.class; - final Constructor[] constructors = null; + final Constructor[] constructors = questionClass.getDeclaredConstructors(); assertThat(constructors).hasSize(2); } @@ -65,11 +69,13 @@ void givenClass_whenGetsAllConstructors_thenCorrect() { void givenClass_whenInstantiatesObjectsAtRuntime_thenCorrect() throws Exception { final Class questionClass = Question.class; - final Constructor firstConstructor = null; - final Constructor secondConstructor = null; + final Constructor firstConstructor = questionClass.getConstructor(String.class, String.class, String.class); + final Constructor secondConstructor = questionClass.getConstructor(long.class, String.class, + String.class, String.class, Date.class, int.class); - final Question firstQuestion = null; - final Question secondQuestion = null; + final Question firstQuestion = (Question) firstConstructor.newInstance("gugu", "제목1", "내용1"); + final Question secondQuestion = + (Question) secondConstructor.newInstance(1L, "gugu", "제목2", "내용2", new Date(), 10); assertThat(firstQuestion.getWriter()).isEqualTo("gugu"); assertThat(firstQuestion.getTitle()).isEqualTo("제목1"); @@ -82,7 +88,7 @@ void givenClass_whenInstantiatesObjectsAtRuntime_thenCorrect() throws Exception @Test void givenClass_whenGetsPublicFields_thenCorrect() { final Class questionClass = Question.class; - final Field[] fields = null; + final Field[] fields = questionClass.getFields(); assertThat(fields).hasSize(0); } @@ -90,7 +96,7 @@ void givenClass_whenGetsPublicFields_thenCorrect() { @Test void givenClass_whenGetsDeclaredFields_thenCorrect() { final Class questionClass = Question.class; - final Field[] fields = null; + final Field[] fields = questionClass.getDeclaredFields(); assertThat(fields).hasSize(6); assertThat(fields[0].getName()).isEqualTo("questionId"); @@ -99,7 +105,7 @@ void givenClass_whenGetsDeclaredFields_thenCorrect() { @Test void givenClass_whenGetsFieldsByName_thenCorrect() throws Exception { final Class questionClass = Question.class; - final Field field = null; + final Field field = questionClass.getDeclaredField("questionId"); assertThat(field.getName()).isEqualTo("questionId"); } @@ -107,7 +113,7 @@ void givenClass_whenGetsFieldsByName_thenCorrect() throws Exception { @Test void givenClassField_whenGetsType_thenCorrect() throws Exception { final Field field = Question.class.getDeclaredField("questionId"); - final Class fieldClass = null; + final Class fieldClass = field.getType(); assertThat(fieldClass.getSimpleName()).isEqualTo("long"); } @@ -115,15 +121,15 @@ void givenClassField_whenGetsType_thenCorrect() throws Exception { @Test void givenClassField_whenSetsAndGetsValue_thenCorrect() throws Exception { final Class studentClass = Student.class; - final Student student = null; - final Field field = null; + final Student student = (Student) studentClass.getConstructor().newInstance(); + final Field field = studentClass.getDeclaredField("age"); - // todo field에 접근 할 수 있도록 만든다. + field.setAccessible(true); assertThat(field.getInt(student)).isZero(); assertThat(student.getAge()).isZero(); - field.set(null, null); + field.set(student, 99); assertThat(field.getInt(student)).isEqualTo(99); assertThat(student.getAge()).isEqualTo(99); From dd71ae2d83d86c55314b2c0bbf534305d6b0d23c Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Wed, 18 Sep 2024 19:07:09 +0900 Subject: [PATCH 04/16] =?UTF-8?q?test:=20ReflectionsTest=20=ED=95=99?= =?UTF-8?q?=EC=8A=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/test/java/reflection/ReflectionsTest.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/study/src/test/java/reflection/ReflectionsTest.java b/study/src/test/java/reflection/ReflectionsTest.java index 5040c2ffa2..561a807768 100644 --- a/study/src/test/java/reflection/ReflectionsTest.java +++ b/study/src/test/java/reflection/ReflectionsTest.java @@ -4,6 +4,9 @@ import org.reflections.Reflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import reflection.annotation.Controller; +import reflection.annotation.Repository; +import reflection.annotation.Service; class ReflectionsTest { @@ -13,6 +16,12 @@ class ReflectionsTest { void showAnnotationClass() throws Exception { Reflections reflections = new Reflections("reflection.examples"); - // TODO 클래스 레벨에 @Controller, @Service, @Repository 애노테이션이 설정되어 모든 클래스 찾아 로그로 출력한다. + reflections.getTypesAnnotatedWith(Controller.class) + .forEach(clazz -> log.info(clazz.getName())); + reflections.getTypesAnnotatedWith(Service.class) + .forEach(clazz -> log.info(clazz.getName())); + reflections.getTypesAnnotatedWith(Repository.class) + .forEach(clazz -> log.info(clazz.getName())); + } } From 4e96d6ae389ecf05d0841002bfb59ffae9493b5f Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Thu, 19 Sep 2024 15:28:39 +0900 Subject: [PATCH 05/16] =?UTF-8?q?feat:=20handlerExecutions=EC=97=90=20?= =?UTF-8?q?=ED=95=B8=EB=93=A4=EB=9F=AC=20=EB=93=B1=EB=A1=9D=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mvc/tobe/AnnotationHandlerMapping.java | 30 ++++++++++++++++++- .../servlet/mvc/tobe/HandlerExecution.java | 18 +++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) 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 ccae5ea3ad..d9b234af45 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 @@ -1,11 +1,16 @@ package com.interface21.webmvc.servlet.mvc.tobe; +import com.interface21.context.stereotype.Controller; +import com.interface21.web.bind.annotation.RequestMapping; +import com.interface21.web.bind.annotation.RequestMethod; import jakarta.servlet.http.HttpServletRequest; +import org.reflections.Reflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - +import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; +import java.util.Set; public class AnnotationHandlerMapping { @@ -21,6 +26,29 @@ public AnnotationHandlerMapping(final Object... basePackage) { public void initialize() { log.info("Initialized AnnotationHandlerMapping!"); + Reflections reflections = new Reflections(basePackage); + Set> classes = reflections.getTypesAnnotatedWith(Controller.class); + + for (Class c : classes) { + scanClass(c); + } + } + + private void scanClass(Class c) { + for (Method method : c.getDeclaredMethods()) { + registerRequestMappingHandlerExecution(c, method); + } + } + + private void registerRequestMappingHandlerExecution(Class c, Method method) { + RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); + String url = requestMapping.value(); + RequestMethod[] requestMethods = requestMapping.method(); + for (RequestMethod requestMethod : requestMethods) { + handlerExecutions.put( + new HandlerKey(url, requestMethod), new HandlerExecution(c, method) + ); + } } public Object getHandler(final HttpServletRequest request) { diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java index 79a22355a9..a804cc6542 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java @@ -1,12 +1,26 @@ package com.interface21.webmvc.servlet.mvc.tobe; +import com.interface21.webmvc.servlet.ModelAndView; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import com.interface21.webmvc.servlet.ModelAndView; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; public class HandlerExecution { + private final Class controller; + + private final Method method; + + public HandlerExecution(Class controller, Method method) { + this.controller = controller; + this.method = method; + } + public ModelAndView handle(final HttpServletRequest request, final HttpServletResponse response) throws Exception { - return null; + Constructor constructor = controller.getConstructor(); + Object instance = constructor.newInstance(); + + return (ModelAndView) method.invoke(instance, request, response); } } From 58d12af300f8cd6c505bc30f99d1c703f36b3684 Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Thu, 19 Sep 2024 15:28:50 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=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 --- .../webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 d9b234af45..a9e3dcfedf 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 @@ -52,6 +52,8 @@ private void registerRequestMappingHandlerExecution(Class c, Method method) { } public Object getHandler(final HttpServletRequest request) { - return null; + return handlerExecutions.get( + new HandlerKey(request.getRequestURI(), RequestMethod.valueOf(request.getMethod())) + ); } } From 1327ff73d351ed81f4ab36669af1b375ae151e74 Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Thu, 19 Sep 2024 16:13:29 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat:=20RequestMapping=20method=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=97=86=EC=9D=84=20=EC=8B=9C=20=EB=AA=A8?= =?UTF-8?q?=EB=93=A0=20http=20method=20=EC=A7=80=EC=9B=90=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mvc/tobe/AnnotationHandlerMapping.java | 12 ++++++++++-- .../tobe/AnnotationHandlerMappingTest.java | 19 +++++++++++++++++++ mvc/src/test/java/samples/TestController.java | 16 ++++++++++++---- 3 files changed, 41 insertions(+), 6 deletions(-) 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 a9e3dcfedf..f7c9a11e99 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 @@ -25,13 +25,13 @@ public AnnotationHandlerMapping(final Object... basePackage) { } public void initialize() { - log.info("Initialized AnnotationHandlerMapping!"); Reflections reflections = new Reflections(basePackage); Set> classes = reflections.getTypesAnnotatedWith(Controller.class); for (Class c : classes) { scanClass(c); } + log.info("Initialized AnnotationHandlerMapping!"); } private void scanClass(Class c) { @@ -43,7 +43,8 @@ private void scanClass(Class c) { private void registerRequestMappingHandlerExecution(Class c, Method method) { RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); String url = requestMapping.value(); - RequestMethod[] requestMethods = requestMapping.method(); + RequestMethod[] requestMethods = getRequestMethods(requestMapping); + for (RequestMethod requestMethod : requestMethods) { handlerExecutions.put( new HandlerKey(url, requestMethod), new HandlerExecution(c, method) @@ -51,6 +52,13 @@ private void registerRequestMappingHandlerExecution(Class c, Method method) { } } + private RequestMethod[] getRequestMethods(RequestMapping requestMapping) { + if (requestMapping.method().length == 0) { + return RequestMethod.values(); + } + return requestMapping.method(); + } + public Object getHandler(final HttpServletRequest request) { return handlerExecutions.get( new HandlerKey(request.getRequestURI(), RequestMethod.valueOf(request.getMethod())) 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 a19ea6e102..bee08205d4 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 @@ -1,9 +1,12 @@ package com.interface21.webmvc.servlet.mvc.tobe; +import com.interface21.web.bind.annotation.RequestMethod; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -48,4 +51,20 @@ void post() throws Exception { assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); } + + @ParameterizedTest + @EnumSource(value = RequestMethod.class) + void noMethod(RequestMethod requestMethod) throws Exception { + final var request = mock(HttpServletRequest.class); + final var response = mock(HttpServletResponse.class); + + when(request.getAttribute("id")).thenReturn("gugu"); + when(request.getRequestURI()).thenReturn("/no-method-test"); + when(request.getMethod()).thenReturn(requestMethod.name()); + + final var handlerExecution = (HandlerExecution) handlerMapping.getHandler(request); + final var modelAndView = handlerExecution.handle(request, response); + + assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); + } } diff --git a/mvc/src/test/java/samples/TestController.java b/mvc/src/test/java/samples/TestController.java index 6ad9c741dd..6618bc4e2e 100644 --- a/mvc/src/test/java/samples/TestController.java +++ b/mvc/src/test/java/samples/TestController.java @@ -1,14 +1,14 @@ package samples; import com.interface21.context.stereotype.Controller; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; 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.JspView; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Controller public class TestController { @@ -30,4 +30,12 @@ public ModelAndView save(final HttpServletRequest request, final HttpServletResp modelAndView.addObject("id", request.getAttribute("id")); return modelAndView; } + + @RequestMapping(value = "/no-method-test") + public ModelAndView noMethod(final HttpServletRequest request, final HttpServletResponse response) { + log.info("test controller no method"); + final var modelAndView = new ModelAndView(new JspView("")); + modelAndView.addObject("id", request.getAttribute("id")); + return modelAndView; + } } From a959d6c197505fd17fd2a7777031764ed24abba2 Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Thu, 19 Sep 2024 16:40:28 +0900 Subject: [PATCH 08/16] =?UTF-8?q?feat:=20JspView=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B7=B0=EC=B2=98=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=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/DispatcherServlet.java | 31 ++++++++++--------- .../mvc/tobe/AnnotationHandlerMapping.java | 2 +- .../webmvc/servlet/view/JspView.java | 17 +++++++--- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index 2943e9ae55..b3a2ce297b 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -1,12 +1,16 @@ 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.HandlerExecution; +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 org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.interface21.webmvc.servlet.view.JspView; public class DispatcherServlet extends HttpServlet { @@ -14,6 +18,7 @@ public class DispatcherServlet extends HttpServlet { private static final Logger log = LoggerFactory.getLogger(DispatcherServlet.class); private ManualHandlerMapping manualHandlerMapping; + private AnnotationHandlerMapping annotationHandlerMapping; public DispatcherServlet() { } @@ -21,31 +26,27 @@ public DispatcherServlet() { @Override public void init() { manualHandlerMapping = new ManualHandlerMapping(); + annotationHandlerMapping = new AnnotationHandlerMapping(); manualHandlerMapping.initialize(); + annotationHandlerMapping.initialize(); } @Override - protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException { + protected void service(final HttpServletRequest request, final HttpServletResponse response) + throws ServletException { final String requestURI = request.getRequestURI(); log.debug("Method : {}, Request URI : {}", request.getMethod(), requestURI); try { - final var controller = manualHandlerMapping.getHandler(requestURI); - final var viewName = controller.execute(request, response); - move(viewName, request, response); + Controller controller = manualHandlerMapping.getHandler(requestURI); + String viewName = controller.execute(request, response); + HandlerExecution handler = annotationHandlerMapping.getHandler(request); + ModelAndView modelAndView = handler.handle(request, response); + JspView view = new JspView(viewName); + view.render(modelAndView.getModel(), request, response); } catch (Throwable e) { log.error("Exception : {}", e.getMessage(), e); throw new ServletException(e.getMessage()); } } - - private void move(final String viewName, final HttpServletRequest request, final HttpServletResponse response) throws Exception { - if (viewName.startsWith(JspView.REDIRECT_PREFIX)) { - response.sendRedirect(viewName.substring(JspView.REDIRECT_PREFIX.length())); - return; - } - - final var requestDispatcher = request.getRequestDispatcher(viewName); - requestDispatcher.forward(request, response); - } } 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 f7c9a11e99..fe804af807 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 @@ -59,7 +59,7 @@ private RequestMethod[] getRequestMethods(RequestMapping requestMapping) { return requestMapping.method(); } - public Object getHandler(final HttpServletRequest request) { + public HandlerExecution getHandler(final HttpServletRequest request) { return handlerExecutions.get( new HandlerKey(request.getRequestURI(), RequestMethod.valueOf(request.getMethod())) ); diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java b/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java index 443fe4b4dd..afed03ec3f 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java @@ -5,7 +5,6 @@ import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import java.util.Map; public class JspView implements View { @@ -14,18 +13,26 @@ public class JspView implements View { public static final String REDIRECT_PREFIX = "redirect:"; - public JspView(final String viewName) { + private final String viewName; + + public JspView(String viewName) { + this.viewName = viewName; } @Override - public void render(final Map model, final HttpServletRequest request, final HttpServletResponse response) throws Exception { - // todo + public void render(final Map model, final HttpServletRequest request, final HttpServletResponse response) + throws Exception { + if (viewName.startsWith(JspView.REDIRECT_PREFIX)) { + response.sendRedirect(viewName.substring(JspView.REDIRECT_PREFIX.length())); + return; + } model.keySet().forEach(key -> { log.debug("attribute name : {}, value : {}", key, model.get(key)); request.setAttribute(key, model.get(key)); }); - // todo + final var requestDispatcher = request.getRequestDispatcher(viewName); + requestDispatcher.forward(request, response); } } From 6ee8e3cf6cf291a7331ea32a2a810fe7aec60f06 Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Fri, 20 Sep 2024 12:07:53 +0900 Subject: [PATCH 09/16] =?UTF-8?q?test:=20ServletTest=20=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/test/java/servlet/com/example/ServletTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/study/src/test/java/servlet/com/example/ServletTest.java b/study/src/test/java/servlet/com/example/ServletTest.java index 75fbb10dd5..e335f8190a 100644 --- a/study/src/test/java/servlet/com/example/ServletTest.java +++ b/study/src/test/java/servlet/com/example/ServletTest.java @@ -28,7 +28,7 @@ void testSharedCounter() { // expected를 0이 아닌 올바른 값으로 바꿔보자. // 예상한 결과가 나왔는가? 왜 이런 결과가 나왔을까? - assertThat(Integer.parseInt(response.body())).isEqualTo(0); + assertThat(Integer.parseInt(response.body())).isEqualTo(3); } @Test @@ -50,6 +50,6 @@ void testLocalCounter() { // expected를 0이 아닌 올바른 값으로 바꿔보자. // 예상한 결과가 나왔는가? 왜 이런 결과가 나왔을까? - assertThat(Integer.parseInt(response.body())).isEqualTo(0); + assertThat(Integer.parseInt(response.body())).isEqualTo(1); } } From c018289f1bb5f09d53b845fec3553ae6aa241b82 Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Fri, 20 Sep 2024 13:03:00 +0900 Subject: [PATCH 10/16] =?UTF-8?q?test:=20FilterTest=20=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servlet/com/example/CharacterEncodingFilter.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/study/src/main/java/servlet/com/example/CharacterEncodingFilter.java b/study/src/main/java/servlet/com/example/CharacterEncodingFilter.java index cf4d886974..d638844302 100644 --- a/study/src/main/java/servlet/com/example/CharacterEncodingFilter.java +++ b/study/src/main/java/servlet/com/example/CharacterEncodingFilter.java @@ -1,16 +1,21 @@ package servlet.com.example; -import jakarta.servlet.*; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import jakarta.servlet.annotation.WebFilter; - import java.io.IOException; @WebFilter("/*") public class CharacterEncodingFilter implements Filter { @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { request.getServletContext().log("doFilter() 호출"); + response.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } } From 8fee6c90aad4a08f6c77c0998ad0e54ab3db0191 Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Sun, 22 Sep 2024 15:21:25 +0900 Subject: [PATCH 11/16] =?UTF-8?q?refactor:=20stream=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B0=84=EA=B2=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webmvc/servlet/mvc/tobe/AnnotationHandlerMapping.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) 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 fe804af807..8c62903767 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 @@ -10,7 +10,6 @@ import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; -import java.util.Set; public class AnnotationHandlerMapping { @@ -26,11 +25,8 @@ public AnnotationHandlerMapping(final Object... basePackage) { public void initialize() { Reflections reflections = new Reflections(basePackage); - Set> classes = reflections.getTypesAnnotatedWith(Controller.class); - - for (Class c : classes) { - scanClass(c); - } + reflections.getTypesAnnotatedWith(Controller.class) + .forEach(this::scanClass); log.info("Initialized AnnotationHandlerMapping!"); } From b9d7e325f321fe4e6f35807eccf9beb713bc2c56 Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Sun, 22 Sep 2024 17:08:29 +0900 Subject: [PATCH 12/16] =?UTF-8?q?refactor:=20HandlerExcution=20Map?= =?UTF-8?q?=EC=9D=84=20=EC=9D=BC=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/DispatcherServlet.java | 2 +- .../mvc/tobe/AnnotationHandlerMapping.java | 15 +++---- .../servlet/mvc/tobe/HandlerExecutions.java | 27 ++++++++++++ .../tobe/AnnotationHandlerMappingTest.java | 31 +++++++++++-- .../mvc/tobe/HandlerExecutionsTest.java | 44 +++++++++++++++++++ 5 files changed, 106 insertions(+), 13 deletions(-) create mode 100644 mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecutions.java create mode 100644 mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecutionsTest.java diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index b3a2ce297b..126143cba2 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -40,7 +40,7 @@ protected void service(final HttpServletRequest request, final HttpServletRespon try { Controller controller = manualHandlerMapping.getHandler(requestURI); String viewName = controller.execute(request, response); - HandlerExecution handler = annotationHandlerMapping.getHandler(request); + HandlerExecution handler = annotationHandlerMapping.findHandler(request); ModelAndView modelAndView = handler.handle(request, response); JspView view = new JspView(viewName); view.render(modelAndView.getModel(), request, response); 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 8c62903767..401537228f 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 @@ -8,19 +8,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; public class AnnotationHandlerMapping { private static final Logger log = LoggerFactory.getLogger(AnnotationHandlerMapping.class); private final Object[] basePackage; - private final Map handlerExecutions; + private final HandlerExecutions handlerExecutions; public AnnotationHandlerMapping(final Object... basePackage) { this.basePackage = basePackage; - this.handlerExecutions = new HashMap<>(); + this.handlerExecutions = new HandlerExecutions(); } public void initialize() { @@ -42,7 +40,7 @@ private void registerRequestMappingHandlerExecution(Class c, Method method) { RequestMethod[] requestMethods = getRequestMethods(requestMapping); for (RequestMethod requestMethod : requestMethods) { - handlerExecutions.put( + handlerExecutions.add( new HandlerKey(url, requestMethod), new HandlerExecution(c, method) ); } @@ -55,9 +53,8 @@ private RequestMethod[] getRequestMethods(RequestMapping requestMapping) { return requestMapping.method(); } - public HandlerExecution getHandler(final HttpServletRequest request) { - return handlerExecutions.get( - new HandlerKey(request.getRequestURI(), RequestMethod.valueOf(request.getMethod())) - ); + public HandlerExecution findHandler(HttpServletRequest request) { + return handlerExecutions.findHandler(request) + .orElseThrow(() -> new IllegalArgumentException("No handler found for request: " + request.getRequestURI())); } } diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecutions.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecutions.java new file mode 100644 index 0000000000..fc7068e879 --- /dev/null +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecutions.java @@ -0,0 +1,27 @@ +package com.interface21.webmvc.servlet.mvc.tobe; + +import com.interface21.web.bind.annotation.RequestMethod; +import jakarta.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class HandlerExecutions { + + private final Map handlerExecutions; + + public HandlerExecutions() { + this.handlerExecutions = new HashMap<>(); + } + + public void add(HandlerKey handlerKey, HandlerExecution handlerExecution) { + handlerExecutions.put(handlerKey, handlerExecution); + } + + public Optional findHandler(HttpServletRequest request) { + return Optional.ofNullable(handlerExecutions.get( + new HandlerKey(request.getRequestURI(), RequestMethod.valueOf(request.getMethod())) + ) + ); + } +} 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 bee08205d4..a0f7c27fd0 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,11 +4,13 @@ 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; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; 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; @@ -24,6 +26,7 @@ void setUp() { @Test void get() throws Exception { + //given final var request = mock(HttpServletRequest.class); final var response = mock(HttpServletResponse.class); @@ -31,14 +34,17 @@ void get() throws Exception { when(request.getRequestURI()).thenReturn("/get-test"); when(request.getMethod()).thenReturn("GET"); - final var handlerExecution = (HandlerExecution) handlerMapping.getHandler(request); + //when + final var handlerExecution = (HandlerExecution) handlerMapping.findHandler(request); final var modelAndView = handlerExecution.handle(request, response); + //then assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); } @Test void post() throws Exception { + //given final var request = mock(HttpServletRequest.class); final var response = mock(HttpServletResponse.class); @@ -46,15 +52,18 @@ void post() throws Exception { when(request.getRequestURI()).thenReturn("/post-test"); when(request.getMethod()).thenReturn("POST"); - final var handlerExecution = (HandlerExecution) handlerMapping.getHandler(request); + //when + final var handlerExecution = (HandlerExecution) handlerMapping.findHandler(request); final var modelAndView = handlerExecution.handle(request, response); + //then assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); } @ParameterizedTest @EnumSource(value = RequestMethod.class) void noMethod(RequestMethod requestMethod) throws Exception { + //given final var request = mock(HttpServletRequest.class); final var response = mock(HttpServletResponse.class); @@ -62,9 +71,25 @@ void noMethod(RequestMethod requestMethod) throws Exception { when(request.getRequestURI()).thenReturn("/no-method-test"); when(request.getMethod()).thenReturn(requestMethod.name()); - final var handlerExecution = (HandlerExecution) handlerMapping.getHandler(request); + //when + final var handlerExecution = (HandlerExecution) handlerMapping.findHandler(request); final var modelAndView = handlerExecution.handle(request, response); + //then assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); } + + @DisplayName("요청에 해당하는 HandlerExecution이 없을 때 예외 발생") + @Test + void getHandle_notExist() { + //given & when + HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getRequestURI()).thenReturn("/get"); + when(request.getMethod()).thenReturn("GET"); + + //then + assertThatThrownBy(() -> handlerMapping.findHandler(request)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("No handler found for request: /get"); + } } diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecutionsTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecutionsTest.java new file mode 100644 index 0000000000..9208998ff8 --- /dev/null +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecutionsTest.java @@ -0,0 +1,44 @@ +package com.interface21.webmvc.servlet.mvc.tobe; + +import com.interface21.web.bind.annotation.RequestMethod; +import jakarta.servlet.http.HttpServletRequest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class HandlerExecutionsTest { + + @DisplayName("요청에 해당하는 HandlerExecution을 정상적으로 반환") + @Test + void findHandler() { + //given + HandlerExecutions handlerExecutions = new HandlerExecutions(); + HttpServletRequest request = mock(HttpServletRequest.class); + HandlerExecution handlerExecution = mock(HandlerExecution.class); + when(request.getRequestURI()).thenReturn("/get"); + when(request.getMethod()).thenReturn("GET"); + + //when + handlerExecutions.add(new HandlerKey("/get", RequestMethod.GET), handlerExecution); + + //then + assertThat(handlerExecutions.findHandler(request)).isEqualTo(Optional.of(handlerExecution)); + } + + @DisplayName("요청에 해당하는 HandlerExecution이 없을 때 빈 Optional 반환") + @Test + void getHandle_notExist() { + //given & when + HandlerExecutions handlerExecutions = new HandlerExecutions(); + HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getRequestURI()).thenReturn("/get"); + when(request.getMethod()).thenReturn("GET"); + + //then + assertThat(handlerExecutions.findHandler(request)).isEqualTo(Optional.empty()); + } +} From c227954861df2e2192cfa82c7aa7fba191dc2802 Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Sun, 22 Sep 2024 17:10:45 +0900 Subject: [PATCH 13/16] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=EA=B3=B5=EB=B0=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java | 1 - 1 file changed, 1 deletion(-) diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java index a804cc6542..d26fda5e0d 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java @@ -9,7 +9,6 @@ public class HandlerExecution { private final Class controller; - private final Method method; public HandlerExecution(Class controller, Method method) { From f3c066f957ff68569d4b5e8579277ca187efb08e Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Sun, 22 Sep 2024 17:40:31 +0900 Subject: [PATCH 14/16] =?UTF-8?q?refactor:=20viewName=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EA=B2=80=EC=A6=9D=20ViewName=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EB=A1=9C=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webmvc/servlet/view/JspView.java | 13 ++------ .../webmvc/servlet/view/ViewName.java | 27 ++++++++++++++++ .../webmvc/servlet/view/ViewNameTest.java | 32 +++++++++++++++++++ 3 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 mvc/src/main/java/com/interface21/webmvc/servlet/view/ViewName.java create mode 100644 mvc/src/test/java/com/interface21/webmvc/servlet/view/ViewNameTest.java diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java b/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java index afed03ec3f..e948370b5a 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java @@ -11,28 +11,21 @@ public class JspView implements View { private static final Logger log = LoggerFactory.getLogger(JspView.class); - public static final String REDIRECT_PREFIX = "redirect:"; - - private final String viewName; + private final ViewName viewName; public JspView(String viewName) { - this.viewName = viewName; + this.viewName = new ViewName(viewName); } @Override public void render(final Map model, final HttpServletRequest request, final HttpServletResponse response) throws Exception { - if (viewName.startsWith(JspView.REDIRECT_PREFIX)) { - response.sendRedirect(viewName.substring(JspView.REDIRECT_PREFIX.length())); - return; - } - model.keySet().forEach(key -> { log.debug("attribute name : {}, value : {}", key, model.get(key)); request.setAttribute(key, model.get(key)); }); - final var requestDispatcher = request.getRequestDispatcher(viewName); + final var requestDispatcher = request.getRequestDispatcher(viewName.getViewName()); requestDispatcher.forward(request, response); } } diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/view/ViewName.java b/mvc/src/main/java/com/interface21/webmvc/servlet/view/ViewName.java new file mode 100644 index 0000000000..af9b0f1569 --- /dev/null +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/view/ViewName.java @@ -0,0 +1,27 @@ +package com.interface21.webmvc.servlet.view; + +public class ViewName { + + private static final String REDIRECT_PREFIX = "redirect:"; + + private final String viewName; + + public ViewName(String viewName) { + this.viewName = stripRedirectPrefix(viewName); + } + + private String stripRedirectPrefix(String viewName) { + if (isRedirect(viewName)) { + return viewName.substring(REDIRECT_PREFIX.length()); + } + return viewName; + } + + private boolean isRedirect(String viewName) { + return viewName.startsWith(REDIRECT_PREFIX); + } + + public String getViewName() { + return viewName; + } +} diff --git a/mvc/src/test/java/com/interface21/webmvc/servlet/view/ViewNameTest.java b/mvc/src/test/java/com/interface21/webmvc/servlet/view/ViewNameTest.java new file mode 100644 index 0000000000..4cd03ed75e --- /dev/null +++ b/mvc/src/test/java/com/interface21/webmvc/servlet/view/ViewNameTest.java @@ -0,0 +1,32 @@ +package com.interface21.webmvc.servlet.view; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class ViewNameTest { + + @DisplayName("리다이렉트가 아닌 일반 URL을 처리할 때") + @Test + void handleNormalViewName() { + //given & when + String page = "/test.html"; + ViewName viewName = new ViewName(page); + + //then + assertThat(viewName.getViewName()).isEqualTo(page); + } + + @DisplayName("리다이렉트 URL을 처리할 때 'redirect:' 접두사를 제거") + @Test + void handleRedirectViewName() { + //given & when + String redirect = "redirect:"; + String page = "/test.html"; + ViewName viewName = new ViewName(redirect + page); + + //then + assertThat(viewName.getViewName()).isEqualTo(page); + } +} From 1e005f247bdfa669d2e16bcd0b1471e044b9329b Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Sun, 22 Sep 2024 21:22:23 +0900 Subject: [PATCH 15/16] =?UTF-8?q?style:=20final,=20var=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/techcourse/Application.java | 10 ++++---- .../com/techcourse/DispatcherServlet.java | 4 +-- .../DispatcherServletInitializer.java | 7 +++--- .../com/techcourse/ManualHandlerMapping.java | 2 +- .../java/com/techcourse/TomcatStarter.java | 18 ++++++------- .../controller/LoginController.java | 7 +++--- .../controller/LoginViewController.java | 2 +- .../controller/LogoutController.java | 5 ++-- .../controller/RegisterController.java | 4 +-- .../controller/RegisterViewController.java | 2 +- .../techcourse/controller/UserSession.java | 6 ++--- .../repository/InMemoryUserRepository.java | 2 +- .../web/filter/CharacterEncodingFilter.java | 4 +-- .../support/web/filter/ResourceFilter.java | 21 ++++++++++------ .../SpringServletContainerInitializer.java | 2 +- .../webmvc/servlet/ModelAndView.java | 6 ++--- .../webmvc/servlet/mvc/asis/Controller.java | 2 +- .../servlet/mvc/asis/ForwardController.java | 4 +-- .../mvc/tobe/AnnotationHandlerMapping.java | 2 +- .../servlet/mvc/tobe/HandlerExecution.java | 2 +- .../webmvc/servlet/mvc/tobe/HandlerKey.java | 2 +- .../webmvc/servlet/view/JsonView.java | 2 +- .../webmvc/servlet/view/JspView.java | 5 ++-- .../tobe/AnnotationHandlerMappingTest.java | 25 ++++++++++--------- mvc/src/test/java/samples/TestController.java | 12 ++++----- 25 files changed, 84 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/com/techcourse/Application.java b/app/src/main/java/com/techcourse/Application.java index 500d3f2d8b..630f715dd9 100644 --- a/app/src/main/java/com/techcourse/Application.java +++ b/app/src/main/java/com/techcourse/Application.java @@ -12,23 +12,23 @@ public class Application { private static final int DEFAULT_PORT = 8080; - public static void main(final String[] args) throws Exception { - final int port = defaultPortIfNull(args); - final var tomcat = new TomcatStarter(port); + public static void main(String[] args) throws Exception { + int port = defaultPortIfNull(args); + TomcatStarter tomcat = new TomcatStarter(port); log.info("configuring app with basedir: {}", TomcatStarter.WEBAPP_DIR_LOCATION); tomcat.start(); stop(tomcat); } - private static int defaultPortIfNull(final String[] args) { + private static int defaultPortIfNull(String[] args) { return Stream.of(args) .findFirst() .map(Integer::parseInt) .orElse(DEFAULT_PORT); } - private static void stop(final TomcatStarter tomcat) { + private static void stop(TomcatStarter tomcat) { try { // make the application wait until we press any key. System.in.read(); diff --git a/app/src/main/java/com/techcourse/DispatcherServlet.java b/app/src/main/java/com/techcourse/DispatcherServlet.java index 126143cba2..c2656886cb 100644 --- a/app/src/main/java/com/techcourse/DispatcherServlet.java +++ b/app/src/main/java/com/techcourse/DispatcherServlet.java @@ -32,9 +32,9 @@ public void init() { } @Override - protected void service(final HttpServletRequest request, final HttpServletResponse response) + protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException { - final String requestURI = request.getRequestURI(); + String requestURI = request.getRequestURI(); log.debug("Method : {}, Request URI : {}", request.getMethod(), requestURI); try { diff --git a/app/src/main/java/com/techcourse/DispatcherServletInitializer.java b/app/src/main/java/com/techcourse/DispatcherServletInitializer.java index d07ddf2033..8feb0e5256 100644 --- a/app/src/main/java/com/techcourse/DispatcherServletInitializer.java +++ b/app/src/main/java/com/techcourse/DispatcherServletInitializer.java @@ -1,6 +1,7 @@ package com.techcourse; import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletRegistration.Dynamic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.interface21.web.WebApplicationInitializer; @@ -16,10 +17,10 @@ public class DispatcherServletInitializer implements WebApplicationInitializer { private static final String DEFAULT_SERVLET_NAME = "dispatcher"; @Override - public void onStartup(final ServletContext servletContext) { - final var dispatcherServlet = new DispatcherServlet(); + public void onStartup(ServletContext servletContext) { + DispatcherServlet dispatcherServlet = new DispatcherServlet(); - final var registration = servletContext.addServlet(DEFAULT_SERVLET_NAME, dispatcherServlet); + Dynamic registration = servletContext.addServlet(DEFAULT_SERVLET_NAME, dispatcherServlet); if (registration == null) { throw new IllegalStateException("Failed to register servlet with name '" + DEFAULT_SERVLET_NAME + "'. " + "Check if there is another servlet registered under the same name."); diff --git a/app/src/main/java/com/techcourse/ManualHandlerMapping.java b/app/src/main/java/com/techcourse/ManualHandlerMapping.java index 2116056394..7c004d8110 100644 --- a/app/src/main/java/com/techcourse/ManualHandlerMapping.java +++ b/app/src/main/java/com/techcourse/ManualHandlerMapping.java @@ -28,7 +28,7 @@ public void initialize() { .forEach(path -> log.info("Path : {}, Controller : {}", path, controllers.get(path).getClass())); } - public Controller getHandler(final String requestURI) { + public Controller getHandler(String requestURI) { log.debug("Request Mapping Uri : {}", requestURI); return controllers.get(requestURI); } diff --git a/app/src/main/java/com/techcourse/TomcatStarter.java b/app/src/main/java/com/techcourse/TomcatStarter.java index 4f26f228e3..accbc920c4 100644 --- a/app/src/main/java/com/techcourse/TomcatStarter.java +++ b/app/src/main/java/com/techcourse/TomcatStarter.java @@ -15,16 +15,16 @@ public class TomcatStarter { private final Tomcat tomcat; - public TomcatStarter(final int port) { + public TomcatStarter(int port) { this(WEBAPP_DIR_LOCATION, port); } - public TomcatStarter(final String webappDirLocation, final int port) { + public TomcatStarter(String webappDirLocation, int port) { this.tomcat = new Tomcat(); tomcat.setConnector(createConnector(port)); - final var docBase = new File(webappDirLocation).getAbsolutePath(); - final var context = (StandardContext) tomcat.addWebapp("", docBase); + String docBase = new File(webappDirLocation).getAbsolutePath(); + StandardContext context = (StandardContext) tomcat.addWebapp("", docBase); skipJarScan(context); skipClearReferences(context); } @@ -46,18 +46,18 @@ public void stop() { } } - private Connector createConnector(final int port) { - final var connector = new Connector(); + private Connector createConnector(int port) { + Connector connector = new Connector(); connector.setPort(port); return connector; } - private void skipJarScan(final Context context) { - final var jarScanner = (StandardJarScanner) context.getJarScanner(); + private void skipJarScan(Context context) { + StandardJarScanner jarScanner = (StandardJarScanner) context.getJarScanner(); jarScanner.setScanClassPath(false); } - private void skipClearReferences(final StandardContext context) { + private void skipClearReferences(StandardContext context) { /** * https://tomcat.apache.org/tomcat-10.1-doc/config/context.html * diff --git a/app/src/main/java/com/techcourse/controller/LoginController.java b/app/src/main/java/com/techcourse/controller/LoginController.java index a87d996693..3a9cec2c63 100644 --- a/app/src/main/java/com/techcourse/controller/LoginController.java +++ b/app/src/main/java/com/techcourse/controller/LoginController.java @@ -5,6 +5,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import com.interface21.webmvc.servlet.mvc.asis.Controller; +import jakarta.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,7 +14,7 @@ public class LoginController implements Controller { private static final Logger log = LoggerFactory.getLogger(LoginController.class); @Override - public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception { + public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception { if (UserSession.isLoggedIn(req.getSession())) { return "redirect:/index.jsp"; } @@ -26,9 +27,9 @@ public String execute(final HttpServletRequest req, final HttpServletResponse re .orElse("redirect:/401.jsp"); } - private String login(final HttpServletRequest request, final User user) { + private String login(HttpServletRequest request, User user) { if (user.checkPassword(request.getParameter("password"))) { - final var session = request.getSession(); + HttpSession session = request.getSession(); session.setAttribute(UserSession.SESSION_KEY, user); return "redirect:/index.jsp"; } diff --git a/app/src/main/java/com/techcourse/controller/LoginViewController.java b/app/src/main/java/com/techcourse/controller/LoginViewController.java index dc71ee8e99..841c4d7ba1 100644 --- a/app/src/main/java/com/techcourse/controller/LoginViewController.java +++ b/app/src/main/java/com/techcourse/controller/LoginViewController.java @@ -11,7 +11,7 @@ public class LoginViewController implements Controller { private static final Logger log = LoggerFactory.getLogger(LoginViewController.class); @Override - public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception { + public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception { return UserSession.getUserFrom(req.getSession()) .map(user -> { log.info("logged in {}", user.getAccount()); diff --git a/app/src/main/java/com/techcourse/controller/LogoutController.java b/app/src/main/java/com/techcourse/controller/LogoutController.java index 729d262de5..c6bd831ea9 100644 --- a/app/src/main/java/com/techcourse/controller/LogoutController.java +++ b/app/src/main/java/com/techcourse/controller/LogoutController.java @@ -3,12 +3,13 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import com.interface21.webmvc.servlet.mvc.asis.Controller; +import jakarta.servlet.http.HttpSession; public class LogoutController implements Controller { @Override - public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception { - final var session = req.getSession(); + public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception { + HttpSession session = req.getSession(); session.removeAttribute(UserSession.SESSION_KEY); return "redirect:/"; } diff --git a/app/src/main/java/com/techcourse/controller/RegisterController.java b/app/src/main/java/com/techcourse/controller/RegisterController.java index 782abfb219..6a87db92f0 100644 --- a/app/src/main/java/com/techcourse/controller/RegisterController.java +++ b/app/src/main/java/com/techcourse/controller/RegisterController.java @@ -9,8 +9,8 @@ public class RegisterController implements Controller { @Override - public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception { - final var user = new User(2, + public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception { + User user = new User(2, req.getParameter("account"), req.getParameter("password"), req.getParameter("email")); diff --git a/app/src/main/java/com/techcourse/controller/RegisterViewController.java b/app/src/main/java/com/techcourse/controller/RegisterViewController.java index c88dc2814b..1d4605fa8d 100644 --- a/app/src/main/java/com/techcourse/controller/RegisterViewController.java +++ b/app/src/main/java/com/techcourse/controller/RegisterViewController.java @@ -7,7 +7,7 @@ public class RegisterViewController implements Controller { @Override - public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception { + public String execute(HttpServletRequest req, HttpServletResponse res) throws Exception { return "/register.jsp"; } } diff --git a/app/src/main/java/com/techcourse/controller/UserSession.java b/app/src/main/java/com/techcourse/controller/UserSession.java index dc5fbbc556..2532c065d1 100644 --- a/app/src/main/java/com/techcourse/controller/UserSession.java +++ b/app/src/main/java/com/techcourse/controller/UserSession.java @@ -9,12 +9,12 @@ public class UserSession { public static final String SESSION_KEY = "user"; - public static Optional getUserFrom(final HttpSession session) { - final var user = (User) session.getAttribute(SESSION_KEY); + public static Optional getUserFrom(HttpSession session) { + User user = (User) session.getAttribute(SESSION_KEY); return Optional.ofNullable(user); } - public static boolean isLoggedIn(final HttpSession session) { + public static boolean isLoggedIn(HttpSession session) { return getUserFrom(session).isPresent(); } diff --git a/app/src/main/java/com/techcourse/repository/InMemoryUserRepository.java b/app/src/main/java/com/techcourse/repository/InMemoryUserRepository.java index 59bec6d8a8..b929b78e59 100644 --- a/app/src/main/java/com/techcourse/repository/InMemoryUserRepository.java +++ b/app/src/main/java/com/techcourse/repository/InMemoryUserRepository.java @@ -11,7 +11,7 @@ public class InMemoryUserRepository { private static final Map database = new ConcurrentHashMap<>(); static { - final var user = new User(1, "gugu", "password", "hkkang@woowahan.com"); + User user = new User(1, "gugu", "password", "hkkang@woowahan.com"); database.put(user.getAccount(), user); } 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 290fc83b7d..0f6566d82a 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 @@ -11,11 +11,11 @@ public class CharacterEncodingFilter implements Filter { private static final String DEFAULT_ENCODING = "UTF-8"; @Override - public void init(final FilterConfig filterConfig) throws ServletException { + public void init(FilterConfig filterConfig) throws ServletException { } @Override - public void doFilter(final ServletRequest request, final ServletResponse response, FilterChain chain) + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(DEFAULT_ENCODING); response.setCharacterEncoding(DEFAULT_ENCODING); 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 ddbddd671c..6de40aa637 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,11 +1,16 @@ 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; @@ -32,15 +37,15 @@ public class ResourceFilter implements Filter { private RequestDispatcher requestDispatcher; @Override - public void init(final FilterConfig filterConfig) throws ServletException { + public void init(FilterConfig filterConfig) throws ServletException { this.requestDispatcher = filterConfig.getServletContext().getNamedDispatcher("default"); } @Override - public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - final var req = (HttpServletRequest) request; - final var path = req.getRequestURI().substring(req.getContextPath().length()); + HttpServletRequest req = (HttpServletRequest) request; + String path = req.getRequestURI().substring(req.getContextPath().length()); if (isResourceUrl(path)) { log.debug("path : {}", path); requestDispatcher.forward(request, response); @@ -49,8 +54,8 @@ public void doFilter(final ServletRequest request, final ServletResponse respons } } - private boolean isResourceUrl(final String url) { - for (final var prefix : resourcePrefixs) { + private boolean isResourceUrl(String url) { + for (String prefix : resourcePrefixs) { if (url.startsWith(prefix)) { return true; } diff --git a/mvc/src/main/java/com/interface21/web/SpringServletContainerInitializer.java b/mvc/src/main/java/com/interface21/web/SpringServletContainerInitializer.java index da8da4f324..6d3a924b39 100644 --- a/mvc/src/main/java/com/interface21/web/SpringServletContainerInitializer.java +++ b/mvc/src/main/java/com/interface21/web/SpringServletContainerInitializer.java @@ -16,7 +16,7 @@ public class SpringServletContainerInitializer implements ServletContainerInitia @Override public void onStartup(Set> webAppInitializerClasses, ServletContext servletContext) throws ServletException { - final List initializers = new ArrayList<>(); + List initializers = new ArrayList<>(); if (webAppInitializerClasses != null) { for (Class waiClass : webAppInitializerClasses) { 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..5d3609b698 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/ModelAndView.java @@ -9,17 +9,17 @@ public class ModelAndView { private final View view; private final Map model; - public ModelAndView(final View view) { + public ModelAndView(View view) { this.view = view; this.model = new HashMap<>(); } - public ModelAndView addObject(final String attributeName, final Object attributeValue) { + public ModelAndView addObject(String attributeName, Object attributeValue) { model.put(attributeName, attributeValue); return this; } - public Object getObject(final String attributeName) { + public Object getObject(String attributeName) { return model.get(attributeName); } diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/asis/Controller.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/asis/Controller.java index 20e714341a..e1883d68b8 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/asis/Controller.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/asis/Controller.java @@ -4,5 +4,5 @@ import jakarta.servlet.http.HttpServletResponse; public interface Controller { - String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception; + String execute(HttpServletRequest req, HttpServletResponse res) throws Exception; } diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/asis/ForwardController.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/asis/ForwardController.java index ecceef15af..35cb2ab211 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/asis/ForwardController.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/asis/ForwardController.java @@ -9,12 +9,12 @@ public class ForwardController implements Controller { private final String path; - public ForwardController(final String path) { + public ForwardController(String path) { this.path = Objects.requireNonNull(path); } @Override - public String execute(final HttpServletRequest request, final HttpServletResponse response) { + public String execute(HttpServletRequest request, HttpServletResponse response) { return path; } } 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 401537228f..67f0e72107 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 @@ -16,7 +16,7 @@ public class AnnotationHandlerMapping { private final Object[] basePackage; private final HandlerExecutions handlerExecutions; - public AnnotationHandlerMapping(final Object... basePackage) { + public AnnotationHandlerMapping(Object... basePackage) { this.basePackage = basePackage; this.handlerExecutions = new HandlerExecutions(); } diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java index d26fda5e0d..9412875dff 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerExecution.java @@ -16,7 +16,7 @@ public HandlerExecution(Class controller, Method method) { this.method = method; } - public ModelAndView handle(final HttpServletRequest request, final HttpServletResponse response) throws Exception { + public ModelAndView handle(HttpServletRequest request, HttpServletResponse response) throws Exception { Constructor constructor = controller.getConstructor(); Object instance = constructor.newInstance(); diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerKey.java b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerKey.java index 55f8e593a1..e10abd75eb 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerKey.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/mvc/tobe/HandlerKey.java @@ -9,7 +9,7 @@ public class HandlerKey { private final String url; private final RequestMethod requestMethod; - public HandlerKey(final String url, final RequestMethod requestMethod) { + public HandlerKey(String url, RequestMethod requestMethod) { this.url = url; this.requestMethod = requestMethod; } diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/view/JsonView.java b/mvc/src/main/java/com/interface21/webmvc/servlet/view/JsonView.java index ffe5ae6fe2..5da6bdb2eb 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/view/JsonView.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/view/JsonView.java @@ -9,6 +9,6 @@ public class JsonView implements View { @Override - public void render(final Map model, final HttpServletRequest request, HttpServletResponse response) throws Exception { + public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { } } diff --git a/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java b/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java index e948370b5a..6c3c50aded 100644 --- a/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java +++ b/mvc/src/main/java/com/interface21/webmvc/servlet/view/JspView.java @@ -1,6 +1,7 @@ package com.interface21.webmvc.servlet.view; import com.interface21.webmvc.servlet.View; +import jakarta.servlet.RequestDispatcher; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; @@ -18,14 +19,14 @@ public JspView(String viewName) { } @Override - public void render(final Map model, final HttpServletRequest request, final HttpServletResponse response) + public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { model.keySet().forEach(key -> { log.debug("attribute name : {}, value : {}", key, model.get(key)); request.setAttribute(key, model.get(key)); }); - final var requestDispatcher = request.getRequestDispatcher(viewName.getViewName()); + RequestDispatcher requestDispatcher = request.getRequestDispatcher(viewName.getViewName()); requestDispatcher.forward(request, response); } } 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 a0f7c27fd0..ca34f11ccc 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 @@ -1,6 +1,7 @@ package com.interface21.webmvc.servlet.mvc.tobe; import com.interface21.web.bind.annotation.RequestMethod; +import com.interface21.webmvc.servlet.ModelAndView; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; @@ -27,16 +28,16 @@ void setUp() { @Test void get() throws Exception { //given - final var request = mock(HttpServletRequest.class); - final var response = mock(HttpServletResponse.class); + HttpServletRequest request = mock(HttpServletRequest.class); + HttpServletResponse response = mock(HttpServletResponse.class); when(request.getAttribute("id")).thenReturn("gugu"); when(request.getRequestURI()).thenReturn("/get-test"); when(request.getMethod()).thenReturn("GET"); //when - final var handlerExecution = (HandlerExecution) handlerMapping.findHandler(request); - final var modelAndView = handlerExecution.handle(request, response); + HandlerExecution handlerExecution = handlerMapping.findHandler(request); + ModelAndView modelAndView = handlerExecution.handle(request, response); //then assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); @@ -45,16 +46,16 @@ void get() throws Exception { @Test void post() throws Exception { //given - final var request = mock(HttpServletRequest.class); - final var response = mock(HttpServletResponse.class); + HttpServletRequest request = mock(HttpServletRequest.class); + HttpServletResponse response = mock(HttpServletResponse.class); when(request.getAttribute("id")).thenReturn("gugu"); when(request.getRequestURI()).thenReturn("/post-test"); when(request.getMethod()).thenReturn("POST"); //when - final var handlerExecution = (HandlerExecution) handlerMapping.findHandler(request); - final var modelAndView = handlerExecution.handle(request, response); + HandlerExecution handlerExecution = handlerMapping.findHandler(request); + ModelAndView modelAndView = handlerExecution.handle(request, response); //then assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); @@ -64,16 +65,16 @@ void post() throws Exception { @EnumSource(value = RequestMethod.class) void noMethod(RequestMethod requestMethod) throws Exception { //given - final var request = mock(HttpServletRequest.class); - final var response = mock(HttpServletResponse.class); + HttpServletRequest request = mock(HttpServletRequest.class); + HttpServletResponse response = mock(HttpServletResponse.class); when(request.getAttribute("id")).thenReturn("gugu"); when(request.getRequestURI()).thenReturn("/no-method-test"); when(request.getMethod()).thenReturn(requestMethod.name()); //when - final var handlerExecution = (HandlerExecution) handlerMapping.findHandler(request); - final var modelAndView = handlerExecution.handle(request, response); + HandlerExecution handlerExecution = handlerMapping.findHandler(request); + ModelAndView modelAndView = handlerExecution.handle(request, response);; //then assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); diff --git a/mvc/src/test/java/samples/TestController.java b/mvc/src/test/java/samples/TestController.java index 6618bc4e2e..92a2fa6cf2 100644 --- a/mvc/src/test/java/samples/TestController.java +++ b/mvc/src/test/java/samples/TestController.java @@ -16,25 +16,25 @@ public class TestController { private static final Logger log = LoggerFactory.getLogger(TestController.class); @RequestMapping(value = "/get-test", method = RequestMethod.GET) - public ModelAndView findUserId(final HttpServletRequest request, final HttpServletResponse response) { + public ModelAndView findUserId( HttpServletRequest request, HttpServletResponse response) { log.info("test controller get method"); - final var modelAndView = new ModelAndView(new JspView("")); + ModelAndView modelAndView = new ModelAndView(new JspView("")); modelAndView.addObject("id", request.getAttribute("id")); return modelAndView; } @RequestMapping(value = "/post-test", method = RequestMethod.POST) - public ModelAndView save(final HttpServletRequest request, final HttpServletResponse response) { + public ModelAndView save( HttpServletRequest request, HttpServletResponse response) { log.info("test controller post method"); - final var modelAndView = new ModelAndView(new JspView("")); + ModelAndView modelAndView = new ModelAndView(new JspView("")); modelAndView.addObject("id", request.getAttribute("id")); return modelAndView; } @RequestMapping(value = "/no-method-test") - public ModelAndView noMethod(final HttpServletRequest request, final HttpServletResponse response) { + public ModelAndView noMethod( HttpServletRequest request, HttpServletResponse response) { log.info("test controller no method"); - final var modelAndView = new ModelAndView(new JspView("")); + ModelAndView modelAndView = new ModelAndView(new JspView("")); modelAndView.addObject("id", request.getAttribute("id")); return modelAndView; } From 2613438fcb1179356d17582859d11953230ffbea Mon Sep 17 00:00:00 2001 From: tkdgur0906 Date: Sun, 22 Sep 2024 21:27:21 +0900 Subject: [PATCH 16/16] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=20displayname=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servlet/mvc/tobe/AnnotationHandlerMappingTest.java | 5 ++++- 1 file changed, 4 insertions(+), 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 ca34f11ccc..db5278f4cd 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 @@ -25,6 +25,7 @@ void setUp() { handlerMapping.initialize(); } + @DisplayName("GET 요청을 처리하는 핸들러 매핑 성공") @Test void get() throws Exception { //given @@ -43,6 +44,7 @@ void get() throws Exception { assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); } + @DisplayName("POST 요청을 처리하는 핸들러 매핑 성공") @Test void post() throws Exception { //given @@ -61,6 +63,7 @@ void post() throws Exception { assertThat(modelAndView.getObject("id")).isEqualTo("gugu"); } + @DisplayName("method 설정이 없는 경우 모든 Http method를 지원") @ParameterizedTest @EnumSource(value = RequestMethod.class) void noMethod(RequestMethod requestMethod) throws Exception { @@ -74,7 +77,7 @@ void noMethod(RequestMethod requestMethod) throws Exception { //when HandlerExecution handlerExecution = handlerMapping.findHandler(request); - ModelAndView modelAndView = handlerExecution.handle(request, response);; + ModelAndView modelAndView = handlerExecution.handle(request, response); //then assertThat(modelAndView.getObject("id")).isEqualTo("gugu");