[첫번째 프로젝트] 8. Model, Modelmap 차이점

DAEILLIM·2024년 1월 22일
0

첫번째 프로젝트

목록 보기
8/17
post-thumbnail

1. Model

Model은 스프링 프레임워크에서 컨트롤러에서 뷰로 데이터를 전달하는 데 사용되는 인터페이스입니다. Model을 이용하여 컨트롤러에서 뷰로 데이터를 전달할 수 있습니다. Model 인터페이스는 모델 데이터를 저장하고 뷰로 전달하는데 필요한 메서드를 정의하고 있습니다.

보통 스프링 MVC에서 컨트롤러 메서드는 뷰의 이름을 반환하고, 이 뷰에 전달할 데이터를 Model 객체에 추가합니다. 이러한 데이터는 뷰 템플릿에서 동적으로 사용될 수 있습니다.

1.1 Model 특징

Model은 스프링 MVC에서 컨트롤러에서 뷰로 데이터를 전달하기 위한 인터페이스로, 다음과 같은 특징이 있습니다:

  1. 데이터 전달을 위한 메서드 제공: Model 인터페이스는 데이터를 저장하고 뷰로 전달하기 위한 메서드를 제공합니다. 주요 메서드로는 addAttribute가 있습니다. 이 메서드를 사용하여 모델에 속성을 추가하고, 해당 속성은 뷰에서 사용할 수 있습니다.

    model.addAttribute("key", "value");
  2. 뷰와 컨트롤러 간 데이터 전달: Model을 사용하면 컨트롤러에서 뷰로 데이터를 전달할 수 있습니다. 이를 통해 동적인 웹 페이지를 생성하거나, 클라이언트에게 데이터를 제공할 수 있습니다.

  3. Model 인터페이스의 구현체: 스프링은 Model 인터페이스를 구현한 여러 클래스를 제공합니다. 대표적인 클래스로는 BindingAwareModelMap이나 ExtendedModelMap이 있습니다. 보통 개발자가 직접 이러한 클래스를 생성하지 않고, 메서드 파라미터로 Model을 선언하면 스프링이 적절한 구현체를 제공합니다.

  4. 스프링의 모델 애트리뷰트: Model을 사용하여 추가한 데이터는 스프링이 자동으로 뷰에 전달합니다. 뷰에서는 이 데이터를 활용하여 동적으로 페이지를 렌더링할 수 있습니다. 일반적으로 이러한 데이터를 모델 애트리뷰트(Model Attribute)라고 합니다.

    <!-- Thymeleaf 예제 -->
    <h1 th:text="${key}"></h1>
  5. ModelAndView: ModelAndViewModel과 뷰의 이름을 함께 다루는 클래스입니다. Model을 사용하여 데이터를 전달하고, View의 이름을 설정하여 뷰를 지정할 수 있습니다.

    @GetMapping("/example")
    public ModelAndView example() {
        ModelAndView modelAndView = new ModelAndView("exampleView");
        modelAndView.addObject("key", "value");
        return modelAndView;
    }

이러한 특징들을 통해 Model은 스프링 MVC에서 컨트롤러와 뷰 간에 데이터를 효과적으로 전달할 수 있도록 도와주는 중요한 역할을 합니다.

1.2 Model 예제1

간단한 예제를 통해 설명하겠습니다. 다음은 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" 속성의 값이 동적으로 표시됩니다.

2. ModelMap

스프링 부트에서 ModelMap은 데이터를 뷰로 전달하기 위한 모델 객체 중 하나입니다. 컨트롤러에서 데이터를 뷰로 전달하는 데 사용됩니다. ModelMapModel 인터페이스를 구현한 구현체로, 모델 객체에 데이터를 추가하고 뷰로 전달하는 데 사용됩니다.

컨트롤러 메서드에서 ModelMap을 파라미터로 받아서 사용하면, 해당 메서드는 뷰에 전달할 데이터를 ModelMap에 추가할 수 있습니다. 그리고 이 데이터는 뷰에서 사용할 수 있게 됩니다.

2.1 ModelMap 특징

  1. Map 인터페이스 구현: ModelMap은 Java의 Map 인터페이스를 구현합니다. 이는 키-값 쌍을 저장하고 관리하는 데 유용하며, 컨트롤러에서 뷰로 전달할 데이터를 담는 데 사용됩니다.

  2. Model 인터페이스 상속: ModelMapModel 인터페이스를 구현하고 있습니다. 따라서 Model 인터페이스의 메서드들을 활용하여 데이터를 추가하고 관리할 수 있습니다.

  3. 컨트롤러 메서드의 파라미터로 자동 주입: 스프링 MVC에서는 컨트롤러의 메서드에서 ModelMap을 직접 생성할 필요가 없습니다.
    대신, 메서드의 파라미터로 ModelMap을 선언하면 스프링이 자동으로 인스턴스를 생성하여 전달합니다.

    @Controller
    public class MyController {
    
        @GetMapping("/example")
        public String example(ModelMap model) {
            // ModelMap을 통해 데이터 추가
            model.addAttribute("key", "value");
    
            // 뷰의 이름 반환
            return "exampleView";
        }
    }
  4. 데이터 추가 및 조회: addAttribute 메서드를 사용하여 ModelMap에 데이터를 추가할 수 있습니다. 추가한 데이터는 뷰에서 동적으로 사용될 수 있습니다. 또한, getAttribute 메서드를 통해 저장된 데이터를 조회할 수 있습니다.

    // 데이터 추가
    model.addAttribute("name", "John");
    
    // 데이터 조회
    String name = (String) model.getAttribute("name");
  5. 데이터 유지: ModelMap에 추가된 데이터는 HTTP 요청의 라이프사이클 동안 유지됩니다. 즉, 한 번의 요청에서 컨트롤러에서 뷰로 전달한 데이터는 해당 요청이 처리되는 동안 유지되며, 이후에는 사라집니다.

  6. 자동으로 뷰로 전달: 컨트롤러 메서드에서 반환하는 문자열은 뷰의 이름을 나타냅니다. ModelMap에 추가된 데이터는 자동으로 해당 뷰로 전달되어 뷰에서 사용할 수 있게 됩니다.

    @GetMapping("/example")
    public String example(ModelMap model) {
        model.addAttribute("key", "value");
        return "exampleView";
    }

    위의 예제에서 "key"라는 데이터는 "exampleView"라는 뷰로 전달됩니다.

ModelMap은 컨트롤러와 뷰 간에 데이터를 효과적으로 전달하는 데 사용되며, 스프링 MVC에서 자주 활용되는 모델 객체 중 하나입니다.

2.2 ModelMap 예제1

예를 들어, 다음은 간단한 스프링 부트 컨트롤러 메서드의 예제입니다:

  1. 컨트롤러 클래스 작성:

    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"라는 속성이 추가됩니다.

  2. 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" 속성의 값이 동적으로 표시됩니다.

3. Model, ModelMap 차이점

ModelMapModel은 스프링에서 모델 데이터를 관리하고 뷰로 전달하기 위한 두 가지 다른 인터페이스 또는 클래스입니다.
주요 차이점은 다음과 같습니다:

  1. 인터페이스 vs 클래스:

    • Model: 인터페이스
    • ModelMap: Model 인터페이스를 구현한 구현체(클래스)로, Model의 확장된 형태
  2. 기능적 차이:

    • Model: 주로 모델 데이터를 추가하고 조회하는 간단한 메서드를 제공
    • ModelMap: Model을 확장한 클래스로, Model의 메서드를 포함하면서 더 많은 메서드를 제공
      여러 메서드를 통해 데이터를 추가, 제거, 검색하는 등의 다양한 기능을 수행이 가능
  3. 사용법의 차이:

    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";
    }
  4. 유연성:

    • Model: 간단하고 가볍게 사용할 수 있어서 컨트롤러와 뷰 간에 간단한 데이터 전달이 필요한 경우에 유용합니다.
    • ModelMap: Model의 모든 기능을 포함하면서 더 많은 유연성을 제공합니다. 좀 더 복잡한 데이터 관리나 다양한 메서드 활용이 필요한 경우에 유용합니다.

일반적으로 간단한 경우에는 Model을 사용하여 간결하게 데이터를 전달할 수 있습니다. 그러나 더 복잡한 데이터 관리나 다양한 기능을 사용해야 할 때는 ModelMap을 선택할 수 있습니다. 이 둘은 서로 호환되기 때문에 선택은 프로젝트의 요구 사항과 개발자의 선호도에 따라 다를 수 있습니다.

profile
필기하고, 타이핑하고, 말하면서 읽고, 코딩하고, 눈으로 읽고 오감으로 공부하기

0개의 댓글