코드 그라데이션

HTTP 요청 파라미터 - @ModelAttribute 본문

Spring/MVC 1

HTTP 요청 파라미터 - @ModelAttribute

완벽한 장면 2023. 10. 8. 18:39

HTTP 요청 파라미터 - @ModelAttribute

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

보통 다음과 같이 코드 작성

 

일단 HelloData 생성

HelloData - 요청 파라미터를 바인딩 받을 객체

@RequestParam String username;
@RequestParam int age;
HelloData data = new HelloData();
data.setUsername(username);
data.setAge(age);

 

@Data

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

 

@ModelAttribute 적용

이렇게 되어있던 코드를 이제 바꿔서

@ModelAttribute 적용 - modelAttributeV1

    /**
     * @ModelAttribute 사용
     * 참고: model.addAttribute(helloData) 코드도 함께 자동 적용됨, 뒤에 model을 설명할 때
    자세히 설명
     */
    @ResponseBody
    @RequestMapping("/model-attribute-v1")
    public String modelAttributeV1(@ModelAttribute HelloData helloData) {
        log.info("username={}, age={}", helloData.getUsername(),
                helloData.getAge());
        return "ok";
    }

 

실행하면

 

 

마치 마법처럼 HelloData 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다.

 

 

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

 

 

프로퍼티

class HelloData {
	getUsername();
	setUsername();
}

 

바인딩 오류

age=abc 처럼 숫자가 들어가야 할 곳에 문자를 넣으면 BindException 이 발생한다.

400에러 나옴.

2023-09-05 17:13:55.582  WARN 25388 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors<EOL>Field error in object 'helloData' on field 'age': rejected value [abc]; codes [typeMismatch.helloData.age,typeMismatch.age,typeMismatch.int,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [helloData.age,age]; arguments []; default message [age]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'age'; nested exception is java.lang.NumberFormatException: For input string: "abc"]]

 

이런 바인딩 오류를 처리하는 방법은 검증 부분에서 다룬다.

 

 

@ModelAttribute 생략 - modelAttributeV2

 

728x90
Comments