상세 컨텐츠

본문 제목

Spring MVC @ModelAttribute (매개변수 레벨)

프레임워크/Spring Boot

by 최승호 2022. 5. 25. 12:00

본문

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-modelattrib-method-args

 

Web on Servlet Stack

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more com

docs.spring.io

@ModelAttribute 어노테이션은

메소드의 매개변수로 사용하여 모델 객체로 데이터를 받을 수 있다.

모델 속성은 HTTP 서블릿 리퀘스트 파라미터의 필드 이름과 매칭해서 만들어지기 때문에 데이터를 일일이 바인딩하지 않아도 된다는 장점이 있다.

Member.java

@Data
public class Member {
    private String id;
    private String name;
}

ModelAttributeController.java

@GetMapping("/model")
public void model(@ModelAttribute Member member) {
	log.info("member : {}", member);
}

URL을 http://localhost:8080/model/model?id=1&name=hong 이렇게 요청하면 id와 name 값을 Member 클래스의 필드 속성과 자동으로 매칭해 준다.

실행결과

member : Member(id=1, name=hong)

실행순서

  • 메소드 레벨에 @ModelAttribute 어노테이션이 있으면 메소드를 실행하고 속성을 찾는다.
  • 클래스 레벨에 @SessionAttributes 어노테이션이 있으면 세션에서 속성을 찾는다.(만약 세션의 속성에 모델 값이 없으면 org.springframework.web.HttpSessionRequiredException이 발생한다.)
  • path variable이나 요청 파라미터 같은 요청 정보를 통해 모델 속성과 일치하는 값을 Converter를 통해 찾는다.
  • 기본 생성자를 사용하여 인스턴스화 된다.
@Slf4j
@SessionAttributes({"member"})
@RequestMapping("/model")
@RestController
public class ModelAttributeController {

    @Autowired HttpSession session;
    
    @ModelAttribute
    public void defaultModel(Model model) {
        log.info("defaultModel 호출");
        Member member = new Member();
        member.setId("defaultId");
        member.setName("defaultName");
        model.addAttribute("member", member);
    }

    @GetMapping("/model")
    public void model(@ModelAttribute Member member) {
        log.info("member : {}", member);
    }

    @GetMapping("/session")
    public void sessionRead() {
        log.info("sessionRead : {}", session.getAttribute("member"));
    }
}

localhost:8080/model/model?id=hong 요청 시 로그

defaultModel 호출
member : Member(id=hong, name=defaultName)

localhost:8080/model/session 요청 시 로그

defaultModel 호출
sessionRead : Member(id=hong, name=defaultName)

'프레임워크 > Spring Boot' 카테고리의 다른 글

Spring MVC @RequestBody  (0) 2022.05.26
Spring MVC @CookieValue  (0) 2022.05.24
Spring MVC @RequestParam  (0) 2022.05.23

관련글 더보기

댓글 영역