본문 바로가기
PROJECT/개인 미니 프로젝트

ORPG 프로그램 만들기! - DDD 편

by HR_J 2024. 5. 8.

어제 포스트에선 DDD 작성법, 그리고 왜 작성해야하는지에 대해 적었다면..

오늘이야말로, 내가 배운것을 진정으로 복습하는 시간!

그럼 바로 시작합니다.


프로젝트에 대한 간략한 설명

간단한 ORPG용 홈페이지.

게임을 진행하기 위한 방을 만들고 그 안에서 게임을 진행할 수 있다.

참고 홈페이지 : roll 20 (https://roll20.net/)

 

순서

- Actor

- DDD 작성

- External System

- Data 정의

 

Actor 정의

  • 로그인 사용자(User)
    • GM → 게임방을 만든 사람
    • PL→ 게임방에 참여한 사람
  • 비로그인 사용자
    • P → 게임방에 참여한 사람

 

DDD 작성

User Model

사용자와 관련된 이벤트들(User, P)

  • 로그인 : 로그인됨
  • 프로필 수정 : 프로필 입력됨
  • 로그아웃 : 로그아웃됨
  • 회원가입 : 회원가입됨 → 회원이 아니여도 사용할 수 있음, 다만 저장하기가 불가능하다.

 

Friend Model

친구 관리와 관련된 이벤트들 (User)

  • 친구 추가 : 친구 추가됨 → 30명이 넘을 경우 더이상 추가 안됨
  • 친구 삭제 : 친구 삭제됨 → 쌍방 삭제됨

 

Game Aggregate

게임 진행과 관련된 이벤트들 (User)

  • 게임방 생성 : 게임방 생성됨
  • 게임방 삭제 : 게임방 삭제됨
  • 게임 저장 : 게임 내용 저장됨
  • 게임 설정 수정 : 게임 설정 변경/수정됨

 

게임 설정과 관련된 이벤트들(GM)

  • 소리 설정 : 게임의 소리 설정됨
    • 유튜브 링크
    • mp3파일
  • 배경 이미지 : 게임의 배경 이미지 설정됨
    • 이미지 url
    • 이미지 파일
  • 플레이어 초대
    • 친구 초대로 초대됨 → 바로 게임방 주소로 연결된다.
    • 링크로 초대됨 → 바로 게임방 주소로 연결된다.
    • 이메일로 초대됨 → 이메일을 통해 링크가 제공된다.
  • 플레이어 강퇴 : 지정 플레이어 강퇴됨

 

게임 진행과 관련된 이벤트들(User, P)

로그인 유저 → PL / P

  • DM 전송 : GM에게 개인 메시지 전송됨
  • 캐릭터 시트 설정 : 캐릭터 시트 작성됨. (캐릭터 스테이터스, 주사위값, 백그라운드에 대한 정보 저장)
  • 캐릭터 등록 : 플레이할 캐릭터를 선택해 게임방에 등록함
  • 텍스트 입력 : 텍스트로 진행되는 게임인 만큼, 텍스트 창에 명령어 등 입력함

 

로그인 유저 → GM

GM은 기본적으로 PL의 이벤트들을 다 진행할 수 있다.

  • DM 전송 : 플레이어에게 개인 메시지 전송됨
  • 핸드아웃 설정 : 플레이어에게 제공될 핸드아웃 작성및 수정됨. *핸드아웃 : 추리게임 같은경우 보면 제공되는 사건 정보들, 오브젝트들 등의 설명.( 단순 줄글로 설명하기엔 무리인 것들)
  • 캐릭터 등록 : NPC 등의 캐릭터를 생성해 게임방에 등록함.
  • 캐릭터 전환 : NPC 등의 캐릭터 등으로 대사를 입력 가능함.
  • 텍스트 입력 : 텍스트 창에 명령어 등 입력

 

External System 표시

사운드, 이미지 등의 파일을 관리하는 방법 → 유튜브 URL, 사진 URL로도 등록 가능하도록 한다면, external system이 필요하다.

 

Data 정의

User id
pw
email
nickname
FriendList
unknown User name
Friend id
nickname
Room id
title
description(null?)
max player cnt
now player cnt
PlayerList (id, nickname, name)
BgmList( id, url, mp3)
ImgList(id, url, png)
TextMessage( name, id, time, note)

 


DDD를 작성하면서 생긴 의문들과 받은 피드백.

(이건 혹시 나랑 비슷한 생각을 하고 있는 사람들이 있을까봐 남겨둔다!)

 

Q1 도메인 이벤트를 먼저 설정하고 난 뒤에 커맨드를 정하는 이유가 굳이 있는가?

A. 도메인 이벤트가 DDD의 핵심이기 때문에 우선적으로 작성한다.

커맨드는 단순히 요청을 하는 역할을 한다. Actor가 원하는 행동을 말그대로 실현해주는 명령어(커맨드)의 역할!

 

Q2 순서에 상관은 크게 없다면, 이벤트는 왜 과거형 시제로 작성을 하는가?

A. 이벤트는 이미 벌어진 일 이후 순차적으로 어떠한 일들이 일어나는지를 확인하기 위해 과거형 시제로 작성한다.

 

Q3 데이터를 분류할때, model 혹은 Aggregate로 나누어서 작성하면 된다고 생각했는데, 지금 디자인해둔 상태로는 뭔가 더 복잡한 형태인것 같아서 고민이다… DB에 저장될 형태로 생각하고 정해야하는가?

A. 일단 DB 형태는 DDD 단계에서는 고려하지 말것. 개발은 작은 것부터 시작해서 점점 기능을 붙여나가며 개발하는 것이 더 좋다. DDD 단계에서는 당장 어떠한것들이 필요한지에 대한 나열을 우선으로 생각해서 작성해보자.


내일은 작성해둔 DDD를 기반으로 REST API를 작성하는 방법을 공부하고, 실제로 작성을 해볼 생각이다.