@GetMapping("/api/v1/members")
public List<Member> membersV1() {
return memberService.findMembers();
}
이런 식으로 api를 만들면 Member 엔티티가 그대로 외부에 노출된다.
이로인한 문제점이 많다.
1. 엔티티에 화면과 관련된 로직이 추가된다. 엔티티는 엔티티 역할만 하게 두어야 한다.
2. 쓸데없는 정보가 들어간다. 그렇다고 @JsonIgnore해서 안보이게 하면 위에 1번 문제가 생긴다.
3. 엔티티를 수정하면 API 스펙이 바뀐다. API 쓰는 모두가 혼란에 빠질것이다.
4. 좀 별개로 리스트를 반환하면 API 스펙 변경이 힘드니 result 클래스를 생성해야한다.
그러니까 이렇게 작성해야 한다.
@GetMapping("/api/v2/members")
public Result membersV2() {
List<Member> findMembers = memberService.findMembers();
//엔티티 -> DTO 변환
List<MemberDto> collect = findMembers.stream()
.map(m -> new MemberDto(m.getName()))
.collect(Collectors.toList());
return new Result(collect);
}
@Data
@AllArgsConstructor
class Result<T> {
private T data;
}
@Data
@AllArgsConstructor
class MemberDto {
private String name;
}
주고받는걸 전부 DTO로 해야해서 번거로운데 어쩔수 없다...
'Dev > JPA' 카테고리의 다른 글
JPA와 트랜잭션, 락 (0) | 2023.03.15 |
---|---|
[강의정리] N+1 문제와 JPQL fetch join을 통한 해결 (0) | 2021.05.21 |
[강의정리] 값 타입 (0) | 2021.05.21 |
[강의정리] 영속성 전이, 고아객체, 생명주기 (0) | 2021.05.18 |
[강의정리] 프록시와 연관관계 관리 (0) | 2021.05.18 |