캐주얼 게임의 핵심 루프를 구성하는 4가지 API — Start, Clear, Continue, Fail의 서버 처리 흐름을 살펴봅니다.
목표를 달성하여 스테이지를 클리어하세요.
유저가 스테이지에 진입할 때 호출됩니다. 로그인 시 생성된 세션을 조회하고, 레디 아이템을 소모한 뒤 플레이 로그와 게임 유저 정보를 생성합니다.
1func (s *GameService) StartGame(ctx context.Context, req StartRequest) (resp *StartResponse, err error) {2 tx, err := s.db.BeginTx(ctx, nil)3 if err != nil {4 return nil, err5 }6 defer func() {7 if err != nil { tx.Rollback() } else { tx.Commit() }8 }()910 session, err := s.repo.GetSessionByUser(ctx, tx, req.UserID)11 if err != nil {12 return nil, err13 }1415 // 라이프 검증 & 소모 (시간제 우선)16 if err := s.lifeService.ConsumeLife(ctx, tx, req.UserID); err != nil {17 return nil, err18 }1920 // 레디 아이템 검증 & 소모21 consumed, err := s.validateAndConsumeItems(ctx, tx, req.UserID, req.ReadyItems)22 if err != nil {23 return nil, err24 }2526 // 플레이 로그 & 유저 스테이지 생성27 if err := s.repo.CreatePlayLog(ctx, tx, session.ID, req.StageID); err != nil {28 return nil, err29 }30 if err := s.repo.CreateUserStage(ctx, tx, req.UserID, req.StageID); err != nil {31 return nil, err32 }3334 return &StartResponse{35 SessionID: session.ID,36 Seed: session.Seed,37 ConsumedItems: consumed,38 }, nil39}