uju's Tech

[Node.js/Sequelize] group by를 이용하여 상태별로 count 출력 - 개발 회고 본문

Node

[Node.js/Sequelize] group by를 이용하여 상태별로 count 출력 - 개발 회고

ujusy 2020. 7. 16. 00:52

<본 포스팅은공부목적으로 작성되었습니다. 혹시 틀린 부분이 있거나 문제가 되는 부분이 있다면 답글 달아주세요!>

 

개발 진행 중 1 to many의 관계를 갖는 두 db에서 동시에 데이터를 가져와야 하는 일이 발생하였다.

 

그냥 join을 사용하면 되지 않아? 라는 생각이 떠올라 sequelize의 include를 사용하여 개발을 진행하였으나 원하는 결과대로 출력되지 않았다.

 

현재 상황을 피드백해보면 creator 테이블에서 전체 데이터를 뽑아오고 emoticonPack 테이블에서 status 을 종류별 개수로 뽑아와야한다.

status 칼럼은 3가지 enum으로 할당되어 있어 해당 creator가 어떠한 status를 가지고 있는지 각각 개수를 보여주어야한다. 

 

처음에 시도했던 것은 join과 group by 를 이용하는 것이었다. 

creators = await Creator.findAll({
      attributes: {
        creatorsQueryOption,
        [sequelize.fn('count', sequelize.col('status'))]],
      },
      include: [{
        model: EmoticonPack, //join할 테이블 명
        attributes: [],
        group: ['status'],
      }],
      group: ['userId'],
    });

결론을 말하자면 이렇게 하면 안된다.

(사실 sequelize 공식 문서가 그렇게 친절하지 않아 어떠한 요소가 있는지만 살펴보고 구현은 직접 해보면서 익혀나가고 있다.

설명하는게 틀릴 수도 있습니다..ㅜ 참고만 해주세요)

 

먼저 저렇게 구현을 해준 이유는 사용자 정보를 가져올 때 그 사용자의 이모티콘 상태를 보고싶은 것이기 때문에 userId로 그룹핑해주고 상태를 뽑아올 때 상태를 명시해주지 않고 저절로 명시해주고 싶었다.

치명적인 문제는.. 어떠한 사용자 인지 알고 가져올 것이 명시가 안되어있다. 

또한, group by가 status에는 작동하지 않는다. 


그러면 어떻게 해야할까??

  

따로 데이터를 구해주고 creator 에 status 개수를 각각 붙여주었다.

코드를 보자.

let data;
    try {
      status = await EmoticonPack.findAll({
        attributes: [
          'status',
          [db.sequelize.fn('count', db.sequelize.col('status')), 'count'],
        ],
        where: {
          creatorUserId,
        },
        group: ['status'],
      });
    } catch (e) {
      throw new HttpInternalServerError(Errors.SERVER.UNEXPECTED_ERROR, e);
    }
    data = creator.dataValues;
    for (let i = 0; i < status.length; i += 1) {
      data[status[i].status] = status[i].dataValues.count;
    }
  }

위 코드는 status를 group by를 이용해 3개의 각 status의 종류가 각각 분류되도록 해주었다.

그리고 앞서 가져온 creator 데이터에서 dataValues부분을 추출하도록 한다.

추출한 dataValues에 status의 dataValue의 count부분을 반복문을 이용해서 추가해준다.

 

이번 개발 회고도 작성하고 보니 아주 간단한 문제 처럼보인다.ㅎ

 

하지만 join과 group by를 함께 사용해 보려고 고민했던 과정에서 sequelize에 대한 이해를 높일 수 있었고

1 to many 관계를 더 잘 이해하는 계기가 되었다.

Comments