@PostMapping("/api/v1/members")
public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
@RequestBody ? Json으로 온 Body를 Member에 매핑해서 바로 바꿔줌
@Valid ? for validation
위 예시처럼 api가 entity와 1:1로 매핑되어 있다면,
entity 변수명을 바꿔버렸을때 api가 동작안하는 이슈가 발생할 수 있음. (= entity를 손대서 api 스펙 자체가 바뀌어버림!)
따라서, API 스펙을 위한 별도의 DTO를 생성해야함
-> 예시 :
@PostMapping("/api/v2/members")
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){
Member member = new Member();
member.setName(request.getName());
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
@Data
static class CreateMemberRequest {
@NotEmpty
private String name;
}
DTO 장점 :
엔티티를 바꿀 때 컴파일 오류로 알려주기 때문에 API 영향을 받지 않음 (컨트롤러에서 오류 확인 가능)
엔티티의 어느 값이 넘어올지 개발자 입장에서 알 수 없는데,
DTO로 받으면 API 스펙 자체가 어떤 값을 넘겨받을지 정의되어 있기 때문에 확인이 가능함. (=> 유지보수에 좋음)
엔티티와 프레젠테이션 계층을 위한 로직 분리 가능
(이게 가능하니깐 1,2번의 장점이 따라오는 것 같군 🤔)
결론 : API는 요청이 나가는것/받는것 전부 다 절대 entity를 사용하지 않 는 다. DTO를 사용하는 것을 권장.