DTO를 사용하여 입력받는 이유

- 다음과 같이 사용자 입력이 동적으로 변하는 경우를 처리할 수 있다.
- DTO를 사용하면 어떤 입력이 들어오는지 명확하게 확인하고 처리할 수 있다.
Spring에서 DTO를 처리하기
ModelAttribute
- form 데이터를 가져와 바인딩하는 일종의 커맨드 함수
- GET, POST에서 form 데이터를 가져와 사용가능
RequestBody
- http, body의 json 내용을 받아와 역직렬화를 통해서 객체를 구성
- POST 요청에서 body의 데이터를 가져옴
DTO 구성하고 Valid
In DTO LIST
@PostMapping("")
public String exa(@Valid @ModelAttribute List<BacktestDTO> backtestDTOList) {
return "exa";
}
- 다음과 같이 구성한다면 Valid가 제대로 작동하지 않는다.
- Spring MVC에서 Valid의 경우 handlerMapping 과정에서 ArgumentResolver를 거치면서 @Valid가 있는 경우 검증을 진행한다.
- 즉, List에 대한 검증 조건이 존재하지 않기 때문에 오류가 발생한다.
public class BacktestInputDTO {
private String startDate;
private String endDate;
@Positive
private double startAmount;
@Valid
List<BacktestItemDTO> items;
private int size;
}
BindingResult bindingResult
- bindingResult는 검증에서 오류가 발생하여도 Controller의 코드를 실행한다.
- 단, 반드시 검증하는 객체 뒤에 위치해야함
@PostMapping("")
public String postBacktest(Model model, @Valid @ModelAttribute BacktestInputDTO backtestInputDTO, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "backtest_portfolio";
}
return "backtest_portfolio";
}