Spring

[Spirng] HTTP 요청 파라미터 - @ModelAttribute

130mood 2024. 5. 20. 15:55

ModelAttribute

실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.

 

스프링은 자동화해주는 @ModelAttribute 기능을 제공한다.

 

import lombok.Data;

@Data
public class HelloData {
    private String username;
    private int age;
}

롬복 @Data

@Getter, @Setter, @ToString, @EqualAndHashCode, @RequiredArgsConstrutor를 자동으로 적용해준다.

 

ModelAttribute - v1

    @ResponseBody
    @RequestMapping("/model-attribute-v1")
    public String modelAttributeV1(@ModelAttribute HelloData helloData){

        log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());

        return "ok";
    }

스프링MVC는 @ModelAttribute가 있으면 다음을 실행한다.

  • HelloData 객체를 생성한다.
  • 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩)한다.
  • 예) 파라미터 이름이 username이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.

 

ModelAttribute - v2

    @ResponseBody
    @RequestMapping("/model-attribute-v2")
    public String modelAttributeV2(HelloData helloData){

        log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());

        return "ok";
    }

@ModelAttribute는 생략할 수 있다.

그런데 @RequestParam도 생략할 수 있으니 혼란이 발생할 수 있다.

 

스프링은 해당 생략시 다음과 같은 규칙을 적용한다.

  • String, int, Integer 같은 단순 타입 = @RequsetParam
  • 나머지 = @ModelAttribute (argument resolver로 지정해둔 타입 외)

 

해당 내용은 김영한님의 인프런 강의 "스프링 MVC 1편"을 참고하여 정리한 글 입니다.