-
[스프링부트/웹 애플리케이션 개발]회원 조회 API스프링&스프링부트 2023. 1. 11. 15:08
application.yml > ddl-auto: none수정
spring: jpa: hibernate: ddl-auto: none properties: hibernate: # show_sql: true format_sql: true
회원 조회 API > MemberApiController > memberV1
@GetMapping("/api/v1/members") public List<Member> memberV1() { return memberService.findMembers(); }
- 회원 정보만 원하는데 엔티티의 정보(orders) 모두가 외부에 노출 > @JsonIgnore 이용하면 해결
> 다른 API는? 문제 발생
- 엔티티에 프레젠테이션을 위한 로직(@JsonIgnore)이 추가되었다
- 엔티티가 변경되면 API 스펙이 변한다
>> API 응답 스펙에 맞추어 별도의 DTO를 반환한다
- 유연성이 떨어짐
* 엔티티를 외부에 노출하지 말자!
> 실무에서는 member 엔티티의 데이터가 필요한 API가 계속 증가하게 된다.
어떤 API는 name 필드가 필요하지만, 어떤 API는 name 필드가 필요 없을 수 있다.
결론적으로 엔티티 대신에 API 스펙에 맞는 별도의 DTO를 노출해야 한다.
회원 조회 API > MemberApiController > memberV2
@GetMapping("/api/v2/members") public Result memberV2() { List<Member> findMembers = memberService.findMembers(); List<MemberDto> collect = findMembers.stream() .map(m -> new MemberDto(m.getName())) .collect(Collectors.toList()); return new Result(collect); } @Data @AllArgsConstructor static class Result<T> { private T data; } @Data @AllArgsConstructor static class MemberDto { private String name; }
- 엔티티를 DTO로 변환해서 반환한다.
- 엔티티가 변해도 API 스펙이 변경되지 않는다.
- 추가로 Result 클래스로 컬렉션을 감싸서 향후 필요한 필드를 추가할 수 있다.
728x90'스프링&스프링부트' 카테고리의 다른 글
[스프링부트/웹 애플리케이션 개발]API 개발 고급-2 (0) 2023.01.11 [스프링부트/웹 애플리케이션 개발]API 개발 고급-1 (1) 2023.01.11 [스프링부트/웹 애플리케이션 개발]API 개발 기본 (0) 2023.01.11 [스프링부트/웹 애플리케이션 개발] 상품 주문 (0) 2023.01.06 [스프링부트/웹 애플리케이션 개발]변경 감지와 병합(merge) (0) 2023.01.05