인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

sim2님의 프로필 이미지

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

Model 추가 - v3

FrontControllerServletV3 질문

작성

·

205

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

1)
MyView view = viewResolver(viewName); view.render(mv.getModel(), request,response);

이 부분 코드에서 mv.getModel을 사용하지 않는 MemberFormController 같은 경우에는

따로 처리해주는 로직이 필요할 것 같은데 service 메서드에서 저렇게 해버리면 무조건 저 로직이 실행되는 거 아닌가요?? 저런 경우에 조건문을 통해서 경우를 나눠야 하는건지 궁금합니다. 예를 들어서 아래 코드와 같이

if (조건문) {
  view.render(mv.getModel(), request,response);
}
view.render(request, response);

 

2)

그리고 FrontControllerV3와 MemberListControllerV3을 다음과같이 이해하면 되는 지도 궁금합니다.

FrontControllerV3 일부 로직

//paramMap
Map<String, String> paramMap = createParamMap(request);
//논리 이름과 클라이언트 요청의 매개변수가 설정된 ModelView 객체
ModelView mv = controller.process(paramMap);
//논리이름 "new-form"을 viewName에 저장
String viewName = mv.getViewName();
//논리이름을 viewPath로 변환해주는 viewResolver 메서드 실행
//"new-form" --> "/WEB-INF/views/new-form.jsp"
MyView view = viewResolver(viewName);
//Myview 객체에 viewPath 멤버 필드에 경로가 초기화 되고
//초기화된 경로를 통해 jsp로 넘겨주기
view.render(mv.getModel(), request,response);

MemberListControllerV3 일부 로직

//new MyView("/WEB-INF/views/members.jsp");와 똑같지만 .jsp와 다른 경로 등은 날리고
//논리적인 경로만 남기기 위해서 이렇게 만든 형태
ModelView mv = new ModelView("members");
//request.setAttribute("members", members);
mv.getModel().put("members", members);
//따라서 modelView는 이름 그대로 view의 이름과 model 객체를 저장한 채로 반환해주게 되는 것
return mv;

 

3)

그리고

@Override
public ModelView process(Map<String, String> paramMap) {
    return new ModelView("new-form");
}

MemberFormControllerV3같은 경우 매개변수로 들어오는 paramMap을 사용하지 않는 모습인데 이런 경우는 따로 구조를 개선할 수는 없는 건지 궁금합니다.

답변 2

0

David님의 프로필 이미지

안녕하세요. sim2님, 공식 서포터즈 David입니다.

인프런 AI 인턴 답변에 이어 답변드리겠습니다.
2. 전반적으로 잘 이해하고 계신 것 같습니다.
3. paramMap을 받는 것과 아닌 것을 구분하여 구현하려면 조금 더 설계가 복잡해집니다. 컨트롤러 공통 인터페이스를 구현하고 paramMap을 받는 인터페이스와 아닌 인터페이스를 만들고 이 인터페이스들은 공통 인터페이스를 상속해야 합니다. 그리고 이를 프론트 컨트롤러에서 적절히 처리할 수 있어야 합니다.

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. sim2님 질문에 대해 도움을 드리겠습니다.

FrontControllerServletV3에서 사용되는 MyViewrender 메서드에 대해 궁금하신 것 같습니다.

먼저, mv.getModel()은 현재 요청에서 모델 데이터를 가져오기 위한 부분입니다. 하지만 모든 컨트롤러가 모델 데이터를 필요로 하거나 사용하는 것은 아닙니다. 예를 들어, MemberFormController와 같은 경우는 뷰만 반환하고, 데이터 모델을 사용하지 않을 수도 있습니다.

이 경우, 코드에서 render 메소드가 실행되더라도, 모델이 비어 있으면 모델 정보를 설정하지 않고 단지 뷰만 렌더링할 수 있습니다. 즉, 모델의 데이터가 필수적이지 않은 경우, 프로그램은 모델이 없는 경우에도 정상 작동하도록 설계되어 있습니다. 따라서 일반적인 경우에 render 메서드는 데이터 없이도 문제없이 작동할 수 있습니다.

추가적으로 아래 링크를 참고하시면, 유사한 맥락의 고민을 해결하는 데 도움이 될 수 있습니다:
1. ModelAndView객체와 view 따로 model 따로 처리하는 부분이 이해가 잘 안갑니다 ㅠㅠ
2. FrontControllerServletV3 의 render 매서드 질문입니다.

질문이 해결되지 않았거나, 다른 궁금한 점이 있으시면 계속해서 질문해 주세요. 지식공유자님께서도 추가적으로 답변을 드릴 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

sim2님의 프로필 이미지

작성한 질문수

질문하기