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

전한준님의 프로필 이미지

작성한 질문수

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

강사님 v3 만들때

작성

·

72

0

MyView에 뷰를 렌더링하는 과정에서

Map으로 username과 age 에 관련한 파라미터값이 전달이 되고 Myview (두번째코드에서) 그 내용이 전달이 되는 거 맞나요 ? (강의를 3번 돌려봤는데 좀 애매해서 질문드립니다.) (블로그 글도 찾아봤는데 데이터를 뷰로 전달하는 코드인 것 같은데 정확히 이해가 안돼서 질문 드립니다.)

package hello.servlet.domain.web.servlet.frontcontroller.v3;

import hello.servlet.domain.web.servlet.frontcontroller.ModelView;
import hello.servlet.domain.web.servlet.frontcontroller.MyView;
import hello.servlet.domain.web.servlet.frontcontroller.v3.controller.MemberFormControllerV3;
import hello.servlet.domain.web.servlet.frontcontroller.v3.controller.MemberListControllerV3;
import hello.servlet.domain.web.servlet.frontcontroller.v3.controller.MemberSaveControllerV3;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

// /front-controller/v3/* URL 패턴을 처리하는 서블릿
@WebServlet(name = "frontControllerServletV3", urlPatterns = "/front-controller/v3/*")
public class FrontControllerServlet3 extends HttpServlet {

    private Map<String, ControllerV3> controllerMap = new HashMap<>();

    public FrontControllerServlet3() {
        controllerMap.put("/front-controller/v3/members/new-form", new MemberFormControllerV3());
        controllerMap.put("/front-controller/v3/members/save", new MemberSaveControllerV3());
        controllerMap.put("/front-controller/v3/members", new MemberListControllerV3());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("FrontControllerServlet3.service");

        String requestUri = request.getRequestURI();
        ControllerV3 controller = controllerMap.get(requestUri);

        if (controller == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        Map<String, String> paramMap = createParamMap(request);
        ModelView mv = controller.process(paramMap);

        String viewName = mv.getViewname();
        MyView view = viewResolver(viewName);

        view.render(mv.getModel(), request, response);
    }

    private Map<String, String> createParamMap(HttpServletRequest request) {
        Map<String, String> paramMap = new HashMap<>();
        request.getParameterNames().asIterator().forEachRemaining(paramName ->
                paramMap.put(paramName, request.getParameter(paramName)));
        return paramMap;
    }

    private MyView viewResolver(String viewName) {
        return new MyView("/WEB-INF/views/" + viewName + ".jsp");
    }
}

 

  public void modelToRequestAttribute(Map<String,Object> model,HttpServletRequest request) {
        //.jsp는 setAttribute를 씀
        model.forEach((key,value)->request.setAttribute(key,value));
        //request에 모든 정보를 저장한다.  model에 있는 정보를 requestAttribute로 바꾼다.
        //request에 값을 다 담아둔다.
    }

}

답변 1

0

안녕하세요. 전한준님, 공식 서포터즈 OMG입니다.

네, 이해하신게 맞습니다.

V3 요청을 처리할 때, 마지막 실행은 view.render()를 호출하는데요

image.png

view의 render()를 보시면, 첫번째 실행이 modelToRequestAttribute()입니다.

따라서 이해하신게 실행 흐름상 맞습니다.

image.png

 

감사합니다.

전한준님의 프로필 이미지
전한준
질문자

여기서 key랑 value값이 정확히 뭔가요??

key value는 model( = map)을 순회하기 때문에 model에 담긴 데이터를 디버깅으로 확인해볼 수 있는데요.

image.png

다음과 같이 회원을 등록하는 폼 화면에서 등록 버튼을 클릭할 때 단일 회원정보가 모델의 key("member"), value(회원객체)입니다.

image.png

회원 목록을 조회하는 페이지에서 호출될 때는

모델의 key는 "members", value는 회원목록 리스트(ArrayList)입니다.

전한준님의 프로필 이미지
전한준
질문자

감사합니다.