부트캠프

[WIL] 이번주에 마주했던 문제들 (typeORM, socket.io, DB index)

반응형
1. TypeORM에 queryBuilder 적용하기

이전에 ORM에 대해서 글을 쓴 적이 있습니다. 개념적으로 이해했지만 프로젝트에 적용을 하는 것은 또 다른 문제였기에 만났던 문제들을 적어보고자 합니다.

 

현재 NestJS와 typeorm을 사용하여 프로젝트를 진행 중입니다. DB에서 데이터를 뽑아올 일이 굉장히 잦은데 

처음엔 queryBuilber를 사용하지 않고 sequelize와 같은 문법으로 사용하여 데이터를 뽑아오다가 좀 더 복잡한 쿼리가 필요하여 queryBuilder를 사용하여 보았습니다. 

 

제가 예시를 들 부분은 feed(게시글) 조회 부분입니다. 현재 지역에서 발생한 피드를 클라이언트에 보내줘야하는데 각 피드의 작성자에 대한 정보를 응답해야합니다. 단순히 join하는 경우에는 문제가 되지 않았지만 유저의 비밀번호가 response부분에 포함되어 보내지는 문제가 있어서 비밀번호를 제외하고 보내고자 queryBuilder를 적용하였습니다.

 

기존에 쓰던 방식은 다음과 같습니다.

const feeds = await Feed.find({
  where: {
    deletedAt: null,
  },
  relations: ['player', 'likes', 'comments'],
});

feed정보를 가져오고 player 테이블과 likes 테이블 comments 테이블을 join 해서 가져옵니다.

이 경우 player에 유저의 비밀번호가 담기게 됩니다.

 

따라서 다음과 같이 변경하였습니다.

 

  const feeds = await Feed.createQueryBuilder('feed')
      .select([
        'feed',
        'player.id',
        'player.email',
        'player.nickname',
        'player.profileImg',
      ])
      .where({ deletedAt: null })
      .leftJoin('feed.player', 'player')
      .leftJoinAndSelect('feed.comments', 'comment')
      .leftJoinAndSelect('feed.likes', 'likes')
      .getMany();

leftJoinAndSelect 첫번째 인자는 조인된테이블 명이고 두번째 인자는 조인된 테이블의 alias입니다.

 

select 안에 원하는 정보만 담아서 보내시면 됩니다.

 

 

2. NestJS React socket 적용하기

NestJS React로 채팅 서비스를 구현하는 중입니다. 처음에는 NestJS만 만들어봤지만 포스트맨으로만 테스트를 하는 것보다 직접 클라이언트를 구현하여 테스트하는 것이 더 확실할 것이라 생각하여 React를 사용해 클라이언트를 만들고 있습니다.

socket을 직접 구현하는 것은 처음이라서 헤매는 부분이 많았습니다.

 

5/14 에 했던 기술 멘토링에서 센드버드나 파이어베이스를 사용한 라이브러리를 고려해보라는 조언을 주셨습니다. 하지만 비용문제도 그렇고 제가 서버를 구현하는 부분의 원리를 파악하고 직접 작성하고 싶어서 socket.io로 직접 구현하는 것을 선택하였습니다.

 

- websocket vs socket.io

채팅서비스를 구현하는데 있어서 두가지 라이브러리를 고려했습니다. socket.io가 websocket보다 지원하는 브라우져가 많아서 socket.io를 선택하였습니다.

 

 

 

3. DB index 설정

player를 검색시 id와 email이 유니크한 값이라 어떤 것으로 검색해도 값은 같겠지만 더 효율적인 방법을 찾고자 했습니다.

id값이 auto_increment로 설정되어있기 때문에 당연히 id 값으로 설정하는 것이 더 성능을 높일 수 있는 방법이라고 생각했습니다.

하지만 검색 결과 index를 설정하지 않으면 어느 칼럼으로 검색하든 상관없다고 합니다.

 

index검색은 B-Tree를 사용하는데 B-Tree에 대해서는 나중에 더 자세히 포스팅 해보겠습니다.

 

추가) PK를 설정하면 index가 자동으로 설정이 됩니다!!

 

반응형