Nest.js

NestJS에서 쿼리빌더의 결과 객체들을 병합하는 방법 with es-toolkit

Dev갱이 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