DEV&OPS/Java

Spring MVC에서 Model과 ModelAndView

ALEPH.GEM 2026. 7. 16. 19:08
728x90

 

Model과 ModelAndView의 차이점

특징 Model ModelAndView
역할 뷰에 전달할 데이터(속성)만 담는 역할 (인터페이스) 데이터(Model)와 뷰 이름(View)을 모두 담는 컨테이너 (클래스)
뷰 지정 컨트롤러 메서드의 반환 값(String)으로 뷰 이름을 지정 객체 내부의 setViewName() 메서드로 뷰 이름을 지정
주요 사용처 최근 Spring 개발 트렌드에서 주로 사용
(String 리턴 타입과 함께)
Spring 초기에 자주 사용되었으나, 최근에는 사용 빈도가 감소
반환 타입 컨트롤러 메서드의 파라미터로 받으며, 메서드는 보통 뷰 이름(String)을 반환 컨트롤러 메서드의 반환 타입이 됨

 

 

Model

Model 객체는 컨트롤러 메서드의 파라미터로 주입받아 사용하며, 데이터를 추가합니다. 메서드는 뷰의 논리적 이름(String)을 반환합니다.

컨트롤러 예시:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {

    @GetMapping("/model-example")
    public String useModel(Model model) {
        // Model에 'message'라는 이름으로 데이터 추가
        model.addAttribute("message", "Model 객체를 사용한 데이터입니다.");
        
        // 뷰의 논리적 이름 반환 (ViewResolver가 'modelView.jsp' 또는 'modelView.html' 등을 찾음)
        return "modelView"; 
    }
}

 

뷰(modelView.jsp) 예시:

<body>
    <h1>Model 예제</h1>
    <p>받은 메시지: ${message}</p>
</body>

 

 

ModelAndView

ModelAndView 객체를 생성하여 데이터를 추가하고 뷰 이름까지 설정한 후, 객체 자체를 반환합니다.

컨트롤러 예시:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MyController {

    @GetMapping("/mav-example")
    public ModelAndView useModelAndView() {
        // ModelAndView 객체 생성 및 뷰 이름 설정
        ModelAndView mav = new ModelAndView("mavView"); 
        
        // addObject()를 사용하여 데이터 추가
        mav.addObject("greeting", "ModelAndView를 사용한 환영 메시지입니다.");
        
        // ModelAndView 객체 자체를 반환
        return mav;
    }
}

 

뷰(mavView.jsp) 예시:

<body>
    <h1>ModelAndView 예제</h1>
    <p>받은 인사: ${greeting}</p>
</body>

 

 

@ModelAttribute

@ModelAttribute 어노테이션은 Spring MVC에서 HTTP 요청 파라미터와 Model 객체를 처리하는데 사용됩니다.

1. 컨트롤러 메서드의 파라미터에서 사용될 때 (데이터 바인딩 및 Model에 추가)

요청 데이터를 객체에 자동으로 매핑하고 이 객체를 뷰에 전달 합니다.

@ModelAttribute가 컨트롤러 메서드의 파라미터에 사용될 때, Spring은 다음 세 가지 작업을 수행합니다.

  1. 객체 생성: 파라미터 타입에 해당하는 객체(DTO 또는 VO)를 자동으로 생성합니다.
  2. 데이터 바인딩 (Data Binding): HTTP 요청(예: 폼 데이터, 쿼리 파라미터)에서 넘어온 값들을 자동으로 새로 생성된 객체의 필드에 바인딩(매핑)합니다. 이 과정을 통해 개발자가 일일이 request.getParameter()를 호출할 필요가 없습니다.
  3. Model에 추가: 바인딩이 완료된 객체를 자동으로 Model 객체에 추가하여 뷰(View)에서 사용할 수 있도록 합니다. 이때 Model 속성의 이름은 기본적으로 해당 클래스의 이름(소문자로 시작)을 따릅니다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;

// Student DTO/VO 클래스가 있다고 가정
public class Student {
    private String name;
    private int age;
    // getter, setter 생략
}

@Controller
public class FormController {
    
    // HTTP 요청 파라미터 (예: name=John&age=20)가 Student 객체에 자동 바인딩됨
    @PostMapping("/register")
    // @ModelAttribute("studentInfo") Student student
    //  -> student라는 객체를 Model에 "studentInfo"라는 이름으로 추가 
    public String register(@ModelAttribute("studentInfo") Student student) {
        // student 객체에는 이미 요청 파라미터로 넘어온 name과 age 값이 설정되어 있음
        System.out.println("등록된 학생 이름: " + student.getName()); 
        
        // Model에도 "studentInfo"라는 이름으로 student 객체가 추가되어 뷰로 전달됨
        return "registrationResult"; 
    }
}

 

2. 컨트롤러 메서드의 반환 값 (공통 참조 데이터 추가)

해당 컨트롤러의 모든 요청 처리 전에 실행되어, 공통 데이터를 Model에 미리 설정합니다.

@ModelAttribute가 컨트롤러 클래스 내의 특정 메서드에 사용될 때, 이 메서드가 반환하는 객체를 @RequestMapping 등으로 매핑된 요청 핸들러 메서드가 사용하기 전에 Model에 자동으로 추가하도록 지정합니다.

이는 해당 컨트롤러 내의 여러 뷰에서 공통적으로 필요한 드롭다운 목록이나 사이트 메뉴 등을 Model에 미리 담아두는 데 유용합니다.

@Controller
public class CommonController {

    // 이 컨트롤러의 어떤 @RequestMapping 메서드가 호출되든,
    // 이 메서드가 먼저 실행되고 반환 값이 Model에 "commonData"라는 이름으로 추가됨
    @ModelAttribute("commonData")
    public List<String> getCommonData() {
        return Arrays.asList("메뉴1", "메뉴2", "메뉴3");
    }

    @GetMapping("/home")
    public String home() {
        // home.jsp에서 ${commonData}를 사용할 수 있음
        return "home";
    }

    @GetMapping("/about")
    public String about() {
        // about.jsp에서도 ${commonData}를 사용할 수 있음
        return "about";
    }
}

 

 

 

 

 

 

 

728x90