|
목적 |
데이터 양 |
http 동사 |
결과 |
|
PatchDto |
이미 존재하는 리소스의 일부를 수정 |
수정 되는 필드만 포함하는 객체 사용 일부 필드만 변경하고 싶을 때 사용 |
PATCH 메서드와 함께 사용 |
존재 리소스 수정 수정 리소스 반환 |
데이터 전송을 위해 사용되지만 각각 다른 목적, 데이터양, HTTP동사를 가진다 |
PostDto |
리소스 만들기 클라이언트가 서버에세 새로운 데이터 전송 |
모든 필드 값을 포함하는 완전 데이터 객체 요구 |
POST 메서드와 함께 사용 |
새로운 리소스 생성 생성 리소스 반환 |
CoffeeController
|
- 클라이언트에서 전송하는 Request Body의 데이터는 다음으로 제한합니다.
- korName(한글 커피명): String
- engName(영문 커피명): String
- price(가격): int 또는 Integer
- 클라이언트에서 요청으로 전송하는 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에 포함되는 경우
- 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;
}
}