Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 생각
- 달리기를말할때내가하고싶은이야기
- 영속성컨텍스트
- 클린코드
- 1월의독서
- 영속성
- spring configuration
- gulp
- 다시보기연습
- es5
- 람다
- ES6
- 모던자바인액션
- 잡담
- 발음공부
- 스프링5레시피
- 엔티티매핑
- 객체지향생활체조원칙
- 동작파라미터화
- 나만재밌는이야기
- 스프링구성
- a-d
- Java8
- 프레디케이트
- 제대로알기
- 일급함수
- 메서드참조
- spring5receipe
- JPA
- 일빵빵알파벳파닉스
Archives
- Today
- Total
notepad
[JPA 활용2] API 개발 기본 본문
인프런 - 실전! 스프링 부트와 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
- @Getter @Setter @RequireArgsConstructor, @ToString @EqualsAndHashCode 한번에 생
- 자바 자주 사용되는 Lombok 어노테이션 | Engineering Blog by Dale Seo
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