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

australialove19님의 프로필 이미지
australialove19

작성한 질문수

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

Model 추가 - v3

modelView -> 실제 데이터가 궁금합니다.

작성

·

520

0

http://localhost:8080/servlet/members/new-form

이 주소를 호출했다면 new MemberFormControllerV3()가 호출이 되는것까지 이해했습니다.

(22분 26초)

그런데 그 전에 createParamMap을 가지고 HttpServlet request에 있는 파라미터를 다 뽑아서 paramMap을 만들어서 반환한다.

이 부분이 이해가 안됩니다 ㅠㅠ 실제 어떤 데이터가 들어가고 어떤 데이터가 반환되는지 실제값으로 설명해주실 수 있나요? ㅠㅠ

request에는 servlet/members/new-form 이 주소가 들어가는건가요..? 파라미터를 뽑는다는게 정확히 어떤 의미인지 잘 모르겠습니다 ㅠㅠ

마지막으로, paramMap은 HttpServlet request, HttpServlet response를 대체한 것 맞죠..?

답변 3

0

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

네! 이 부분에서 제가 render 메서드에서 dispatcher.forward를 보지 못했어요 ㅠㅠ

추가적으로

new ModelView("new-form");

이 부분은 

생성자에 값을 넣어서 mv.getModel()이 가능해보이는데요,

mv.getModel했을 때 안에 값이 어떻게 담겨있는지 확인하고 싶은데 어떻게 확인할 수 있을까요? ㅠㅠ

return이 model이라 "member" = "" 이렇게 남아있는지 결과값도 궁금합니당..!

꼼꼼하게 읽어주시고 상세하게 답변해주셔서 감사합니다 !!

private Map<String, Object> model 은 Map 타입이므로 map은 mode.get("key")로 value를 확인할 수 있습니다. 해당 부분은 자바의 컬렉션과 관련된 내용입니다.

Map을 JSON으로 반환할 경우 객체와 동일하게 "key":"value" 형태를 가집니다.

참고

https://tonyne.jeju.onl/2016/08/02/spring4-haspmap-db-select-json-output/

0

모든 파라미터라는 말이 form에서 보낸걸 말하는줄 몰랐어요 ㅠㅠ

이제 paramMap에 username:australia19, age:19가 저장된것까지 이해가 됐습니다.

ModelView mv = controller.process(paramMap);
String viewName = mv.getViewName();

MyView view = viewResolver(viewName);

이 부분에서 controller 변수에 new MemberFormControllerV3()의 

인스턴스 주소값이 저장되고, 해당 객체의 process메서드가 호출이 됩니다. 여기서 process의 파라미터 타입(?)을 Map으로 해준 이유가 있을까요? save에서 map을사용하는거 말고는 다른 곳에서 사용되지 않는 것 같거든요 ...

그리고 저는 이렇게 생각하고 있습니다.

paramMap이 인증토큰(?)과 같은 역할을 해서, name, age가 담긴 Map을 process에 넘겼을 때, FormController의 객체의 contorller에도, SaveVontroller에도,모두 name, age 같은 값이 넘어갈텐데, 어떻게 구분을 하지..? 하는 의문이 남아있습니다.

조금 유추해본다면..controller에 따른 process구현 객체가 다르지만.. 인터페이스 처음에 정의할 때 Map으로 했기 때문에 어쩔 수 없이(?) 낭비하고 있다..정도로요..ㅠㅠ

마지막으로, view.render(mv.getModel())을 풀어서 본다면,

controller.process(paramMap)을 리턴받은 new Myview("new-form");
값이 mv에 저장이 되는데, mv.getMode()을 했을 때 paramMap이 어떻게 view에 렌더링(전달(?)) 되나요..?

 추가 질문)

ModelView process(Map<String, String> paramMap) 

여기서 paramMap에 들어가는 값은 Map의 주소값인가요?

예를들어 save(Member member)라는 메서드가 있다면,

이 파라미터에는 어느 Member의 객체 주소가 들어가듯 Map도 같은건지, 아니면 key, value로 각각 매칭(?) 돼서 들어가는건지 잘 모르겠습니다 ㅠㅠ 구글링 키워드의 한계에 부딪혀서 추가질문 드립니다 .. !

항상 꼼꼼하고 빠른 답변 감사합니다 !

인스턴스 주소값이 저장되고, 해당 객체의 process메서드가 호출이 됩니다. 여기서 process의 파라미터 타입(?)을 Map으로 해준 이유가 있을까요? save에서 map을사용하는거 말고는 다른 곳에서 사용되지 않는 것 같거든요 ...

=>  ControllverV3를 보시면 아시겠지만 MemberSave, MemberList, MemberForm 클래스가 구현하여 process() 하나로 처리하도록 설계가 되어 있어서 그렇습니다. 말씀하신대로 save에서만 사용중입니다.

public interface ControllerV3 {

ModelView process(Map<String, String> paramMap);
}

 

그리고 저는 이렇게 생각하고 있습니다.

 

paramMap이 인증토큰(?)과 같은 역할을 해서, name, age가 담긴 Map을 process에 넘겼을 때, FormController의 객체의 contorller에도, SaveVontroller에도,모두 name, age 같은 값이 넘어갈텐데, 어떻게 구분을 하지..? 하는 의문이 남아있습니다.

=>

구분을 할 필요가 없는게 save할 때 paramMap에서 값을 가져오고 repository에 저장합니다.

public class MemberSaveControllerV3 implements ControllerV3 {

private MemberRepository memberRepository = MemberRepository.getInstance();

@Override
public ModelView process(Map<String, String> paramMap) {
String username = paramMap.get("username");
int age = Integer.parseInt(paramMap.get("age"));

Member member = new Member(username, age);
memberRepository.save(member);

ModelView mv = new ModelView("save-result");
mv.getModel().put("member", member);
return mv;
}
}

form에서는 화면을 반환합니다.

public class MemberFormControllerV3 implements ControllerV3 {

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

List에서는 repository에서 값을 가져와서 모델에 담는과정이 진행됩니다.

public class MemberListControllerV3 implements ControllerV3 {

private final MemberRepository memberRepository = MemberRepository.getInstance();

@Override
public ModelView process(Map<String, String> paramMap) {
List<Member> members = memberRepository.findAll();
ModelView mv = new ModelView("members");
mv.getModel().put("members", members);

return mv;
}
}

마지막으로, view.render(mv.getModel())을 풀어서 본다면,

controller.process(paramMap)을 리턴받은 new Myview("new-form");

값이 mv에 저장이 되는데,

=> 이 코드를 말씀하시는거 같고

public class MemberFormControllerV3 implements ControllerV3 {

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

mv.getMode()을 했을 때 paramMap이 어떻게 view에 렌더링(전달(?)) 되나요..?

=> 이 부분은 무슨 말씀을 하시는건지 잘 모르겠습니다. 좀 더 자세히 설명 해주세요.

아래 코드를 얘기하시는건가요?

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

 

 추가 질문)

ModelView process(Map<String, String> paramMap) 

여기서 paramMap에 들어가는 값은 Map의 주소값인가요?

=>

네 맞습니다.

 

위에서 제가 답변하지 못한 내용을 풀어서 자세히 코드로 설명해주세요.

0

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

 

아래와 같이 어떤 값이 들어가는지 확인하기 위해 로거를 추가하였습니다.

로거에 출력되는 내용을 보아도 이해가 안가면 어떤 부분이 이해가 안가는지 알려주세요.

(하나도 이해가 안됐다, 어떤것은 이해가 됐다 이런식으로 알려주시면 설명드리겠습니다.)

paramMap만 설명드리면, paramName이란 이름으로 request.getParameter(paramName)의 값을 저장합니다.

어떤 값들이 포함되는지는 밑에 나와있습니다.

private Map<String, String> createParamMap(HttpServletRequest request) {
Map<String, String> paramMap = new HashMap<>();

request.getParameterNames().asIterator()
.forEachRemaining(paramName -> {
paramMap.put(paramName, request.getParameter(paramName));
log.info("paramName = {}, request.getParameter(paramName) = {}", paramName, request.getParameter(paramName));
}); // 출력을 위한 로거
return paramMap;
}

 

출력 결과

감사합니다. 

request에서 인자로 넘긴paramName으로 값을 가져오는데 그럼 request는 무엇일까에 대해 고민해보시면 될 것 같네요

australialove19님의 프로필 이미지
australialove19

작성한 질문수

질문하기