서브컬처 러닝 액션 게임 웹 서버 프로젝트의 전체 규칙 및 컨벤션 문서입니다.
항목
내용
장르
서브컬처 러닝 액션 (쿠키런 스타일)
클라이언트
Unity
서버 언어
C# 15
프레임워크
ASP.NET Core 10
ORM
EF Core 10 (Code First)
DB
PostgreSQL
API 스타일
RESTful
API 문서화
Swagger (Swashbuckle)
테스트
xUnit (단위 + 통합)
형상관리
GitHub (Git Flow)
로깅
Serilog
에러 핸들링
전역 ExceptionMiddleware + Problem Details (RFC 7807)
항목
내용
인증 방식
JWT Bearer (Access Token + Refresh Token)
Refresh Token 저장
PostgreSQL (refresh_tokens 테이블)
비밀번호 암호화
BCrypt (BCrypt.Net-Next)
도메인
설명
auth
회원가입, 로그인, JWT 발급/갱신/폐기
player
플레이어 프로필, 계정 관리
game
러닝 게임 기록 저장, 최고 기록 조회
gacha
가챠 뽑기, 확률 처리, 뽑기 이력
currency
뽑기 재화 조회 및 소모
대상
규칙
예시
클래스 / 인터페이스
PascalCase
PlayerService, IGachaRepository
메서드
PascalCase
GetPlayerById, DrawGachaAsync
프로퍼티
PascalCase
PlayerName, CurrencyAmount
지역 변수 / 파라미터
camelCase
playerId, gachaResult
상수
PascalCase
MaxDrawCount, AccessTokenExpiry
private 필드
_camelCase
_playerRepository, _jwtService
async 메서드
~Async 접미사
GetPlayerAsync, DrawGachaAsync
대상
규칙
예시
요청 DTO
{Action}{Domain}Request
LoginRequest, DrawGachaRequest
응답 DTO
{Action}{Domain}Response
LoginResponse, DrawGachaResponse
기본 경로: /api/v1/{domain}
복수형: /api/v1/players, /api/v1/gacha/draws
케밥케이스: /api/v1/game-records
대상
규칙
예시
테이블명
snake_case 복수형
players, gacha_draws, refresh_tokens
컬럼명
snake_case
created_at, player_id, password_hash
PK (C#)
Id
public long Id { get; private set; }
PK (DB)
id
id BIGSERIAL PRIMARY KEY
FK (C#)
{Entity}Id
PlayerId
FK (DB)
{entity}_id
player_id
src/
├── Controllers/ — HTTP 요청 수신, DTO 바인딩, 응답 반환
├── Services/ — 비즈니스 로직 (Interface + Implementation)
├── Repositories/ — EF Core DB 접근
├── Domain/
│ ├── Entities/ — EF Core 엔티티 (setter private)
│ ├── Enums/ — 열거형 (Rarity, GameResult 등)
│ └── DTOs/ — 요청/응답 DTO
├── Infrastructure/
│ ├── Persistence/ — AppDbContext, EntityTypeConfiguration
│ ├── Security/ — JWT 발급/검증, BCrypt 래퍼
│ └── Extensions/ — DI 등록 확장 메서드
└── Middlewares/ — ExceptionHandlingMiddleware
DTO를 Controller에서 직접 반환 — 래퍼 금지
// GET /api/v1/players/{id}
{
"id" : 1 ,
"username" : " user01" ,
"currencyAmount" : 300
}
실패 (Problem Details — RFC 7807)
{
"type" : " https://tools.ietf.org/html/rfc7807" ,
"title" : " Not Found" ,
"status" : 404 ,
"detail" : " 플레이어를 찾을 수 없습니다."
}
GameException(string message, HttpStatusCode status) 를 직접 사용
서브클래스 생성 금지
전역 ExceptionHandlingMiddleware 에서 일괄 처리 → Problem Details 반환
예외 메시지: 한국어, 마침표 없음
Serilog 로그 메시지: 영어 전용, {} 플레이스홀더 사용
로그에 비밀번호 / 토큰 / 개인정보 포함 금지
브랜치
역할
main
프로덕션 배포본
develop
개발 통합 브랜치
{type}/{kebab-description}
기능 브랜치 (develop에서 분기)
형식: type(scope): 설명
type
용도
add
새 기능 추가
update
기존 기능 수정/개선
fix
버그 수정
refactor
리팩토링
test
테스트 추가/수정
docs
문서 변경
ci/cd
빌드/배포 파이프라인
merge
브랜치 머지
scope: 도메인명 우선 (auth / player / game / gacha / currency) — 전역 변경은 global
설명: 한국어, 마침표 없음, ~한다/~됩니다/~했습니다 어미 금지
add(gacha): 가챠 확률 테이블 엔티티 추가
fix(auth): Refresh Token 만료 검증 오류 수정
refactor(global): 전역 예외 핸들러 개선
항목
내용
프레임워크
xUnit
Mock 라이브러리
Moq 또는 NSubstitute
통합 테스트
WebApplicationFactory + Testcontainers (PostgreSQL)
패턴
Given-When-Then
메서드명
{MethodName}_{Scenario}_{ExpectedResult}
스킬
설명
aspnet-game-arch
ASP.NET Core 레이어 아키텍처 상세 가이드
efcore-guide
EF Core 엔티티 설계, 쿼리, 설정 가이드
jwt-auth
JWT 발급/검증/갱신 구현 가이드
unity-api-design
Unity 클라이언트를 위한 API 설계 가이드
game-security-checklist
게임 서버 보안 점검 체크리스트
game-transaction
재화/가챠/보상 트랜잭션 처리 가이드
test-strategy
단위/통합 테스트 전략 및 작성 가이드
commit
Git 커밋 컨벤션 및 브랜치 자동화
code-review
코드 리뷰 체크리스트 (✓/⚠/✗ 리포트)
migration-guide
EF Core 마이그레이션 절차 가이드
write-pr
PR 제목/본문/라벨 자동 생성
review-pr
PR 리뷰 코멘트 자동 처리
plan-deep-dive
구현 계획 수립 가이드