게임 플로우

캐주얼 게임의 핵심 루프를 구성하는 4가지 API — Start, Clear, Continue, Fail의 서버 처리 흐름을 살펴봅니다.

남은 이동20
🧩

준비 완료!

목표를 달성하여 스테이지를 클리어하세요.

핵심 정리

  • 게임 세션은 로그인 시 생성되며, 시드(seed)값을 포함합니다.
  • 4가지 API(Start, Clear, Continue, Fail)가 게임 루프를 구성합니다.
  • Start → Play → Clear 또는 Fail 순서로 진행되며, Continue는 실패 직전 추가 기회를 제공합니다.
  • 대부분의 API는 유저 상태, 재화, 이벤트(퀘스트·시즌 패스) 데이터를 함께 처리합니다.
  • 서버는 클라이언트의 요청을 검증한 뒤 DB에 반영하고, 결과를 응답합니다.

1. 게임 스타트 API

유저가 스테이지에 진입할 때 호출됩니다. 로그인 시 생성된 세션을 조회하고, 레디 아이템을 소모한 뒤 플레이 로그와 게임 유저 정보를 생성합니다.

ClientGame ServerDatabasePOST /api/game/start { stageId, readyItems }SELECT game_session (userId)session { seed }SELECT user_life (userId)userLife { current, timedLife }라이프 검증 & 소모 (시간제 우선)레디 아이템 검증 & 소모INSERT play_log, user_stage; UPDATE user_itemsOK200 { sessionId, seed, consumedItems }12345678
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, err
5 }
6 defer func() {
7 if err != nil { tx.Rollback() } else { tx.Commit() }
8 }()
9
10 session, err := s.repo.GetSessionByUser(ctx, tx, req.UserID)
11 if err != nil {
12 return nil, err
13 }
14
15 // 라이프 검증 & 소모 (시간제 우선)
16 if err := s.lifeService.ConsumeLife(ctx, tx, req.UserID); err != nil {
17 return nil, err
18 }
19
20 // 레디 아이템 검증 & 소모
21 consumed, err := s.validateAndConsumeItems(ctx, tx, req.UserID, req.ReadyItems)
22 if err != nil {
23 return nil, err
24 }
25
26 // 플레이 로그 & 유저 스테이지 생성
27 if err := s.repo.CreatePlayLog(ctx, tx, session.ID, req.StageID); err != nil {
28 return nil, err
29 }
30 if err := s.repo.CreateUserStage(ctx, tx, req.UserID, req.StageID); err != nil {
31 return nil, err
32 }
33
34 return &StartResponse{
35 SessionID: session.ID,
36 Seed: session.Seed,
37 ConsumedItems: consumed,
38 }, nil
39}