inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Model 추가 - v3

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

629

australialove19

작성한 질문수 53

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를 대체한 것 맞죠..?

spring MVC

답변 3

0

australialove19

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

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

추가적으로

new ModelView("new-form");

이 부분은 

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

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

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

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

0

OMG

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

australialove19

모든 파라미터라는 말이 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로 각각 매칭(?) 돼서 들어가는건지 잘 모르겠습니다 ㅠㅠ 구글링 키워드의 한계에 부딪혀서 추가질문 드립니다 .. !

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

0

OMG

인스턴스 주소값이 저장되고, 해당 객체의 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

OMG

안녕하세요. 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;
}

 

출력 결과

감사합니다. 

0

OMG

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

servlet과 container에 대한 질문입니다

0

25

1

api를 어느 컨트롤러에 작성해야하는지는 어떤 기준으로 해야하나요?

0

64

1

jsp 의존성 수정 요청

0

80

2

요즘 웹 서버가 주로 사용되는 이유는 SPA 구조 때문일까요 ?

0

143

1

save() 메서드 문의

0

67

1

절대 경로로 templates/basic 하위 파일 열면 css 적용 안되는 현상

0

101

1

request-body-json

0

83

2

MVC 패턴의 적용 단위

0

97

1

RequestMapping을 이용한 핸들러, 어댑터

0

119

2

save 후 결과화면

0

89

2

jsp를 이용한 view

0

97

1

application.properties에 debug 추가해도 결과가 똑같습니다.

0

178

1

수업 코드 제공 관련 문의

0

97

2

RequestMappingHandlerAdapter의 Controller 호출 과정

0

100

3

파일 오픈 시

0

70

1

스프링 배치 관련

0

78

1

@RequestParam의 defaultValue가 blank 값도 처리하는 지 여부

0

112

1

postman으로 /request-body-json-v1 호출시 500 error

0

96

1

프론트엔드와 백엔드의 mvc, rest api에 대한 질문

0

79

1

모델의 역할과 계층 분리에 대한 이해 차이 + 추가질문

0

111

1

console log 출력 관련 질문입니다.

0

75

1

애플리케이션이 실행 되지 않습니다 ㅠㅠㅠ

0

139

1

html 변경하는 부분 적용 문제

0

103

1

한글 깨짐

0

77

2