관심쟁이 영호

[Spring Boot] Model 과 ModelAndView 차이. 본문

Bank-End/Spring Boot

[Spring Boot] Model 과 ModelAndView 차이.

관심쟁이 영호 2021. 8. 4. 20:31
반응형

인터셉터에서 세션 처리를 하는 도중에 문제가 생겼다.

 

지금까지 Controller에서 Model을 이용하여 view에 넣어주었는데,

HandlerInterceptor의 postHandle에는 ModelAndView를 이용하는 것이다..(확장하면 되지만 있는 그대로를 이용하자!!)

똑같겠지 생각하며 addAttribute를 찾아보았지만 없다....(세션에 있는 User 정보를 넣고 싶다고!!)

 

그럼 ModelAndView로 Model에 데이터를 넣는 방법을 찾아보면서 Model과 ModelAndView를 확실히 다루어 볼 예정이다!

 


가장 먼저 알아둬야 할 것이 있다.

 

Model, ModelAndView에서

Model이란 무엇인가?

 

다음 그림을 보자! (발로 그린 그림이다..)

 

 

그림을 보면

  1. Controller에서의 데이터를 Model에 담는다.
  2. View는 Model에 담겨있는 데이터만 쏙쏙 골라서 화면에 바인딩해준다!

 

더보기

왜 저렇게 나누어서 할까?

이유는 간단하다. 수많은 개발자들이 서로 일을 편하게 하기 위해서 저렇게 한다.

 

그 외 다루어야 할 점이 있지만, 여기까지만 알아두고

바로 차이점에 대해서 알아보자!

 


 

실제 Model 사용 예시

 

한 줄 요약 : ModelAndView는 Model에서 기능을 추가한 것이다.

 

Model (Controller -> Model)

아래 코드를 보자.

@GetMapping("/apple")
public String test(@ModelAttribute Member member,HttpServletRequest request, Model model){
        
    model.addAttribute("Member", member);
        
    return "home";
}

코드 설명:

  • @ModelAttribute를 통해서 사용자가 입력한 내용을 Member객체에 파싱 하여 member를 받는다.
  • "home"에서 "member"가 가지고 있는 요소를 이용하기 위해, member를 model에 담아준다.

※ 사실 @ModelAttribute를 이용하면 자동으로 해당 member를 model에 담아준다.. ㅋㅋ

 

그럼 View -> Model

<!DOCTYPE html>
<html th:replace="~{layouts/base :: layout(~{::title},~{::section})}"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <title>홈 입니다.</title>
</head>
<body>

<section th:object="${member}">

    <button type="button" onclick="location.href='/modify'" th:if="${member.memberId != null}">회원수정</button>

    </section>
</section>
</body>
</html>

Thymeleaf 템플릿 엔진을 통해서 member를 조회하는 모습이다.

여기서 ${member}가 가능한 이유는 해당 html을 호출한 Controller에서 model에 "member"를 담아주었기 때문이다.

 

 


Model vs ModelAndView

 

Model

Model 객체는 별로 기능이 없다.

 

Method 설명
addAttribute Model에 속성추가
getAttribute Model에 있는 속성을 조회
addAttributes Model에 속성을 여러개 추가
getAttributes Model에 속성을 여러개 조회
containsAttributes Model에 특정한 속성이 있는지 확인
mergeAttributes Model 두개를 합침

이 정도 기능이 끝..

 


ModelAndView

Model에 비해서 더욱 확장성 있는 것이다.

(내부적으로 확인해보니까 ModelMap이 들어있다. ModelMap은 Model보다 크고 ModelAndView보다 작다.)

 

setViewName view 이름을 설정
getViewName view 이름을 조회
setView view 설정
getView view 조회
hasView 설정되어있는 view가 있는지 확인
getModelMap 내부의 모델 Map 조회
getModel 내부 모델 조회
getStatus 상태 설정

 

이것 이외에도 더 많다!

Model은 속성을 추가 삭제만 할 수 있는 기능이지만,

ModelAndView는 view설정, model설정, 상태 설정, 기타 기능까지 많다!!

 

복잡할수록 ModelAndView를 사용하겠지!

 

 

 

 

300x250
Comments