JPA

회원등록 API v1, v2 차이

쿠카이든 2022. 2. 14. 12:29
728x90
  • 회원등록 API v1, v2 차이 비교
  • 회원등록 V1: 요청 값으로 Member 엔티티를 직접 받습니다.  
  • 문제점  
    • 엔티티에 프레젠테이션 계층을 위한 로직이 추가됩니다.  
    • 엔티티에 API 검증을 위한 로직이 들어갑니다. (@NotEmpty 등등)  
      • 실무에서는 회원 엔티티를 위한 API가 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 모든 요청 요구사항을 담기는 어렵습니다.  
    • 엔티티가 변경되면 API 스펙이 변합니다.  
  • 결론 - API 요청 스펙에 맞추어 별도의 DTO를 파라미터로  따로 생성하여 받는것이 좋습니다.
@PostMapping("/api/v1/members")
public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){
    Long id = memberService.join(member);
    return new CreateMemberResponse(id);
}
@Data
static class CreateMemberRequest {
    private String name;
}
@Data
class CreateMemberResponse {
    private Long id;
    public CreateMemberResponse(Long id) {
        this.id = id;
    }
}
  • 회원 등록 V2: 요청 값으로 Member 엔티티 대신에 별도의 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);
}
  • CreateMemberRequest 를 Member 엔티티 대신에 RequestBody와 매핑
    • 엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있습니다.
    • 엔티티와 API 스펙을 명확하게 분리할 수 있습니다.
      • 엔티티가 변해도 API 스펙이 변하지 않습니다.
    • 또한, 엔티티를 API 스펙에 노출을 최소화 할 수 있는 장점이 있습니다.
728x90

'JPA' 카테고리의 다른 글

QueryDSL 소개  (0) 2022.02.15
페치 조인(fetch join) 의 활용  (0) 2022.02.14
변경 감지(dirty check)와 병합(merge)  (0) 2022.02.14
(Querydsl) ON 절을 활용한 조인  (0) 2022.02.14
queryDsl 기본 조인에 대해  (0) 2022.02.14