-
Notifications
You must be signed in to change notification settings - Fork 305
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단계] 디투(박정훈) 미션 제출합니다. #625
Conversation
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.
안녕하세요 디투 😎
3단계 미션도 잘 구현해주셨네요! DispatcherServlet
의 여행 커밋을 따라가며 잘 확인했습니다 :)
크게 수정해야 할 부분은 없지만, 디투와 마지막으로 얘기 나누고 싶은 부분이 있어서 Request changes
하게 되었어요.
커멘트 확인해주시면 감사합니다 수고하셨어요 🙇🏻♂️
|
||
import java.util.Map; | ||
|
||
public class JsonView implements View { | ||
|
||
@Override | ||
public void render(final Map<String, ?> model, final HttpServletRequest request, HttpServletResponse response) throws Exception { | ||
final ObjectMapper objectMapper = new ObjectMapper(); |
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.
render
메서드가 호출될 때마다 새로운 ObjectMapper
객체가 생성될 것 같은데 정적 변수로 두는 것은 어떨까요?
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.
현재 구조에서는 JsonView
가 싱글턴이 아니기 때문에 하나의 JsonView
마다 render()
메소드가 한 번만 호출됩니다. 그래서 정적 변수로 두는 것이 크게 메리트있다고 생각하진 않아요ㅠㅠ
그래서! 나중에 스프링 DI를 구현한다는 가정하에 일반 필드로 두었어요! 요건 어떠신가요?
public class JsonView implements View {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void render(final Map<String, ?> model, final HttpServletRequest request, HttpServletResponse response) throws Exception {
final Object modelValue = getModelValue(model);
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
response.getWriter().write(objectMapper.writeValueAsString(modelValue));
}
private Object getModelValue(final Map<String, ?> model) {
if (model.size() == 1) {
return model.values().iterator().next();
}
return model;
}
}
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.
결국 JsonView
객체를 무한히 생성할 수 있기 때문에 static 이 의미있다고 생각하지 않았습니다!
public ModelAndView showMyDazzle(final HttpServletRequest req, final HttpServletResponse res) { | ||
return new ModelAndView(new JspView("404.jsp")); | ||
return new ModelAndView(new JspView("index.jsp")); |
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.
❤️
@@ -1,12 +1,11 @@ | |||
package com.techcourse; | |||
package webmvc.org.springframework.web.servlet; |
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.
DispatcherServelt
의 먼 여정 커밋 순서대로 잘 확인했습니다! 흐름을 순서대로 정리하면 아래와 같이 될 것 같아요 :)
- 프레임워크 패키지가 애플리케이션 패키지 의존성을 가지도록 하고
DispatcherServlet
,Initialize
mvc
패키지로 수정 - 애플리케이션 패키지 의존성을 제거하고
DispatcherServlet
,Initialize
app
패키지로 수정 DispatcherServlet
만mvc
패키지로 수정
각 과정을 진행하면서 어떤 생각의 흐름으로 진행하셨는지 궁금해요. 디투의 여정을 설명해주시면 감사합니다 ㅎㅎ
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
을 옮기려고 mvc 패키지로 옮겼습니다.
아니 그런데 다른 모듈이라서 build.gradle
파일에 의존성을 추가시켜 줘야 하더라구요! 그렇게 해야 app 모듈에 있는 ManualXXX
를 import 할 수 있었어요. 그런데 그렇게 되면 실행할 때 mvc 패키지와 app 패키지에서 순환참조가 발생하더라구요...
그래서 일단 DispatcherServlet
을 다시 app 패키지로 옮기고 작업을 했어요!
마지막에 ManualXXX
를 싹 다 지워서 build.gradle
에 의존성 추가하지 않아도 되게끔 수정을 했고, mvc
로 옮겼습니다.
Initialize
도 옮기고 싶었지만, 그렇게 되면 uri mapping을 읽지 못하더라구요. ServletContext
때문이라고 생각하는데, 급한 나머지 자세히 뜯어보진 않았습니다ㅠㅠ
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.
슬랙에 코치님께서 Initialize
를 굳이 옮기지 않아도 된다고 하셔서 뭔가 설정이 있겠구나 하고 넘어갔습니다!
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.
과정을 하나씩 진행하면서 직접 겪었던 문제를 바탕으로 수정하신 점이 인상깊네요 👍
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.
안녕하세요 디투 ! 다즐입니다 :)
질문에 대한 답변과 커멘트에 대한 수정까지 확인 완료했습니다 !
리뷰를 통해 저도 많이 배워갈 수 있었던 것 같아요 🙇🏻♂️
다음 미션도 화이팅이에요 ㅎㅎ
안녕하세요 다즐, 저 멀리 떠나셨군요.
돌아오라는 의미로 404에서 Index 페이지로 바꾸어 보았습니다.
이번 미션에서 가장 큰 고민이었던 것은
ModelAndView
에 render를 만들까 말까 였습니다.ModelAndView
에 render 메소드를 만들면 getter 사용 없이View
객체의 render를 호출할 수 있어서 정말 고민했는데요.결국 VO이기 때문에 어쩔 수 없다고 생각했습니다. 그리고 VO에는 최대한 로직을 제거하는 것이 좋다고 생각했어요. (++ VO가 감당하기에 request와 response는 너무 큰 객체라고 생각했습니다.)
그래서 결국 getter를 쓰고 view.render()를 이용하여 랜더링했습니다.
이번에도 잘 부탁드립니다 다즐 😀