-
[TIL] 스파르타) 풋살 온라인 팀 프로젝트 진행 (D-1)TIL-sparta 2024. 6. 6. 22:29
학습 키워드: Prisma ORM, Node.js, $queryRaw
JOIN tables of different DB
1) What is it?:
풋살 온라인 프로젝트의 DB는 game_db와 player_db로 나뉘어 있는데, 이를 queryRaw를 이용해 한 번에 각 DB 내 테이블을 불러오는 방법을 알아보고 적용 해보았다.
2) How does it work?:
// 바뀌기 전 ... const inventory = await userPrisma.inventory.findFirst({ where: { inventoryId: inventoryId, }, }); const player = await playerPrisma.player.findUnique({ where: { playerId: inventory.PlayerId, }, }); ...
특정 inventoryId를 가진 인벤토리 항목을 조회하는 라우터 기능의 변경 전 스크립트를 가져왔다. 위와 같이 userPrisma와 playerPrisma 두 개의 PrismaClient를 각각 호출하여 정보를 채워나갔는데, 서로 다른 PrismaClient 객체여서 한 번에 호출할 수 없는 줄 알고 있었으나, raw 쿼리에서 테이블 이름 앞에 DB의 이름을 붙여주면 다른 DB의 테이블을 JOIN 할 수 있다는 사실을 알아서 PrismaClient의 query method 대신 $queryRaw로 raw 쿼리를 작성하기로 했다.
// 바뀐 후 ... const inventory = await userPrisma.$queryRaw` SELECT inv.*, pl.* FROM game_db.Inventory inv JOIN player_db.Player pl ON inv.player_id=pl.player_id WHERE inv.inventory_id=${inventoryId} `; ...
주의할 점은 $queryRaw로 반환되는 데이터는 배열로 들어온다는 점, 그리고 각 row의 column 이름이 DB에 실제로 mapping 되어있는 이름으로 반환된다는 점이다. 따라서 key 이름의 일관성을 유지하기 위해서는 wildcard 대신 각 column의 이름과 as를 이용하여 column의 이름을 바꿔줘야한다.
3) Why use it?:
기존에 작성한 스크립트는 두 DB를 각각 access하는 구조로 PrismaClient (userPrisma, playerPrisma) 의 쿼리 method를 반복적으로 사용하고 있었다. 이렇게 하면 DB query를 호출하는 횟 수가 많아져서 네트워크 리소스를 낭비하게 된다. 따라서 raw 쿼리를 이용해 한 번에 해결하는 것이 바람직하다.
--
REFERENCES:
> StackOverflow, "Join between tables in two different databases?", 답변 참고
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 풋살 온라인 프로젝트 종료 - 2부 (ERD 수정해보기) (0) 2024.06.08 [TIL] 풋살 온라인 프로젝트 종료 - 1부 (DB Normalization) (2) 2024.06.07 프로그래머스) 무인도 여행 풀이 (Java) (2) 2024.06.06 [TIL] 프로그래머스) 두 큐 합 같게 만들기 풀이 (Java) (2) 2024.06.04 강의 과제) Windows I/O Model, select, IOCP (수정 필요) (2) 2024.06.03