주의점 메모장

엔티티, 리스트를 직접 반환하지말라

키스샷1104 2023. 11. 15. 04:13

이렇게 Entity를 직접 반환도 하지말자

예시를 들어보자

회원목록을 보려고 하는데 Member자체를 호출해버리면 거기에 딸린

orders까지 보인다 즉 정보를 조회하면 그 사람이 주문 한것까지 조회가 된다는것이다. 만약 다른사람이 어느 사람을 조회했는데 저렇게 된다면 별로 좋지 않을것이다.

그렇다고

 

이렇게 JsonIgnore를 쓰면 orders는 넘어가지 않을것이다. 하지만 또 문제점이 있다.

조회를 하는 함수는 여러개가 있는데 모든 조회함수들은 orders를 호출하지 못하는 문제가 생기며 추가적으로 Entity가 스팩이 변하면 또 문제도 생기는것이다.

 

그리고 List를 그대로 반환하면 기능 확장이 어렵다.  DTO를 넣어서 List도 넣고 다른것도 넣고 해서 유연하고 안전하게 가져가자

 

이것도 DTO를 생성하여 반환하는게 좋다

 

@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;
}

 

 

api개발 시 Controller에서 Entity절대로 노출, 반환 하지말자