notepad

[JPA 활용2] API 개발 기본 본문

JPA

[JPA 활용2] API 개발 기본

likewise_ 2020. 8. 3. 18:03

인프런 - 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

1. 등록 API 개발

API는 항상, 절대 엔티티를 사용하지 않는다. DTO를 만들어서 사용한다. -> 엔티티가 변해도 API 스펙이 변하지 않도록 한다.

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

inner class 를 이용하여 DTO 생성

- 외부 접근/생성을 위해 request는 static class로 사용
- @Valid와 같은 검증 로직을 entity와 분리
=>> V2 엔티티 대신에 DTO를 RequestBody에 매핑 
CreateMemberRequest 를 Member 엔티티 대신에 RequestBody와 매핑한다. 엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있다.
엔티티와 API 스펙을 명확하게 분리할 수 있다.
엔티티가 변해도 API 스펙이 변하지 않는다. 
> 참고: 실무에서는 엔티티를 API 스펙에 노출하면 안된다! 회원 수정 API 

Lombok @Data annotation

2. 수정 API 개발

수정용 별도의 Requst, Response DTO를 생성한다. 수정은 등록에 비해 데이터가 제한적이기 때문에 별도로 가져가는게 좋다.

Lombok @Data @AllArgsConstructor 등 엔티티는 가능하면 @Getter만 DTO는 자유롭게

커맨드랑 쿼리를 분리하자. memberService의 update의 경우 Member Update 후 return값으로 변경된 멤버 객체(영속 상태는 끊긴 상태) 를 반환할 수 있다. 하지만 이렇게 할 경우 데이터 조회(쿼리)와 데이터 변경(커맨드)가 혼용된다. 가급적이면 커맨드는 리턴값으로 ID 정도만 반환하자. (유지보수에 좋다)

조회 API 개발

[v1] findMembers를 통해 엔티티를 직접 반환, Array를 바로 반환시 API 확장을 할 수 없고 유연성이 떨어진다. 또 엔티티 변경 시 API 스펙이 변경되어 직접 반환은 절대 하지 말자 -> DTO 사용.

[v2] 응답 값으로 엔티티가 아닌 별도의 DTO 사용, Result 클래스를 추가하여 어레이를 오브젝트로 감싸준다.

/** 
* 조회 V2: 응답 값으로 엔티티가 아닌 별도의 DTO를 반환한다. 
*/ 
@GetMapping("/api/v2/members")
public Result membersV2() {
    List<Member> findMembers = memberService.findMembers(); //엔티티 -> DTO 변환 
    List<MemberDto> collect = findMembers.stream() 
            .map(m -> new MemberDto(m.getName(), m.getAddress())) 
            .collect(Collectors.toList()); 
  return new Result(collect.size(), collect);
}
@Data
@AllArgsConstructor
class Result<T> {
    private int count;
    private T data;
}
@Data
@AllArgsConstructor
class MemberDto {
    private String name;
    private Address address;
}
}

'JPA' 카테고리의 다른 글

[JPA 활용1] 요약  (0) 2020.08.07
[JPA 활용2] 기본~ 고급 요약  (0) 2020.08.07
[JPA 활용2] 고급 - 지연 로딩과 조회 성능 최적화  (0) 2020.08.05
[JPA-BASIC] 엔티티 매핑  (0) 2020.07.17
[JPA-BASIC] 영속성 관리  (0) 2020.07.16
Comments