Back-End/Spring

[Spring MVC2][검증2(Validation)] - Bean Validation - HTTP 메시지 컨버터

얄루몬 2022. 5. 5. 20:42

💻본 포스팅은 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한'님의 강의를 듣고 작성되었습니다.

https://inf.run/vQHp

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com


[Bean Validation - HTTP 메시지 컨버터]

@Valid , @Validated 는 HttpMessageConverter ( @RequestBody )에도 적용할 수 있다.

  • @ModelAttribute 는 HTTP 요청 파라미터(URL 쿼리 스트링, POST Form)를 다룰 때 사용한다.
  • @RequestBody 는 HTTP Body의 데이터를 객체로 변환할 때 사용한다. 주로 API JSON 요청을 다룰 때 사용한다.

 

[포스트맨을 사용한 메시지 컨버터 검증]

API의 경우 3가지 경우를 나누어 생각해야 한다. 

  • 성공 요청: 성공
  • 실패 요청: JSON을 객체로 생성하는 것 자체가 실패(controller 실행 X)
  • 검증 오류 요청: JSON을 객체로 생성하는 것은 성공했고, 검증에서 실패
package hello.itemservice.web.validation;


import hello.itemservice.domain.item.Item;
import hello.itemservice.web.validation.form.ItemSaveForm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequestMapping("/validation/api/items")
public class ValidationItemApiController {

    //@ResponseBody RestController의 경우 자동으로 붙음
    @PostMapping("/add")
    public Object addItem(@RequestBody @Validated ItemSaveForm form, BindingResult bindingResult){
        log.info("API 컨트롤러 호출");

        if(bindingResult.hasErrors()) {
            log.info("검증 오류 발생 errors = {}" ,bindingResult);
            return bindingResult.getAllErrors();
        }
        log.info("성공 로직 실행");
        return form;
    }
}

 

[성공]

포스트맨을 사용
log 출력문

[실패]

  • HttpMessageConverter 에서 요청 JSON을 Item 객체로 생성하는데 실패한다. 
  • 이 경우는 Item 객체를 만들지 못하기 때문에 컨트롤러 자체가 호출되지 않고 그 전에 예외가 발생한다.
    • 물론 Validator도 실행되지 않는다
  • 이는 예외처리 관련 강의에서 처리 방법을 알려준다고 한다.

 

[검증 오류 요청]

JSON을 객체로 생성하는 것은 성공했고, 검증에서 실패