@RestController
@RequiredArgsConstructor
public class BookApiController { // 컴포지션 = has 관계
private final BookService bookService;
// 1. 책등록
// 기본 파싱 형식
// key=value&key=value
// spring에서 json 방식 파싱
// { "key" : value, "key" : value }
@PostMapping("/api/v1/book")
public ResponseEntity<?> saveBook(@RequestBody BookSaveReqDto bookSaveReqDto){
BookRespDto dto = bookService.책등록하기(bookSaveReqDto);
CMRespDto cmRespDto = CMRespDto.builder()
.code(1)
.msg("성공")
.body(dto).build();
return new ResponseEntity<>(cmRespDto, HttpStatus.CREATED); // 프론트에 전송할 dto를 따로 만들어서 함께 전달해준다.
}
controller 테스트 할 때는 postman 사용하여 제대로 작동하는지 확인해준다.
package site.metacoding.junitproject.web.dto.response;
import lombok.Builder;
import lombok.Getter;
@Getter
public class CMRespDto<T> {
private Integer code; // -1: 실패, 1: 성공
private String msg;
private T body; // 이게 항상 object가 다르기 때문에 제네릭으로 설정해준다. -
@Builder
public CMRespDto(Integer code, String msg, T body){
this.code = code;
this.msg = msg;
this.body = body;
}
}
ResponseEntity에 body를 실어보낼 때 body에 들어갈 responseDto를 따로 만들어 필요한 정보를 프론트에 전달해줄 수 있다.
위와 같이 에러메시지가 뜬다. 이러한 에러 메시지를 프론트가 보기 좋게 수정을 해주는 것이 좋다.
에러를 방지하기 위해서 validation을 사용해줄 거임.
validation을 사용해서 사용자가 입력한 값이 entity를 통해 db에 들어가기 전에 dto에서 적절하지 못한 값들을 막아주는 것이다.
@Entity
@NoArgsConstructor
@Getter
public class Book {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private Long id;
@Column(length = 50, nullable = false)
private String title;
@Column(length = 20, nullable = false)
private String author;
}
@Getter
@Setter // controller에서 Setter가 호출되면서 Dto에 값이 채워진다.
public class BookSaveReqDto {
@Size(min = 1, max = 50) // Entity와 값을 맞춰준다.
@NotBlank // NotBlank : 공백과 null을 검사한다.
private String title;
@Size(min = 2, max = 20)
@NotBlank
private String author;
public Book toEntity(){
return Book.builder()
.title(title)
.author(author)
.build();
}
}
Entity의 조건에 맞게 Dto도 validation을 통해 값을 체크해준다.
유효성 검증은 되도록이면 Controller에서 @Valid를 통하여 해준다. 불가피하게 다른 계층에서 해줘야 하는 경우에는 @Validated를 사용해서 검증해줄 수 있다.
@PostMapping("/api/v1/book")
public ResponseEntity<?> saveBook(@RequestBody @Valid BookSaveReqDto bookSaveReqDto, BindingResult BindingResult){
System.out.println(BindingResult.hasErrors());
BookRespDto dto = bookService.책등록하기(bookSaveReqDto);
CMRespDto cmRespDto = CMRespDto.builder()
.code(1)
.msg("성공")
.body(dto)
.build();
return new ResponseEntity<>(cmRespDto, HttpStatus.CREATED); // 프론트에 전송할 dto를 따로 만들어서 함께 전달해준다.
}
controller에서 @Valid를 통해 들어온 값이 유효한 값인지 체크해준다.
@Valid 에 대한 블로그
https://mangkyu.tistory.com/174