스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 대시보드 - 인프런 | 강의 (inflearn.com)
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의
웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있
www.inflearn.com
Bean Validation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Data
public class Item{
@NotNull
private Long id;
@NotBlank
private String itemName;
@NotNull
@Range(min = 1000, max = 1000000)
private Integer price;
// 수정에서는 수량 자유롭게 변경 가능
private Integer quantity;
}
|
cs |
Controller에 @Validated 추가
1
2
3
4
|
@PostMapping("/add")
public String addItem(@Validated @ModelAttribute Item item,
BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { ...
}
|
cs |
검증 순서
① @ModelAttribute 각각의 필드에 타입 변환 시도
1. 성공하면 다음으로
2. 실패하면 typeMismatch 로 FieldError 추가
② Validator 적용
- 바인딩에 성공한 필드만 Bean Validation 적용
- BeanValidator는 바인딩에 실패한 필드는 BeanValidation을 적용하지 않는다.
예)
itemName 에 문자 "A" 입력 타입 변환 성공 itemName 필드에 BeanValidation 적용
price 에 문자 "A" 입력 "A"를 숫자 타입 변환 시도 실패 typeMismatch FieldError 추가
price 필드는 BeanValidation 적용 X
에러 코드
어노테이션 이름으로 에러 코드 생성됨
① @NotBlank
NotBlank.item.itemName
NotBlank.itemName
NotBlank.java.lang.String
NotBlank
② @Range
Range.item.price
Range.price
Range.java.lang.Integer
Range
도메인 객체 vs 별도의 객체
① 폼 데이터 전달에 Item 도메인 객체 사용
HTML Form -> Item -> Controller -> Item -> Repository
- 장점: Item 도메인 객체를 컨트롤러, 리포지토리 까지 직접 전달해서 중간에 Item을 만드는 과정이
없음
- 단점: 간단한 경우에만 적용 가능. 수정시 검증이 중복될 수 있고, groups를 사용해야 함
② 폼 데이터 전달을 위한 별도의 객체 사용
HTML Form -> ItemSaveFrom -> Controller -> Item 생성 -> Repository
- 장점: 전송하는 폼 데이터가 복잡해도 거기에 맞춘 별도의 폼 객체를 사용해서 데이터를 전달 받을 수
있음. 보통 등록과, 수정용으로 별도의 폼 객체를 만들기 때문에 검증이 중복되지 않음
- 단점: 폼 데이터를 기반으로 컨트롤러에서 Item 객체를 생성하는 변환 과정이 추가됨
※ Item은 검증 안함. ItemSaveForm과 ItemUpdateForm 검증
API 호출 Validation 실패 시 400 bad request 뜨는 이유
-> json request를 ItemSaveForm 객체로 변환하지 못함 (컨트롤러 호출도 안됨)
API 호출 3가지 경우
① 성공 요청: 성공
② 실패 요청: JSON을 객체로 생성하는 것 자체가 실패함 (400 bad request)
③ 검증 오류 요청: JSON을 객체로 생성하는 것은 성공했고, 검증에서 실패함
@ModelAttribute vs @RequestBody
① @ModelAttribute: 각각의 필드 단위로 세밀하게 적용. 특정 필드에 타입이 맞지 않는 오류가 발생해도 나머지 필드는 정상 처리 가능 (Validator를 사용한 검증도 적용 가능)
② @RequestBody: 전체 객체 단위로 적용. 메시지 컨버터의 작동이 성공해서 Item 객체를 만들어야 @Valid , @Validated 가 적용됨. HttpMessageConverter 단계에서 JSON 데이터를 객체로 변경하지 못하면 이후
단계 자체가 진행되지 않고 예외 발생. 컨트롤러도 호출되지 않고, Validator도 적용 불가.
'오늘 배운 것' 카테고리의 다른 글
[스프링 MVC 2] 로그인 처리2 - 필터, 인터셉터 (0) | 2021.07.22 |
---|---|
[스프링 MVC 2] 로그인 처리1 - 쿠키, 세션 (0) | 2021.07.20 |
2021.07.14 (수) (0) | 2021.07.14 |
[알고리즘] 다익스트라, 세그먼트 트리 (0) | 2021.07.13 |
[알고리즘] 위상정렬, 프림, 크루스칼 (0) | 2021.07.12 |