본문 바로가기
Back End/Spring

[Spring] Spring MVC의 @ModelAttribute 어노테이션

by SolaKim 2023. 7. 31.

@ModelAttribute는 스프링 프레임워크에서 사용되는 어노테이션(Annotation) 중 하나이다.

스프링은 MVC(Model-View-Controller) 아키텍처를 기반으로 하는 웹 애플리케이션을 개발할 때 자주 사용된다.

@ModelAttribute 어노테이션은 주로 컨트롤러 클래스의 메서드에서 파라미터와 모델 속성을 바인딩할 때 사용된다.

이 어노테이션을 사용하면 해당 메서드가 호출될 때 모델에 데이터를 바인딩하여 뷰로 전달할 수 있다.

 

 

@ModelAttribute가 @GetMapping함수에 파라미터로 들어갈때

여기서 @ModelAttribute는 해당 파라미터와 모델 속성을 바인딩하는 역할을 수행한다. 이는 주로 웹 요청의 데이터를 컨트롤러로 전달하거나, 컨트롤러에서 뷰로 데이터를 전달하는데 사용된다.

일반적으로 '@GetMapping'은 HTTP GET 메서드로 들어오는 요청을 처리하는데 사용되는 어노테이션이다. 이때, 요청 URL에 쿼리 파라미터가 포함 되어 있을 수 잇다. 이 쿼리 파라미터들을 컨트롤러의 메서드 파라미터와 연결하여 데이터를 추출하고자 할때 '@ModelAttribute'를 사용한다.

예를 들어보자!!!

@Controller
public class MyController {

    @GetMapping("/showMessage")
    public String showMessage(@ModelAttribute("name") String name) {
        // name 파라미터를 사용하여 로직 처리
        // ...
        return "showMessage"; // showMessage.jsp와 같은 뷰 페이지를 반환합니다.
    }
}

위의 코드에서 @GetMapping 어노테이션을 사용하여 /showMessage 경로로 들어오는 GET 요청을 처리하는 메서드를 정의한다.

이 메서드는 @ModelAttribute("name") String name을 파라미터로 받고 있다.

이렇게 정의된 name 파라미터는 요청 URL의 쿼리 파라미터 중에 "name"이라는 이름의 값과 바인딩됩니다.

예를 들면 /showMessage?name=John과 같이 요청이 들어오면, name 파라미터는 "John"이라는 값으로 설정됩니다.

 


 

@RequestParam과의 차이점

spring 공부를 처음 시작할때 @RequestParam과 @ModelAttribute 둘다 스프링 프레임워크에서 웹 요청의 데이터를 컨트롤러로 전달하는데 사용되는 어노테이션이기 때문에 둘 사이의 차이점이 무엇인지 제대로 파악하지 못했다.

이 둘은 비슷한 역할을 수행하지만, 몇가지 차이점이 있다.

1. 바인딩 대상 :

  • @RequestParam: 이 어노테이션은 HTTP 요청의 쿼리 파라미터를 바인딩할 때 사용된다. 쿼리 파라미터는 URL 뒤에 "?"를 붙이고 파라미터 이름과 값을 설정한 것들을 말한다.
  • @ModelAttribute: 이 어노테이션은 모델에 담긴 속성(attribute)을 바인딩할 때 사용됩니다. 주로 컨트롤러 메서드에서 모델에 데이터를 추가하여 뷰로 전달하거나, 뷰에서 전달된 데이터를 컨트롤러에서 사용할 때 활용됩니다.

2. 기본 적용 범위:

  • @RequestParam: 이 어노테이션은 메서드 파라미터에 사용되며, 요청의 특정 쿼리 파라미터를 해당 파라미터와 바인딩한다.
  • @ModelAttribute: 이 어노테이션은 메서드 파라미터와 메서드 레벨에서 사용된다. 메서드 파라미터에 사용되면 해당 파라미터와 모델 속성을 바인딩하고, 메서드 레벨에 사용되면 해당 메서드가 반환하는 객체를 모델에 추가한다.

3. 데이터 바인딩 전처리:

  • @RequestParam: 요청의 쿼리 파라미터를 자동으로 기본 데이터 타입으로 변환해준다. 예를 들어, 요청 파라미터가 숫자 형태인 경우 자동으로 int 또는 double과 같은 데이터 타입으로 변환한다.
  • @ModelAttribute: 객체 타입으로 데이터를 바인딩해주기 때문에 보다 복잡한 객체에 대한 데이터 전달이 가능합니다. 하지만 자동 변환이 이루어지지 않으므로, 요청 파라미터와 매핑되는 객체의 생성과 속성 설정은 개발자가 수동으로 해주어야 합니다.

 

 

정리하자면, @RequestParam은 요청의 쿼리 파라미터를 메서드 파라미터와 연결하여 단순한 데이터를 받아오는 데 주로 사용되고, @ModelAttribute는 컨트롤러에서 모델과 데이터를 주고받는 데 활용되며 객체를 바인딩하여 보다 복잡한 데이터를 다루는 데 유용하다.

'Back End > Spring' 카테고리의 다른 글

[Spring] 서블릿(servlet) aka. MVC 구버전  (0) 2023.08.03
[Spring] 웹 애플리케이션의 이해...  (0) 2023.08.01
[Spring] 간단한 쇼핑몰 예제  (0) 2023.07.23
Spring - 빈 스코프  (0) 2023.07.17
Spring - 빈 생명주기 콜백  (0) 2023.07.16