[TIL] 23.01.26 Result 클래스로 한번 더 감싸서 dto 내보내기(확장성)

hyewon jeong·2023년 1월 26일
0

TIL

목록 보기
76/138

Array는 오브젝트 같은게 쭉쭉와야 되는데
만약에

[    "count" : 4 // 넣게 되면 json스펙이 깨져버림 
    {
        "id": 4,
        "title": "뽀통령",
        "username": "woniwoni",
        "content": "뽀로로로",
        "comments": []
    },
    {
        "id": 3,
        "title": "뽀통령",
        "username": "woniwoni",
        "content": "뽀로로로",
        "comments": []
    },
    {
      "data":[   
      [    
    {
        "id": 4,
        "title": "뽀통령",
        "username": "woniwoni",
        "content": "뽀로로로",
        "comments": []
    },
    {
        "id": 3,
        "title": "뽀통령",
        "username": "woniwoni",
        "content": "뽀로로로",
        "comments": []
    },
  ] 
  ]
    
    /**
     * 조회 V1: 응답 값으로 엔티티를 직접 외부에 노출한다.
     * 문제점
     * - 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다.
     *   - 기본적으로 엔티티의 모든 값이 노출된다.
     *   - 응답 스펙을 맞추기 위해 로직이 추가된다. (@JsonIgnore, 별도의 뷰 로직 등등)
     *   - 실무에서는 같은 엔티티에 대해 API가 용도에 따라 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 프레젠테이션 응답 로직을 담기는 어렵다.
     * - 엔티티가 변경되면 API 스펙이 변한다.
     * - 추가로 컬렉션을 직접 반환하면 항후 API 스펙을 변경하기 어렵다.(별도의 Result 클래스 생성으로 해결)
     * 결론
     * - API 응답 스펙에 맞추어 별도의 DTO를 반환한다.
     */
    //조회 V1: 안 좋은 버전, 모든 엔티티가 노출, @JsonIgnore -> 이건 정말 최악, api가 이거 하나인가! 화면에 종속적이지 마라!
    @GetMapping("/api/v1/members")
    public List<Member> membersV1() {
        return memberService.findMembers();
    }

    /**
     * 조회 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()))
                .collect(Collectors.toList());

        return new Result(collect);
    }

이랬을 경우 다른 기능들도 주입 할 수 있는 확장성이 생기는데
배열로 바로 받아버리면 확장성이 굳혀져 확장 할 수 없다.

Object Type으로 반환하는 것이기 때문에
Result 라는 껍데기를 씌워줄것이고
필드의 값은 이 리스트[] 가 나갈 것임 ("data":[])
-> 이렇게 한번 감싸줘야함 ( { } 으로 반환되어 확장성 생김)
그렇지 않으면. 리스트를 콜렉션이라 바로 내면
제이슨 배열 타입으로 나가버리기 때문이다.

💡 실전 Refactoring

Result 클래스로 한번 더 감싸서 dto 내보내기


확장성 용이해짐

AppleFarm 프로젝트 피드백

1

2

3

profile
개발자꿈나무

0개의 댓글