diff --git a/.gitignore b/.gitignore index 1fac4d5..6f633d8 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,5 @@ bin/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store +.omx/ diff --git a/.idea/copilot.data.migration.ask2agent.xml b/.idea/copilot.data.migration.ask2agent.xml new file mode 100644 index 0000000..1f2ea11 --- /dev/null +++ b/.idea/copilot.data.migration.ask2agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 14746e7..2a65317 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/src/main/java/com/diy/framework/context/RestController.java b/src/main/java/com/diy/framework/context/RestController.java new file mode 100644 index 0000000..d9e611b --- /dev/null +++ b/src/main/java/com/diy/framework/context/RestController.java @@ -0,0 +1,12 @@ +package com.diy.framework.context; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Component +public @interface RestController { +} diff --git a/src/main/java/com/diy/framework/web/DispatcherServlet.java b/src/main/java/com/diy/framework/web/DispatcherServlet.java index 4f69a02..a7fb9ca 100644 --- a/src/main/java/com/diy/framework/web/DispatcherServlet.java +++ b/src/main/java/com/diy/framework/web/DispatcherServlet.java @@ -1,9 +1,11 @@ package com.diy.framework.web; import com.diy.framework.context.HandlerMethod; +import com.diy.framework.context.RestController; import com.diy.framework.web.beans.factory.BeanFactory; import com.diy.framework.web.mvc.ModelAndView; import com.diy.framework.web.mvc.controller.HandlerMapping; +import com.diy.framework.web.mvc.json.JsonResponseWriter; import com.diy.framework.web.mvc.view.JspViewResolver; import com.diy.framework.web.mvc.view.ViewResolver; @@ -23,6 +25,7 @@ public class DispatcherServlet extends HttpServlet { private HandlerMapping handlerMapping; private final ViewResolver viewResolver = new JspViewResolver(); + private final JsonResponseWriter jsonResponseWriter = new JsonResponseWriter(); @Override public void init() throws ServletException { @@ -57,11 +60,15 @@ private void execute(Object handler, HttpServletRequest req, HttpServletResponse if (handler instanceof HandlerMethod handlerMap) { Object controller = ((HandlerMethod) handler).getBean(); + Class controllerClass = controller.getClass(); Method method = ((HandlerMethod) handler).getMethod(); // Reflection 으로 메서드 실행 Object result = method.invoke(controller, req, resp); - if (result instanceof ModelAndView modelAndView) { + + if (controllerClass.isAnnotationPresent(RestController.class)) { + jsonResponseWriter.write(resp, result); + } else if (result instanceof ModelAndView modelAndView) { viewResolver.resolveViewName(modelAndView.getViewName()).render(req, resp, modelAndView.getModel()); } } diff --git a/src/main/java/com/diy/framework/web/mvc/json/JsonResponseWriter.java b/src/main/java/com/diy/framework/web/mvc/json/JsonResponseWriter.java new file mode 100644 index 0000000..da5cc58 --- /dev/null +++ b/src/main/java/com/diy/framework/web/mvc/json/JsonResponseWriter.java @@ -0,0 +1,23 @@ +package com.diy.framework.web.mvc.json; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/* + * Json 응답을 만들기 위한 클래스 + * */ +public class JsonResponseWriter { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + public void write(HttpServletResponse response, Object object) throws IOException { + response.setContentType("application/json; charset=UTF-8"); + String json = objectMapper.writeValueAsString(object); + response.getWriter().write(json); + } +}