240915 TIL - 주말에도 멈추지 않는 5조

LIHA·2024년 9월 16일
0

내일배움캠프

목록 보기
51/117
post-thumbnail

뼈대잡기

내 담당파트 : 캐시구매, 상점 상품구매, 선수 1회뽑기, 선수 다회뽑기, 구매히스토리

캐시 구매 기능 (입문 2-9~2-19, 숙련 2-5)

  • 결제 연동을 하는 것이 아니라 단순 API 호출 시 일정량의 캐시 구매할 수 있게. 코어기능 아니니 최대한 단순히 마무리!
    -> 얘는 아이템 시뮬레이터의 돈복사 API 쓰면 될것임
    근데 이거 21억 넘어가면 값 이상하게 입력되는거 같아서 MAX_VALUE 해봐야 할거 같다

-> 완료!

상점 상품구매

상점 id랑 가챠상품 id랑 이어져있어야 한다

선수 뽑기 기능 (숙련 2-7~2-8)

  • 뽑기 1번에 일정량의 캐시가 소비되어야 할것.
  • 선수를 뽑으려면 선수 데이터가 DB에 준비되어 있어야 할것
  1. Player테이블에서 playerid를 기반으로 랜덤으로 뽑아와야 한다.
    -> findMany로 뽑아오는건 알겠다. 게임 아이템 구매하려면 아이템 리스트에 있는지부터 봐야하니까.
    -> 아이템 구매로직 + 인벤토리에 넣기 로직 필요
    랜덤으로 어떻게 해야하지?
  2. 뽑기횟수는 Gacha테이블에 입력된 횟수대로 돌아가는 로직이 필요하고,
  3. 가챠가 완료되고 나면 얘는 Roster테이블에 저장되어야 한다.
  • 릴레이션이 없는 곳에서 참조하려면 그냥 find로 가져오면 된다고 한다.

풋살 프로젝트

DB스키마 회의 - Game Record, Result 테이블

matchId에서 승자, 패자, 승자점수, 패자점수, 승자슈팅횟수, 패자슈팅횟수, 승자수비횟수, 패자수비횟수
굳이 Account와 이어줄 필요가 있을까? 에 대한 것

상점
프로덕트의 DB에 저장을 할지

result는 여러개 생길 수 있고 gameId는 중복으로 넣을 수 있다?
가챠는 범위를 주고 그 안에서 랜덤으로 추출한다. 가 공통적이다.

범위만 주면 그 안에서 랜덤으로 뽑아주니까, 우리는 범위만 주면 된다.
배열 형태를 주되, 시작과 끝만 정해주면 된다. 그건 가챠테이블에 넣어줘도 되고, Players에서 참조해와도 되고, 그냥 로직으로 정해줘도 되고.

뽑기 횟수까지 DB에 넣을 필요는 없지 않을까? -> DB에 횟수가 있으면 로직 하나로 두개를 만들 수 있다.

Product 테이블과 Gacha 테이블, 나누는 이유와 관계

  • 일단 프로덕트랑 가챠를 나누는 건, 프로덕트에는 가챠만 올 수 있는게 아니기 때문에 가챠는 따로 있는게 맞다.
  • 그렇다면 Product와 Gacha는 어떤 관계일까?
    이 관계의 주인은 Product다. 상품에서 상점이 사라지면 가챠가 아무리 많아도 팔릴 수 없다.
    N : M이다 여러 상품에 여러 종류의 가챠가 올수 있으니
    그리고 가챠가 아닌 다른 상품도 product에 들어가서 팔수 있으니까

N : M이면 아이디가 중복으로 들어갈 수 있다? 이 말을 이해해보자.
-> 여러 사람이 여러 배민 주문을 할 수 있다. 여러 게시글에 여러 댓글이 달릴 수 있다

서리하 - 치킨
서리하 - 피자
김개발 - 치킨
김개발 - 커피

게시글1 - 재밌어요
게시글1 - 도움됐어요 감사합니다
게시글2 - 이건 재미없어요
게시글2 - 저는 재밌는데 왜그러세요

동혁님의 조언: 그냥 필요한 것만 만들면 되는거다! 라는 생각을 하자. 단어에 너무 사로잡히지 말자. 필요한걸 저장할거면 테이블이 필요한거다.

내가 헷갈리는 것 - 1:1, 1:N, N:M을 정의하는 기준

1:1인 경우 - 닉네임 생각하면 된다. 유니크 키로 종속된다. 이 닉네임도 주인 나 하나, 나도 닉네임은 얘 하나.
1:N인 경우 - 나는 한명이지만 내 블로그 글은 여러개. 하지만 내 블로그 글은 여러 주인을 가질 수 없지!
N:M인 경우 - 여러 게시글에 여러 코멘트. 코멘트도 여러 주인을 가질 수 있고 게시글도 여러 코멘트를 가질 수 있다.


아이템 시뮬레이터 도전기능

구매로직 구현 성공 - 엔젤 유정 튜터님의 도움

// 만세! 잘돌아간다. 이제 툴팁을 어떻게 끼워넣을까?
// 유정튜터님의 팁 - 아이템코드를 싹 모아서 게임db로 findMany를 하면 된다

router.get('/inventory/:characterId', authMiddleware, async (req, res, next) => {
    const { characterId }  = req.params;

    const findCharacter = await userDataClient.characters.findUnique({
        where : { characterId : +characterId }, 
})
if(!findCharacter)
    return res.status(404).json({message : "올바른 캐릭터가 아닙니다"})

const findInventory = await userDataClient.inventory.findFirst({
    where : { characterId : +findCharacter.characterId }
})

if(!findInventory)
    return res.status(404).json({message : "인벤토리가 잘못 된 것 같습니다"})

const findInventoryItem = await userDataClient.inventoryItem.findMany({
    where : { inventoryId : +findInventory.inventoryId }
})

// const findItemInfo = await gameDataClient.items.findMany({
//     where : { itemCode : }
// })

return res.status(200).json({ inventoryItem : findInventoryItem })
})

아니, 아예 분리된 게임DB쪽에서 아이템이름과 툴팁은 어떻게 찾아요?

where절에 in을 가르쳐준 구원의 블로그

  • 결과적으로 해법은 다음과 같았다.
    1. 유저DB에 있는 인벤토리 아이템을 findMany로 찾아서, map으로 itemCode만 싹 끌어온 배열을 생성.
      -> (이것도 findInventoryItems[0].itemCode 하면 낱개로는 나오는데, 여러개로 불어올 방법을 몰라서 모던 자바스크립트 보면서 엄청 끙끙댔다)
    2. 그 itemCode로 게임DB 조회구문의 where절에 걸어주는데, where절에 in을 걸어 해당 조건에 부합하는 애들을 다 가져와준다!

-> 유정 튜터님의 구원 덕에 아이템 구매 로직은 완성했는데, 여기에 아이템DB에 있는 툴팁을 끼워넣고 싶었다.
근데 나는 승현 튜터님의 해설영상을 보고 DB를 두개로 분리해버린 상태라, 두 DB가 만날 수가 없었는데...
이제 툴팁을 어떻게 끼워넣을까? 를 끙끙대며 고민하다 유정 튜터님께 질문을 드렸다.

  • 유정튜터님의 말씀: 아이템코드를 싹 모아서 게임db로 findMany를 하면 된다!
    -> 굉장히 핵심 키워드를 던져주셨는데, JS 문법 젬병인 나는 어렴풋이만 알겠고 어떻게 하지?! 에서 멘붕이었다.
  const findInventoryItems = await userDataClient.inventoryItem.findMany({
    where: { inventoryId: +findInventory.inventoryId },
    select: {
      inventoryItemId: true,
      itemCode: true,
      itemCount: true,
    },
  });

  const itemCodes = findInventoryItems.map((item) => item.itemCode);
  // 게임db에서 이름과 툴팁 찾기
  const findItemInfo = await gameDataClient.items.findMany({
    where: {
      itemCode: {
        in: itemCodes,
      },
    },
    select: {
      itemName: true,
      tooltip: true,
    },
  });

따로따로 나오긴 하지만 어찌됐든 나온다.

findMany도 where절을 걸 수 있다 -> '내가 정한 조건에 부합하는 여러개를 보여줘'임!

처음엔 findMany에 where절 안 걸어줘도 나오길래 지금까지의 고생이 헛된 줄 알았다.
(findMany에는 where절 안걸어도 나오긴 나온다. 근데 원치 않게 모든 데이터가 다 나온다)
그러나 나는 인벤토리에 가진 아이템에 대한 이름과 툴팁만 보고 싶은거니까, 유정튜터님 말씀대로 itemCode를 기반으로 where절을 거는 게 맞다!


잡담

5조 이제 집에가염

어떻게 일요일에도 12시간을 작업하고 공부할할수가 있어염 집에가염

profile
갑자기 왜 춤춰?

0개의 댓글