-
Notifications
You must be signed in to change notification settings - Fork 299
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[MVC 구현하기 - 3단계] 여우(조승현) 미션 제출합니다 #618
Merged
Merged
Changes from 6 commits
Commits
Show all changes
10 commits
Select commit
Hold shift + click to select a range
901f174
refactor : 3단계 - 어노테이션 기반 컨트롤러가 잘 되는지 확인할 수 있도록 레거시 컨트롤러 중 몇가지를 어노테이션…
BackFoxx 323ec1d
feat : 3단계 - JspView의 render 메서드를 통해 view를 보여주게 하기
BackFoxx 820af64
feat : 3단계 - 각 HandlerAdapter가 ModelAndView를 반환하고, DispatcherServlet은…
BackFoxx 93bd636
feat : 3단계 - 레거시 컨트롤러를 모두 신세대 컨트롤러로 바꾸고, 레거시 관련 어댑터와 핸들러매핑을 제거
BackFoxx 8198b16
feat : 3단계 - DispatcherServlet을 mvc 패키지로 옮기기
BackFoxx 5b901d3
feat : 3단계 - JsonView를 구현하고, DispatcherServlet에 연결
BackFoxx 8f3e15a
feat : 3단계 피드백 - render 메서드를 ModelAndView 안으로 캡슐화
BackFoxx aebcfeb
feat : 3단계 피드백 - JsonView에서 early return 추가
BackFoxx 7641ee5
feat : 3단계 피드백 - HandlerMappingRegistry를 구현해 HandlerMappings의 관리 책임을 …
BackFoxx 8f33d16
feat : 3단계 피드백 - HandlerAdapterRegistry를 구현해 HandlerAdapter의 관리 책임을 D…
BackFoxx File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
39 changes: 0 additions & 39 deletions
39
app/src/main/java/com/techcourse/ManualHandlerMapping.java
This file was deleted.
Oops, something went wrong.
16 changes: 16 additions & 0 deletions
16
app/src/main/java/com/techcourse/controller/IndexViewController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package com.techcourse.controller; | ||
|
||
import context.org.springframework.stereotype.Controller; | ||
import jakarta.servlet.http.HttpServletRequest; | ||
import jakarta.servlet.http.HttpServletResponse; | ||
import web.org.springframework.web.bind.annotation.RequestMapping; | ||
import web.org.springframework.web.bind.annotation.RequestMethod; | ||
|
||
@Controller | ||
public class IndexViewController { | ||
|
||
@RequestMapping(value = "/", method = RequestMethod.GET) | ||
public String execute(final HttpServletRequest req, final HttpServletResponse res) throws Exception { | ||
return "/index.jsp"; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 6 additions & 3 deletions
9
app/src/main/java/com/techcourse/controller/LoginViewController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 6 additions & 3 deletions
9
app/src/main/java/com/techcourse/controller/LogoutController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 6 additions & 3 deletions
9
app/src/main/java/com/techcourse/controller/RegisterViewController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 33 additions & 0 deletions
33
app/src/main/java/com/techcourse/controller/UserController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package com.techcourse.controller; | ||
|
||
import com.techcourse.domain.User; | ||
import com.techcourse.repository.InMemoryUserRepository; | ||
import context.org.springframework.stereotype.Controller; | ||
import jakarta.servlet.http.HttpServletRequest; | ||
import jakarta.servlet.http.HttpServletResponse; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import web.org.springframework.web.bind.annotation.RequestMapping; | ||
import web.org.springframework.web.bind.annotation.RequestMethod; | ||
import webmvc.org.springframework.web.servlet.ModelAndView; | ||
import webmvc.org.springframework.web.servlet.view.JsonView; | ||
|
||
@Controller | ||
public class UserController { | ||
|
||
private static final Logger log = LoggerFactory.getLogger(UserController.class); | ||
|
||
@RequestMapping(value = "/api/user", method = RequestMethod.GET) | ||
public ModelAndView show(HttpServletRequest request, HttpServletResponse response) { | ||
final String account = request.getParameter("account"); | ||
log.debug("user id : {}", account); | ||
|
||
final ModelAndView modelAndView = new ModelAndView(new JsonView()); | ||
final User user = InMemoryUserRepository.findByAccount(account) | ||
.orElseThrow(); | ||
|
||
modelAndView.addObject("user", user); | ||
return modelAndView; | ||
} | ||
} | ||
|
20 changes: 0 additions & 20 deletions
20
app/src/main/java/com/techcourse/controlleradapter/ControllerHandlerAdapter.java
This file was deleted.
Oops, something went wrong.
4 changes: 2 additions & 2 deletions
4
app/src/main/java/com/techcourse/controlleradvisor/DispatcherServletAdvisor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
package web.org.springframework.http; | ||
|
||
public class MediaType { | ||
public static final String TEXT_PLAIN_UTF8_VALUE = "text/plain;charset=UTF-8"; | ||
public static final String APPLICATION_JSON_UTF8_VALUE = "application/json;charset=UTF-8"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,7 @@ | ||
package com.techcourse; | ||
package webmvc.org.springframework.web.servlet; | ||
|
||
import com.techcourse.controlleradapter.ControllerHandlerAdapter; | ||
import com.techcourse.exception.HandlerAdapterNotFoundException; | ||
import com.techcourse.exception.HandlerNotFoundException; | ||
import webmvc.org.springframework.web.servlet.exception.HandlerAdapterNotFoundException; | ||
import webmvc.org.springframework.web.servlet.exception.HandlerNotFoundException; | ||
import jakarta.servlet.ServletException; | ||
import jakarta.servlet.http.HttpServlet; | ||
import jakarta.servlet.http.HttpServletRequest; | ||
|
@@ -11,13 +10,10 @@ | |
import java.util.Objects; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import webmvc.org.springframework.web.servlet.ExceptionHandlerMapping; | ||
import webmvc.org.springframework.web.servlet.HandlerMapping; | ||
import webmvc.org.springframework.web.servlet.mvc.HandlerAdapter; | ||
import webmvc.org.springframework.web.servlet.mvc.tobe.AnnotationExceptionHandlerMapping; | ||
import webmvc.org.springframework.web.servlet.mvc.tobe.AnnotationHandlerMapping; | ||
import webmvc.org.springframework.web.servlet.mvc.tobe.HandlerExecutionHandlerAdapter; | ||
import webmvc.org.springframework.web.servlet.view.JspView; | ||
|
||
public class DispatcherServlet extends HttpServlet { | ||
|
||
|
@@ -29,13 +25,11 @@ public class DispatcherServlet extends HttpServlet { | |
); | ||
|
||
private List<HandlerMapping> handlerMappings = List.of( | ||
new ManualHandlerMapping(), | ||
new AnnotationHandlerMapping("com/techcourse") | ||
); | ||
|
||
private List<HandlerAdapter> handlerAdapters = List.of( | ||
new HandlerExecutionHandlerAdapter(), | ||
new ControllerHandlerAdapter() | ||
new HandlerExecutionHandlerAdapter() | ||
); | ||
|
||
public DispatcherServlet() { | ||
|
@@ -60,8 +54,8 @@ protected void service(final HttpServletRequest request, final HttpServletRespon | |
final Object handler = findHandler(request); | ||
|
||
final HandlerAdapter handlerAdapter = findHandlerAdaptor(handler); | ||
final String viewPath = handlerAdapter.invoke(handler, request, response); | ||
move(viewPath, request, response); | ||
final ModelAndView modelAndView = handlerAdapter.invoke(handler, request, response); | ||
modelAndView.getView().render(modelAndView.getModel(), request, response); | ||
} catch (Throwable e) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. view와 model을 가져오지 않고 ModelAndView에서 render를 수행해주는 방향으로 가면 어떨까요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 오,, 캡슐화! |
||
handleException(request, response, e); | ||
} | ||
|
@@ -86,19 +80,8 @@ private HandlerAdapter findHandlerAdaptor(final Object handler) { | |
throw new HandlerAdapterNotFoundException("Handler Adaptor Not found"); | ||
} | ||
|
||
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); | ||
} | ||
|
||
private void handleException(final HttpServletRequest request, final HttpServletResponse response, final Throwable e) { | ||
try { | ||
Object handler = null; | ||
try {Object handler = null; | ||
for (ExceptionHandlerMapping exceptionHandlerMapping : exceptionHandlerMappings) { | ||
final Object foundHandler = findExceptionHandler(e, exceptionHandlerMapping); | ||
if (Objects.nonNull(foundHandler)) { | ||
|
@@ -111,8 +94,8 @@ private void handleException(final HttpServletRequest request, final HttpServlet | |
throw new ServletException("ExceptionHandler Not Found."); | ||
} | ||
final HandlerAdapter handlerAdapter = findHandlerAdaptor(handler); | ||
final String viewPath = handlerAdapter.invoke(handler, request, response); | ||
move(viewPath, request, response); | ||
final ModelAndView modelAndView = handlerAdapter.invoke(handler, request, response); | ||
modelAndView.getView().render(modelAndView.getModel(), request, response); | ||
} catch (Exception exception) { | ||
log.error("Exception caused in ExceptionHandler"); | ||
throw new RuntimeException(e); | ||
|
2 changes: 1 addition & 1 deletion
2
...exception/DispatcherServletException.java → ...exception/DispatcherServletException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
...tion/HandlerAdapterNotFoundException.java → ...tion/HandlerAdapterNotFoundException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
...e/exception/HandlerNotFoundException.java → ...t/exception/HandlerNotFoundException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8 changes: 0 additions & 8 deletions
8
mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/asis/Controller.java
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DispatcherServlet
에서 필요한 필드인exceptionHandlerMappings
,handlerMappings
,handlerAdapters
를DispatcherServletInitializer
에서 주입 시켜주시는 것에 대해 어떻게 생각하시나요?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
추가적으로 미션 2 힌트를 보셨을까요?
해당 미션 힌트에는
HandlerAdapterRegistry
와HandlerMappingRegitry
가 있었는데, 적용하지 않은 이유가 있을까요?적용한다면
findHandler
,findHandlerAdaptor
역할을 넘길 수 있을지도..?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
2단계 진행 도중 힌트가 삭제돼서 Registry의 존재를 잊고 있었네요!
Registrty들을 사용해서 HandlerMapping들과 HandlerAdapter에 대한 관리 책임을 외부로 옮겼습니다.
혹시 DispatcherServlet 입장에서는
본인이 사용하는 객체에 대한 책임이 외부로 옮겨지는 것이니
이런 걸 IOC라고 부르는 걸까요? IOC가 무엇인지 개념이 잘 안 잡혀 있어서.. 🥹
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IOC 중 DI에 대한 이야기였습니다.
사실 의견을 여쭤본 이유가 예전 레벨 1, 2 때는 보통 객체의 필드들을 외부에서 생성해 의존성 주입을 시켜줬던 기억이 있어 저는 그렇게 진행하게 되었습니다.
그런데 여러 pr을 보다보니 저와 비슷하게 진행한 크루들도 있고 그렇지 않은 크루들도 있는 것 같아 여우의 의견도 궁금해 질문드리게 되었습니디!