Skip to content
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단계] 디우(김동규) 미션 제출합니다. #289

Merged
merged 12 commits into from
Sep 27, 2022

Conversation

tco0427
Copy link

@tco0427 tco0427 commented Sep 27, 2022

안녕하세요 수달!!

오늘까지 PR 마지막 제출이라서 빠르게 3단계 구현해서 제출합니다..!!

이번 단계에서는 JsonView 가 제대로 동작하는지 테스트하는 것이 까다로웠었습니다..
저는 참고한 글 에서 How to test a method using a PrintWriter 를 참고해서 테스트를 작성하였습니다ㅎ.ㅎ
또한 힌트에서 model에 데이터가 1개면 값을 그대로 반환하고 2개 이상이면 Map 형태 그대로 JSON으로 변환해서 반환한다. 라는 말이 있어 해당 요구사항에 맞게 구현해보았습니다!!

그리고 이번에도 역시 마찬가지로 하나하나씩 Controller 어노테이션 기반으로 갈아끼우는 작업을 하고 테스트 코드도 추가해보았는데요..!! 예외 케이스들까지 모두 고려하면 테스트가 너무 많아질 것 같아..우선 보이는 정상 기능들에 대해서만 추가하였습니다! (시간 나는대로 예외 케이스들도 다룰 수 있도록 추가해보겠습니다..ㅠ.ㅠ)
모든 컨틀롤러에 대해서 리팩터링을 진행한 후 ForwardController 제거, ManualHandlerMapping 제거 순으로 차근차근 asis 패키지를 제거해주었습니다! (요구사항에 asis 패키지에 있는 레거시 코드를 삭제해도 서비스가 정상 동작하도록 리팩터링하자. 라고 되어있어서 모두 제거해주었는데, Controller 인터페이스나 ControllerHandlerAdapter 는 나둬도 backward 호환성은 제공할 수 있어 좋을 것 같다는 생각이 들었는데 그래도 요구사항에 맞게끔 구현해주었습니다!


구현 기능 목록(구현 내용)

1. JspView 클래스를 구현한다.

이 부분은 2단계 미션 진행하면서 DispatcherServlet 에서 ModelAndView 를 이용해 JspView 를 렌더링하도록 책임을 분리하였기 때문에 추가적인 작업은 진행하지 않았습니다 😃

2. JsonView 클래스를 구현한다.

ModelAndView 에서 객체를 받았을 때 ObjectMapper 를 이용해서 JSON 형태로 반환해줄 수 있도록 구현하였습니다. 추가적으로 model 에 담긴 데이터가 한 개인 경우에는 그대로 반환해줄 수 있게 분기처리를 해주었습니다.
UserController 가 제대로 동작하는지 확인하기 위해서 User 도메인에 대해서 Getter 를 열어주었습니다..!!
그런데 JsonView 를 단위 테스트하는게 어려웠었는데요..앞서 언급드린 글을 참고해서 stringWriter 의 toString() 을 이용해 원하는 형식으로 출력되는지 확인하는 방식으로 테스트를 진행해주었습니다.

3. Legacy MVC 제거하기

컨트롤러 하나씩 리팩터링을 진행하며 테스트 코드를 추가해 기존의 동작을 리팩터링 했을 때도 잘 동작하는지 확인할 수 있도록 해주었습니다. 또한 asis 패키지의 클래스들도 한 번에 제거하는 것이 아니라 하나씩 제거해 나가는 방식으로 리팩터링을 진행하였습니다!!


체크 리스트

  • 힌트에서 제공한 UserController 컨트롤러가 json 형태로 응답을 반환한다.
  • 레거시 코드를 삭제하고 서버를 띄워도 정상 동작한다.

마지막 단계도 잘 부탁드립니다!!

@tco0427 tco0427 self-assigned this Sep 27, 2022
Copy link

@her0807 her0807 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 디우!

3단계도 빠르게 구현해주셨네요.

아니,, 디우 모든 controller test code 작성하신거 보고 놀랐어요 ☺️

너무 꼼꼼하게 코드 작성해주셔서 크게 피드백 남길 부분이 없었어요.

jsonView 에 대해서만 코멘트 남겼으니 확인해주시고 코멘트 남기시면 바로 머지 때리겠습니다.

스크린샷 2022-09-27 오후 1 57 59

Comment on lines 28 to 30
final Object attribute = getAttribute(model);
return objectMapper.writeValueAsString(attribute);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 디우!

objectMapper 사용 방법을 새롭게 익히느라 힘드셨을 것 같아요.

해당 로직은 데이터가 하나일 경우에 데이터 값 그대로 반환해주려고 작성하신 것으로 보이는데

value의 개수를 아는 상태에서 스트림을 사용해서 데이터를 가져오는 로직이 조금 무거워보여요!

아래와 같은 로직으로 스트림 없이 추출할 수도 있을 것 같아요 ☺️

Suggested change
final Object attribute = getAttribute(model);
return objectMapper.writeValueAsString(attribute);
}
if (model.size() == 1) {
final String key = (String) model.keySet().toArray()[0];
final Object value = model.get(key);
objectMapper.writeValue(writer, value);
return;
}

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호..!! 그러네요 이미 size를 아는데, 굳이 스트림을 돌면서 가져오는건 낭비였네요..😅
추가적으로 코드 개선해보았습니다!!
또한 writerWithDefaultPrettyPrinter() 부분도 제거해보았는데, 저희 팀의 경우 프런트와 실제로 네트워크를 타고 통신할 때 공백을 추가해주지 않는다고 하더라구요..불필요한 비용이 추가되는 것 같아서 제거해보았습니다!!

return model.values()
.stream()
.findFirst()
.orElseThrow();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

throw 를 하지만, 반환되는 예외가 없네요. 😭

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

스트림 도는 로직을 제거하면서 제거되었습니다!!😃😃

@her0807 her0807 merged commit 62ce967 into woowacourse:tco0427 Sep 27, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants