삶 가운데 남긴 기록 AACII.TISTORY.COM
Spring MVC에서 Model과 ModelAndView 본문
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은 다음 세 가지 작업을 수행합니다.
- 객체 생성: 파라미터 타입에 해당하는 객체(DTO 또는 VO)를 자동으로 생성합니다.
- 데이터 바인딩 (Data Binding): HTTP 요청(예: 폼 데이터, 쿼리 파라미터)에서 넘어온 값들을 자동으로 새로 생성된 객체의 필드에 바인딩(매핑)합니다. 이 과정을 통해 개발자가 일일이 request.getParameter()를 호출할 필요가 없습니다.
- 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
'DEV&OPS > Java' 카테고리의 다른 글
| JWT 인증 (0) | 2026.07.16 |
|---|---|
| 스프링 부트 웹 애플리케이션에서 카카오 로그인 처리 (0) | 2026.07.16 |
| JPA 연관 관계 (0) | 2026.07.11 |
| 인텔리제이 주석 템플릿 설정 (0) | 2026.07.06 |
| FreeMarker 설정과 기본 사용법 (0) | 2026.07.06 |
