나만의 작은 도서관

[TIL] 240605 캠프 52일차: Prisma 배열과 객체의 반환 값 판정, Prisma NOT, gte, lte사용법 본문

Today I Learn

[TIL] 240605 캠프 52일차: Prisma 배열과 객체의 반환 값 판정, Prisma NOT, gte, lte사용법

pledge24 2024. 6. 5. 23:43

오늘 배운 내용                                     

Prisma 배열과 객체의 반환 값 판정

Node.js에서 express.js와 prisma를 이용한 API 제작에서 await prisma.XXX와 같은 코드를 자주 사용하게 된다. 그런데 가져오는 반환값이 배열이냐 객체이냐에 따라 if판정이 달라진다. 아래 코드를 보자.

// 구단에 넣을 선수를 인벤토리DB에서 가져옵니다.
const playerInInventory = await userDataClient.user_player.findFirst({
  where: {
    account_id,
    player_id,
  },
});

 

위의 코드를 실행해서 얻은 반환 값을 playerInInventory라는 변수에 저장하고 있다. findFirst메소드이기 때문에 반환값은 객체가 된다. 만약, where절에 해당하는 레코드가 존재하지 않는다면 반환을 어떻게 할까? 빈 객체로 반환을 할까?

아니다. 반환 값은 undefined가 된다. 

이러한 이유로 레코드가 존재하지 않는다면 if문에 playerInInventory을 넣었을 때 false로 취급되어(undefined는 falsy한 값이다)else절로 가거나 if문을 나간다. 그렇다면 아래 코드는 어떨까?

 

// 유저의 구단 정보를 DB에서 가져옵니다.
const club = await userDataClient.user_club.findMany({
  where: { account_id: userId },
});

 

위의 코드를 실행해서 얻은 반환 값을 club이라는 변수에 저장하고 있다. 처음 본 코드와 다르게 findFirst메소드가 아닌, findMany이며 반환값은 여러 객체데이터가 들어있는 배열이 반환된다. 이번에도 레코드가 존재하지 않는다면 어떤 반환값을 가질까? 똑같이 undefined가 반환이 될까? 

아니다. 이번에는 빈 배열[]이 반환이 된다.

 

빈 배열은 falsy하지 않다. 즉, if(!club)을 했을 때, 안에 객체가 존재하든, 존재하지 않든 무조건 true로 취급되어 if문을 들어가지 않는다! 즉, if(!club)과 같이 사용하는 것은 아무런 의미없이 항상 if문에 진입하지 않는다.

 

따라서, 배열을 반환하는 경우 아래와 같이 사용해야한다.

// 이렇게 사용하면 안된다.
if (!club) {
  return res.status(404).json({ message: "구단에 선수가 없습니다." });
}

// 이렇게 사용해야지 올바른 결과를 얻을 수 있다.
if (club.length === 0) {
  return res.status(404).json({ message: "구단에 선수가 없습니다." });
}

Prisma NOT, gte, lte사용법

gte는 greater than equal, lte는 less than equal의 약자로, 각각 이상, 이하를 의미한다. NOT은 사용하면, 해당 조건을 만족하는 레코드를 대상에서 제외한다. 사용하는 방법은 다음과 같다.

// 현재 레이팅 범위에 상대가 있는지 찾는다(당연히 나는 제외).  
    const opponentUserList = await userDataClient.user_info.findMany({
      where: {
        NOT:{  // 내 account_id는 상대에서 제외
          account_id: myAccountId,
        },
        rank_score: {  // rating - ratingRange <= rating <= rating - ratingRange를 범위로 설정
          gte: rating - ratingRange,
          lte: rating + ratingRange,
        },
        have_club: true,
      },
    });

 

 

오늘 한 일                                       

더보기
  • 팀원들 PR 3개(나 포함) 검토 및 merge
  • 게임 매치 플레이 API 제작 완료(기여도 100%)
  • 팀원이 제작한 구단 관련 API 3개 리펙토링 완료
  • 유저 정보 조회 API, 홈페이지 추가
  • 회의 진행 및 팀원들 역할 2차 분배