Controller 구현 - DTO, 유효성 검사

귀찮Lee·2022년 6월 27일
0

Spring

목록 보기
18/30
post-custom-banner

◎ DTO(Data Transfer Object)

  • 마틴 파울러(Martin Fowler)가 ‘Patterns of Enterprise Application Architecture’ 라는 책에서 처음 소개한 엔터프라이즈 애플리케이션 아키텍처 패턴의 하나

  • 데이터를 받고 보내기위한 객체

    • 클라이언트에서 서버 쪽으로 전송하는 요청 데이터, 서버에서 클라이언트 쪽으로 전송하는 응답 데이터에서 사용
  • 필요성

    • @RequestParam을 이용해 변수를 하나씩 받아온다면, 코드가 지저분해지고, 추후 데이터를 추가하면 더 길어진다.
      -> 요청 데이터를 하나의 객체로 전달받는 역할을 해준다.
    • 데이터 유효성 검증을 어노테이션 몇개를 통해 쉽게 할 수 있다.
    • 유효성 검증 로직을 DTO 클래스로 빼내에 핸들러 메서드의 간결함을 유지할 수 있다.
    • 한번에 여러가지의 데이터를 전부 가져오거나 보내 줄 수 있어서, http 요청 수를 줄일 수 있다.

◎ DTO 적용

@PostMapping("/api/products")
  public Product createProduct(@RequestBody ProductRequestDto requestDto) {
       // 대략적인 코드
      return new ResponseEntity<>(requestDto, HttpStatus.OK);
  }
  • Data를 주고받는 형식이 필요할 때마다, DTO Class를 만들어서 사용 (DTO 클래스마다 @Getter는 필수!)
  • 사용 시에는 DTO 파라미터 앞에 @RequestBody를 이용해서 받음
    • JSON 형식의 데이터를 받을 때는 @RequestBody를 이용
    • x-www-form-urlencoded 형식은 DTO로 받을 때, @ModelAttribute 이용 (@Setter 가 필요)

◎ DTO 유효성 검사

  • 유효성 검증 라이브러리 추가

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-validation'
        ...
        ...
    }
  • 예시 코드

    @Getter
    @Setter
    public class CoffeePatchDto {
        private long coffeeId;
    
        @NotSpace(message = "커피명(한글)은 공백이 아니어야 합니다.")
        private String korName;
    
        @Pattern(regexp = "^([A-Za-z])(\\s?[A-Za-z])*$", message = "커피명(영문)은 영문이어야 합니다. 예) Cafe Latte")
        private String engName;
    
        private Optional<@Range(min= 100, max= 50000) Integer> price = Optional.empty();   
    }
    @Validated
    public class CoffeeController {
    
      @PatchMapping("/{coffee-id}")
      public ResponseEntity patchCoffee(
              @PathVariable("coffee-id") @Positive long coffeeId,
              @Valid @RequestBody CoffeePatchDto coffeePatchDto) {
          
          coffeePatchDto.setCoffeeId(coffeeId);
    
          return new ResponseEntity<>(coffeePatchDto, HttpStatus.OK);
       }
    }
  • @Valid

    • 데이터를 받는 DTO에 있는 필드 요소들에 데이터 검증 실시
    • 데이터 검증 조건은 DTO에 어노테이션을 통해 표기
    • 데이터 검증 조건에 맞지 않는 경우, 오류를 냄
  • @Validated

    • 해당 (컨트롤러) 클래스에 내에 있는 메서드에서, 앞에 특정 검증 조건이 달려있는 경우, 테이터 검증을 실행
    • PathVariable 에 사용하기 용이
    • 데이터 검증 조건에 맞지 않는 경우, 오류를 냄
  • 데이터 검증 어노테이션

    • @AssertFalse : false 값만 통과 가능
    • @AssertTrue : true 값만 통과 가능
    • @DecimalMax(value=) : 지정된 값 이하의 실수만 통과 가능
    • @DecimalMin(value=) : 지정된 값 이상의 실수만 통과 가능
    • @Digits(integer=,fraction=) : 대상 수가 지정된 정수와 소수 자리수보다 적을 경우 통과 가능
    • @Future : 대상 날짜가 현재보다 미래일 경우만 통과 가능
    • @Past : 대상 날짜가 현재보다 과거일 경우만 통과 가능
    • @Max(value) : 지정된 값보다 아래일 경우만 통과 가능
    • @Min(value) : 지정된 값보다 이상일 경우만 통과 가능
    • @NotNull : null 값이 아닐 경우만 통과 가능
    • @NotEmpty : null, "" 이 아닌 경우
    • @NotBlank : null, "", " " 이 아닌 경우
    • @Null : null일 겨우만 통과 가능
    • @Pattern(regex=, flag=, message=) : 해당 정규식을 만족할 경우만 통과 가능
    • @Size(min=, max=) : 문자열 또는 배열이 지정된 값 사이일 경우 통과 가능
    • @Valid : 대상 객체의 확인 조건을 만족할 경우 통과 가능
    • 출처 : https://mycup.tistory.com/154 [IT.FARMER:티스토리]
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!
post-custom-banner

0개의 댓글