qlek1108 2023. 5. 1. 16:07
  목적 데이터 양 http 동사 결과  
PatchDto 이미 존재하는 리소스의 일부를 수정 수정 되는 필드만 포함하는 객체 사용
일부 필드만 변경하고 싶을 때 사용
PATCH 메서드와 함께 사용 존재 리소스 수정
수정 리소스 반환
데이터 전송을 위해 사용되지만 각각 다른 목적, 데이터양, HTTP동사를 가진다
PostDto 리소스 만들기
클라이언트가 서버에세 새로운 데이터 전송
모든 필드 값을 포함하는 완전 데이터 객체 요구 POST 메서드와 함께 사용 새로운 리소스 생성
생성 리소스 반환

 

CoffeeController

  • 클라이언트에서 전송하는 Request Body의 데이터는 다음으로 제한합니다.
    • korName(한글 커피명): String
    • engName(영문 커피명): String
    • price(가격): int 또는 Integer
      • 예) 3500
  • 클라이언트에서 요청으로 전송하는 Request Body와 서버에서 응답으로 전송하는 Response Body는 모두 JSON 형식으로만 전달받을 수 있습니다.

postCoffee()

  • 구현 내용
    • 커피 정보 등록을 위한 요청 데이터를 하나의 DTO 클래스로 전달받을 수 있도록 코드를 수정하세요.
    • 아래 구현 조건에 맞게 DTO 클래스에서 전달받는 요청 데이터에 유효성 검증 로직을 추가하세요.
  • 구현 조건
    • DTO 클래스 적용
      • DTO 클래스 생성 시, 클래스명은 CoffeePostDto로 생성합니다.
      • 현재 코드에서 @RequestParam으로 전달받고 있는 요청 데이터는 CoffeePostDto 객체 하나로 모두 전달받아야 합니다.
      • 현재 코드에서 Map 객체로 전달하는 응답 데이터는 CoffeePostDto 객체로 전달해야 합니다.
    • DTO 클래스에 유효성 검증 적용
      • korName(한글 커피명)
        • Request Body에 포함되는 필수 항목입니다(mandatory).
        • 공백만으로 구성되지 않아야 합니다.
          • 예) “”, 또는 “ ” 가 아니어야 함.
      • engName(영문 커피명)
        • Request Body에 포함되는 필수 항목입니다(mandatory).
        • 공백만으로 구성되지 않아야 합니다.
          • 예) “”, 또는 “ ” 가 아니어야 함.
        • 영문(대소문자 모두 가능)만 허용합니다.
        • 워드 사이에 한 칸의 공백(스페이스)만 포함될 수 있습니다.
          • 예)
            • “Cafe Latte” (ㅇ)
            • “Ca fe Latte” (ㅇ)
            • “Cafe       Latte” (X)
            • “         Cafe Latte” (X)
            • “ Cafe Latte       ” (X)
            • “ Cafe Latte ” (X)
      • price(가격)
        • Request Body에 포함되는 필수 항목입니다(mandatory).
        • 100 이상 50000 이하의 숫자만 허용합니다.

 

patchCoffee()

  • 구현 내용
    • 커피 정보 수정을 위한 요청 데이터를 하나의 DTO 클래스로 전달받을 수 있도록 코드를 수정하세요.
    • 아래 구현 조건에 맞게 DTO 클래스에서 전달받는 요청 데이터에 유효성 검증 로직을 추가하세요.
  • 구현 조건
    • DTO 클래스 적용
      • DTO 클래스 생성 시, 클래스명은 CoffeePatchDto로 생성합니다.
      • 현재 코드에서 @RequestParam으로 전달받는 있는 요청 데이터는 CoffeePatchDto 객체 하나로 모두 전달받아야 합니다.
      • 현재 코드에서 Map 객체로 전달하는 응답 데이터는 CoffeePatchDto 객체로 전달해야 합니다.
    • DTO 클래스에 유효성 검증 적용
      • korName(한글 커피명)
        • Request Body에 선택적으로 포함될 수 있습니다(포함될 수도 있고 그렇지 않을 수도 있다).
          • 즉, Request Body에 포함되지 않으면 유효성 검증을 하지 않거나 항상 검증을 통과해야 합니다.
        • Request Body에 포함되는 경우
          • 공백만으로 구성되지 않아야 합니다.
            • 예)
              • “”(X)
              • “ ” (X)
      • engName(영문 커피명)
        • Request Body에 선택적으로 포함될 수 있습니다(포함될 수도 있고 그렇지 않을 수도 있다).
          • 즉, Request Body에 포함되지 않으면 유효성 검증을 하지 않거나 항상 검증을 통과해야 합니다.
        • Request Body에 포함되는 경우
          • 공백만으로 구성되지 않아야 합니다.
            • 예) “”, 또는 “ ” 가 아니어야 함.
          • 영문(대소문자 모두 가능)만 허용합니다.
          • 워드 사이에 한 칸의 공백(스페이스)만 포함될 수 있습니다.
            • 예)
              • “Cafe Latte” (ㅇ)
              • “Ca fe Latte” (ㅇ)
              • “Cafe Latte” (X)
              • “ Cafe Latte” (X)
              • “ Cafe Latte ” (X)
              • “ Cafe Latte ” (X)
      • price(가격)
        • Request Body에 선택적으로 포함될 수 있습니다(포함될 수도 있고 그렇지 않을 수도 있다).
          • 즉, Request Body에 포함되지 않으면 유효성 검증을 하지 않거나 항상 검증을 통과해야 합니다.
        • Request Body에 포함되는 경우
          • 100 이상 50000 이하의 숫자만 허용합니다.
    • @PathVariable("coffee-id") long coffeeId에 유효성 검증 적용
      • 양수만 허용해야 합니다.

 

// 1. DTO 클래스 및 유효성 검증을 적용하세요.
    @PostMapping
    public ResponseEntity postCoffee(@Valid CoffeePostDto coffeePostDto
                                     //@Valid http요청 본문에 있는 데이터가 유효한지 검사
    ){
        return new ResponseEntity<>(coffeePostDto, HttpStatus.CREATED);
    }

    // 2. DTO 클래스 및 유효성 검증을 적용하세요.
    @PatchMapping("/{coffee-id}")
    public ResponseEntity patchCoffee(@PathVariable("coffee-id") @Positive long coffeeId,
                                      //@Positive 양수인지 검사
                                      @Valid @RequestBody CoffeePatchDto coffeePatchDto){
        coffeePatchDto.setCoffeeId(coffeeId);
        //coffeePatchDto객체의 setCoffeeId메소드를 호출하여 coffeeId 값을 설정
        //http요청 본문의로 전달된 coffeePatchDto 객체에 coffeeId 필드가 없어서 명시적으로 설정
        return new ResponseEntity<>(coffeePatchDto, HttpStatus.OK);
        //객체 생성후 http 응답 본문으로 coffeePatchDto 객체와 상태코드를 반환
    }
package com.codestates.coffee;

import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

public class CoffeePatchDto {
    private long coffeeId;

    @NotBlank(message = "이름은 공백이 아니어야 합니다.")
    private String korName;

    @Pattern(regexp="^([a-zA-Z])(\\s?[a-zA-Z])*$",message = "영어 이름은 영문(대소문자 모두 가능)으로 이루어져야 하며 공백이 아니어야 합니다.")
    private String engName;

    @Range(min=100, max=50000)
    private int price;


    public long getCoffeeId() {
        return coffeeId;
    }

    public void setCoffeeId(long coffeeId) {
        this.coffeeId = coffeeId;
    }

    public String getKorName() {
        return korName;
    }

    public void setKorName(String korName) {
        this.korName = korName;
    }

    public String getEngName() {
        return engName;
    }

    public void setEngName(String engName) {
        this.engName = engName;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}
package com.codestates.coffee;


import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

public class CoffeePostDto {
    private long coffeeId;

    @NotBlank(message = "이름은 공백이 아니어야 합니다.")
    private String korName;

    @Pattern(regexp="^([a-zA-Z])(\\s?[a-zA-Z])*$",message = "영어 이름은 영문(대소문자 모두 가능)으로 이루어져야 하며 공백이 아니어야 합니다.")
    private String engName;

    @Range(min=100, max=50000)
    private int price;



    public long getCoffeeId() {
        return coffeeId;
    }

    public void setCoffeeId(long coffeeId) {
        this.coffeeId = coffeeId;
    }

    public String getKorName() {
        return korName;
    }

    public void setKorName(String korName) {
        this.korName = korName;
    }

    public String getEngName() {
        return engName;
    }

    public void setEngName(String engName) {
        this.engName = engName;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}