ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NestJS에서 쿼리빌더의 결과 객체들을 병합하는 방법 with es-toolkit
    Nest.js 2024. 10. 21. 14:13
    728x90
    es-toolkit이란?
    toss에서 만들 오픈소스 라이브러리로 lodash와 비교 했을때 es-toolkit은 같은 함수 기준 최대 97% 작은 번들 사이즈를 제공하며, 2~3배 빠른 속도로 동작한다고 설명에 나와있다. 안 쓸이유가 없다.

     

    [
      {
    	groupId: '410544f1-404e-49d7-854a-4408e38af940',
    	groupName: 'korean',
    	groupDescription: 'korean',
    	groupCoverImage: null,
    	feedId: '6bdd5a93-296d-4979-a3cd-7d77fd6e5826',
    	contents: '',
    	isPublic: true,
    	isVisibleToFollowers: false,
    	memberId: '410b7202-660a-4423-a6c3-6377857241cc',
    	username: '',
    	profileImage: '',
     	email: '',
    	myLike: false,
    	sumLike: '0',
    	sumComment: '0'
      },
      {
    	groupId: '75aca3da-1dac-48ef-84b8-cdf1be8fe37d',
    	groupName: 'ㅂㅈㄷㅂ',
    	groupDescription: 'ㅂㅈㄷㅂㅈㄷ',
    	groupCoverImage: '',
    	feedId: '40ac4183-13a1-4fb3-8770-c63578bde09b',
    	contents: '쿠버네티스',
    	isPublic: true,
    	isVisibleToFollowers: false,
    	memberId: '410b7202-660a-4423-a6c3-6377857241cc',
    	username: '',
    	profileImage: '',
    	email: '',
    	myLike: true,
    	sumLike: '2',
    	sumComment: '5'
      }
    ]

     

    날쿼리의 결과를 꽤 오랜만에 보는것 같다.
    ORM이 얼마나 고마운지 새삼 깨닫게 된다. 자동으로 객체들을 병합 해주니 얼마나 고마운 일인가!

     

    • 요구 사항이 그룹별로 그룹에 해당하는 피드들을 추출하는 그룹화 작업이 필요하다.

    interface.ts

     

    reduce를 활용해 그룹별로 피드를 그룹화하는 작업을 한후 Object.values를 통해서 객체로 반환 해주었다.

     

    {
                "groupId": "410544f1-404e-49d7-854a-4408e38af940",
                "groupName": "korean",
                "groupDescription": "korean",
                "groupCoverImage": null,
                "feeds": [
                    {
                        "feedId": "6bdd5a93-296d-4979-a3cd-7d77fd6e5826",
                        "contents": "",
                        "isPublic": true,
                        "isVisibleToFollowers": false,
                        "memberId": "410b7202-660a-4423-a6c3-6377857241cc",
                        "username": "",
                        "profileImage": "",
                        "email": "ㅁㄴㅇ",
                        "myLike": false,
                        "sumLike": "0",
                        "sumComment": "0"
                    }
                ]
     },
    {
        "groupId": "75aca3da-1dac-48ef-84b8-cdf1be8fe37d",
        "groupName": "ㅈㅈ",
        "groupDescription": "ㅂㅂ",
        "groupCoverImage": "",
        "feeds": [
            {
                "feedId": "40ac4183-13a1-4fb3-8770-c63578bde09b",
                "contents": "쿠버네티스",
                "isPublic": true,
                "isVisibleToFollowers": false,
                "memberId": "410b7202-660a-4423-a6c3-6377857241cc",
                "username": "",
                "profileImage": "",
                "email": "",
                "myLike": true,
                "sumLike": "2",
                "sumComment": "5"
            }
        ]
    }

     

    es-toolkit `groupBy` 사용

    1. feed결과의 groupId를 기준으로 groupBy를 통해서 그룹화 해준다.
    2. 그룹화된 object를 Object.entries를 통해서 feeds에 특정 프로퍼티들을 omit을 통해 제외한후 결과값을 완성 해준다.

    느낀점

    es-toolkit을 사용해서 그룹화 로직을 작성하면 더 좋을것 같았는데 생각보다 의외다. 코드가 엄청 간결해지거나 그럴줄 알았으나 거의 비슷한것 같다. 물론 내가 아직 es-toolkit을 잘 활용 하지 못해서 그럴 수 도 있다. 근데 아무리 찾아봐도 groupBy를 할때 chain 함수를 사용해서 한줄로 정리하거나 그런 방법은 찾을 수 없었다.

     

    처음에 reduce를 활용하여 그룹핑 하는 방법이 더 좋아보인다...

     

    Reference

    - ( https://es-toolkit.slash.page/ko/reference/array/groupBy.html#groupby )

    728x90
Designed by Tistory.