JPA활용2 - 회원조회

JIWOO YUN·2023년 9월 7일
0
post-custom-banner

엔티티 직업 외부에 노출시키는 경우

  • 이 경우 문제점
  • 엔티티에 프레젠테이션 계층을 위한 로직이 추가됨.
  • 엔티티의 모든 값이 노출됨 -> 민감 정보도 노출 될 수 있음.
  • 실무에서는 같은 엔티티에 대해 API 용도에 따라 다양하게 만들어지는데 이걸 다 만족하기 어려움.
    • 어떤 곳은 addrress가 필요하고 어떤 곳은 address 가 필요없는 경우 둘다 만족하기 어려움.

1번 방법은 절대로 쓰지마라.

결론 : DTO를 만들어서 반환시키자.

이번 예제는 회원의 이름만 반환하는 경우로 진행

@Data
@AllArgsConstructor
static class MemberDto{
    private String name;
}

memberDto를 만들어주고

@GetMapping("api/v2/members")
public Result memberV2(){
    List<Member> members = memberService.findMembers();
    //members를 MemberDto로 바꿔준다.
    List<MemberDto> collect = members.stream().map(m
            -> new MemberDto(m.getName())).collect(Collectors.toList());

    return new Result(collect);

}

    @Data
    @AllArgsConstructor
    public class Result<T>{
        private T data;
    }

ArrayList를 반환하는게아닌 Result라는 껍데기 클래스로 반환시켜줌.

제네릭 클래스로 만들어 둠으로써 반환되는 데이터 타입이 DTO 클래스 인것을 명시적으로 나타낼 수있게된다.

  • 이렇게 만들경우 name을 username으로 바꾼다고 스펙이 변하지 않는다.
  • 필요한 것만 노출이 가능해짐.
  • api 스펙이 DTO와 1대1 매칭이 된다.

번외

  • List로 반환하는 경우
@GetMapping("api/v1/members")
public List<Member> membersV1(){
    return memberService.findMembers();

}
  • 이렇게 Array를 넘겨버리는 경우 -> 스펙이 굳어져서 확장이 불가능해진다. -> 유연성이 굳어짐.
  • 따로 감싸서 반환을 통해서 유연성을 높이는게 좋음.
profile
열심히하자
post-custom-banner

0개의 댓글