Model
은 스프링 프레임워크에서 컨트롤러에서 뷰로 데이터를 전달하는 데 사용되는 인터페이스입니다. Model
을 이용하여 컨트롤러에서 뷰로 데이터를 전달할 수 있습니다. Model
인터페이스는 모델 데이터를 저장하고 뷰로 전달하는데 필요한 메서드를 정의하고 있습니다.
보통 스프링 MVC에서 컨트롤러 메서드는 뷰의 이름을 반환하고, 이 뷰에 전달할 데이터를 Model
객체에 추가합니다. 이러한 데이터는 뷰 템플릿에서 동적으로 사용될 수 있습니다.
Model
은 스프링 MVC에서 컨트롤러에서 뷰로 데이터를 전달하기 위한 인터페이스로, 다음과 같은 특징이 있습니다:
데이터 전달을 위한 메서드 제공: Model
인터페이스는 데이터를 저장하고 뷰로 전달하기 위한 메서드를 제공합니다. 주요 메서드로는 addAttribute
가 있습니다. 이 메서드를 사용하여 모델에 속성을 추가하고, 해당 속성은 뷰에서 사용할 수 있습니다.
model.addAttribute("key", "value");
뷰와 컨트롤러 간 데이터 전달: Model
을 사용하면 컨트롤러에서 뷰로 데이터를 전달할 수 있습니다. 이를 통해 동적인 웹 페이지를 생성하거나, 클라이언트에게 데이터를 제공할 수 있습니다.
Model 인터페이스의 구현체: 스프링은 Model
인터페이스를 구현한 여러 클래스를 제공합니다. 대표적인 클래스로는 BindingAwareModelMap
이나 ExtendedModelMap
이 있습니다. 보통 개발자가 직접 이러한 클래스를 생성하지 않고, 메서드 파라미터로 Model
을 선언하면 스프링이 적절한 구현체를 제공합니다.
스프링의 모델 애트리뷰트: Model
을 사용하여 추가한 데이터는 스프링이 자동으로 뷰에 전달합니다. 뷰에서는 이 데이터를 활용하여 동적으로 페이지를 렌더링할 수 있습니다. 일반적으로 이러한 데이터를 모델 애트리뷰트(Model Attribute)라고 합니다.
<!-- Thymeleaf 예제 -->
<h1 th:text="${key}"></h1>
ModelAndView: ModelAndView
는 Model
과 뷰의 이름을 함께 다루는 클래스입니다. Model
을 사용하여 데이터를 전달하고, View
의 이름을 설정하여 뷰를 지정할 수 있습니다.
@GetMapping("/example")
public ModelAndView example() {
ModelAndView modelAndView = new ModelAndView("exampleView");
modelAndView.addObject("key", "value");
return modelAndView;
}
이러한 특징들을 통해 Model
은 스프링 MVC에서 컨트롤러와 뷰 간에 데이터를 효과적으로 전달할 수 있도록 도와주는 중요한 역할을 합니다.
간단한 예제를 통해 설명하겠습니다. 다음은 Model
을 사용하는 스프링 부트 컨트롤러의 예제입니다:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyController {
@GetMapping("/greet")
public String greet(Model model) {
// 모델에 데이터 추가
model.addAttribute("greeting", "Hello, Spring MVC!");
// 뷰의 이름 반환
return "greetView";
}
}
위의 예제에서 /greet
경로로 요청이 들어오면, greet
메서드가 실행되고 모델에 "greeting"
이라는 속성이 추가됩니다.
이후에는 뷰 템플릿에서 해당 데이터를 사용할 수 있습니다.
뷰 템플릿에서는 Thymeleaf, JSP, Freemarker 등을 사용하여 모델에 추가된 데이터를 동적으로 표시할 수 있습니다.
예를 들어 Thymeleaf를 사용하는 경우:
<html xmlns:th="http://www.thymeleaf.org">
<body>
<h1 th:text="${greeting}"></h1>
</body>
</html>
이렇게 하면 뷰에서 모델에 추가된 "greeting"
속성의 값이 동적으로 표시됩니다.
스프링 부트에서 ModelMap
은 데이터를 뷰로 전달하기 위한 모델 객체 중 하나입니다. 컨트롤러에서 데이터를 뷰로 전달하는 데 사용됩니다. ModelMap
은 Model
인터페이스를 구현한 구현체로, 모델 객체에 데이터를 추가하고 뷰로 전달하는 데 사용됩니다.
컨트롤러 메서드에서 ModelMap
을 파라미터로 받아서 사용하면, 해당 메서드는 뷰에 전달할 데이터를 ModelMap
에 추가할 수 있습니다. 그리고 이 데이터는 뷰에서 사용할 수 있게 됩니다.
Map 인터페이스 구현: ModelMap
은 Java의 Map
인터페이스를 구현합니다. 이는 키-값 쌍을 저장하고 관리하는 데 유용하며, 컨트롤러에서 뷰로 전달할 데이터를 담는 데 사용됩니다.
Model 인터페이스 상속: ModelMap
은 Model
인터페이스를 구현하고 있습니다. 따라서 Model
인터페이스의 메서드들을 활용하여 데이터를 추가하고 관리할 수 있습니다.
컨트롤러 메서드의 파라미터로 자동 주입: 스프링 MVC에서는 컨트롤러의 메서드에서 ModelMap
을 직접 생성할 필요가 없습니다.
대신, 메서드의 파라미터로 ModelMap
을 선언하면 스프링이 자동으로 인스턴스를 생성하여 전달합니다.
@Controller
public class MyController {
@GetMapping("/example")
public String example(ModelMap model) {
// ModelMap을 통해 데이터 추가
model.addAttribute("key", "value");
// 뷰의 이름 반환
return "exampleView";
}
}
데이터 추가 및 조회: addAttribute
메서드를 사용하여 ModelMap
에 데이터를 추가할 수 있습니다. 추가한 데이터는 뷰에서 동적으로 사용될 수 있습니다. 또한, getAttribute
메서드를 통해 저장된 데이터를 조회할 수 있습니다.
// 데이터 추가
model.addAttribute("name", "John");
// 데이터 조회
String name = (String) model.getAttribute("name");
데이터 유지: ModelMap
에 추가된 데이터는 HTTP 요청의 라이프사이클 동안 유지됩니다. 즉, 한 번의 요청에서 컨트롤러에서 뷰로 전달한 데이터는 해당 요청이 처리되는 동안 유지되며, 이후에는 사라집니다.
자동으로 뷰로 전달: 컨트롤러 메서드에서 반환하는 문자열은 뷰의 이름을 나타냅니다. ModelMap
에 추가된 데이터는 자동으로 해당 뷰로 전달되어 뷰에서 사용할 수 있게 됩니다.
@GetMapping("/example")
public String example(ModelMap model) {
model.addAttribute("key", "value");
return "exampleView";
}
위의 예제에서 "key"라는 데이터는 "exampleView"
라는 뷰로 전달됩니다.
ModelMap
은 컨트롤러와 뷰 간에 데이터를 효과적으로 전달하는 데 사용되며, 스프링 MVC에서 자주 활용되는 모델 객체 중 하나입니다.
예를 들어, 다음은 간단한 스프링 부트 컨트롤러 메서드의 예제입니다:
컨트롤러 클래스 작성:
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyController {
@GetMapping("/hello")
public String hello(ModelMap model) {
// ModelMap에 데이터 추가
model.addAttribute("message", "Hello, Thymeleaf!");
// 뷰의 이름 반환 (Thymeleaf 템플릿의 이름)
return "helloView";
}
}
위의 예제에서 /hello
경로로 요청이 들어오면, hello
메서드가 실행되고 ModelMap
에 "message"라는 속성이 추가됩니다.
Thymeleaf 템플릿 작성 (src/main/resources/templates/helloView.html
):
htmlCopy code<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello Page</title>
</head>
<body>
<h1 th:text="${message}"></h1>
</body>
</html>
이렇게 하면 뷰에서 모델에 추가된 "message"
속성의 값이 동적으로 표시됩니다.
ModelMap
과 Model
은 스프링에서 모델 데이터를 관리하고 뷰로 전달하기 위한 두 가지 다른 인터페이스 또는 클래스입니다.
주요 차이점은 다음과 같습니다:
인터페이스 vs 클래스:
Model
: 인터페이스ModelMap
: Model
인터페이스를 구현한 구현체(클래스)로, Model
의 확장된 형태기능적 차이:
Model
: 주로 모델 데이터를 추가하고 조회하는 간단한 메서드를 제공ModelMap
: Model
을 확장한 클래스로, Model
의 메서드를 포함하면서 더 많은 메서드를 제공사용법의 차이:
Model
: 주로 컨트롤러 메서드의 파라미터로 선언하여 사용합니다. 메서드에서 데이터를 추가하고, 스프링이 자동으로 뷰로 전달합니다.
@GetMapping("/example")
public String example(Model model) {
model.addAttribute("key", "value");
return "exampleView";
}
ModelMap
: Model
과 마찬가지로 주로 컨트롤러 메서드의 파라미터로 선언하여 사용하며, Model
과 동일한 방식으로 데이터를 추가하고 사용할 수 있습니다.
@GetMapping("/example")
public String example(ModelMap model) {
model.addAttribute("key", "value");
return "exampleView";
}
유연성:
Model
: 간단하고 가볍게 사용할 수 있어서 컨트롤러와 뷰 간에 간단한 데이터 전달이 필요한 경우에 유용합니다.ModelMap
: Model
의 모든 기능을 포함하면서 더 많은 유연성을 제공합니다. 좀 더 복잡한 데이터 관리나 다양한 메서드 활용이 필요한 경우에 유용합니다.일반적으로 간단한 경우에는 Model
을 사용하여 간결하게 데이터를 전달할 수 있습니다. 그러나 더 복잡한 데이터 관리나 다양한 기능을 사용해야 할 때는 ModelMap
을 선택할 수 있습니다. 이 둘은 서로 호환되기 때문에 선택은 프로젝트의 요구 사항과 개발자의 선호도에 따라 다를 수 있습니다.