본문 바로가기
웹 프로그래밍/API 성능 최적화

01. 회원 등록 API

by Backchus 2020. 7. 20.

API 개발 기본

회원 등록

package me.weekbelt.jpashop.api;

@RestController
@RequiredArgsConstructor
public class MemberApiController {

    private final MemberService memberService;


    @PostMapping("/api/v1/members")
    public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) {
        Long id = memberService.join(member);
        return new CreateMemberResponse(id);
    }

    @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 {
        private String name;
    }

    @Data
    static class CreateMemberResponse {
        private Long id;

        public CreateMemberResponse(Long id) {
            this.id = id;
        }
    }

}

V1 엔티티를 Request Body에 직접 매핑

  • 문제점
    • 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다.
    • 엔티티에 API 검증을 위한 로직이 들어간다. (@NotEmpty 등등)
    • 실무에서는 회원 엔티티를 위한 API가 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 모든 요청 요구사항을 담기는 어렵다.
    • 엔티티가 변경되면 API 스펙이 변한다.
  • 결론
    • API 요청스펙에 맞추어 별도의 DTO를 파라미터로 받는다.

V2 엔티티 대신에 DTO를 RequestBody에 매핑

  • CreateMemberRequest를 Member엔티티 대신에 RequestBody와 매핑한다.

  • 엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있다.

  • 엔티티와 API 스펙을 명확하게 분리할 수 있다.

  • 엔티티가 변해도 API의 스펙은 변하지 않는다.

    참고 : 실무에서는 엔티티를 API 스펙에 노출하면 안된다!

참고 강의:실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화