20세기 말. 한국 근대사를 재조명해 역사의식을 키우기 위해 텀블벅 후원 준비중인 기능성 게임
1인 개발로 텀블벅 후원을 통해 출시할 목적으로 진행했지만, 현재 연출과 도트그래픽의 어려움으로 잠정 중단한 상태
- 사용자 데이터 관리, 텀블벅 후원 상품 제공 등을 위해 Flask 웹서버를 구현하면서 시작
- 이후 모놀리식 구조에서 확장성의 한계를 느껴 MSA 마이그레이션을 시도
프로젝트 후기
처음으로 MSA 프로젝트를 진행하면서 Hexagonal Architecture를 도입해 외부 라이브러리 사용에 대한 유연한 대응을 고민했다.
Apache Kafka와 java.util.concurrent
의 CountDownLatch를 이용해서 각 마이크로 서비스간의 통신을 구현했다.
그 외에도 Spring AOP를 이용한 서비스 로깅, 책임 분리 원칙(SRP)를 위한 커스텀 어노테이션, javax.validation
을 이용한 Command 검증 등 새로운 기술들을 많이 시도해볼 수 있는 경험이 되었다.
📌 MSA 환경에서 트랜잭션의 Rollback은 복잡하고 리스크가 큰 작업이라 유연한 대응이라는 목적에 주객전도 된다고 생각함
가능하면 정석적인 트랜잭션의 구현을 최대한 피하거나, 기교로 해결하는게 좋다고 생각해 설계 과정에 많은 고민을 함
서비스간의 연계가 이뤄지는 대부분의 기능을 온전히 조회를 목적으로 하도록 하위 도메인별로 설계했기에, 따로 트랜잭션의 Rollback에 대한 고려를 하지 않음
각 모듈별 통신은 비동기적으로 이루어지도록 하기 위해서 Kafka를 이용해서 구현
Kafka IPC의 오류나 특정 서비스의 장애 상황 등 으로 해당 기능 (Business-service의 친구 목록, 동료 목록 조회)이 작동하지 않아도 서비스에 지장가지 않도록 구성
-
Github Action을 이용한 CI/CD 파이프라인 구축
- AWS ECR 이미지 빌드
- Helm Repository 업데이트
- Argo 배포 자동화로 Kubernetes 환경에서 운영 (Canary Deployment)
-
Bounded Context 설계를 통한 마이크로 서비스 분해
- 기술 블로그
- Logging을 위해 Spring AOP를 활용한 공통 모듈과 마이크로 서비스 추가
-
Kafka를 이용한 각 마이크로 서비스간의 통신 구현
- CountDownLatchManager에서 countDownLatch, 받아온 데이터를 각각 관리
- 다른 마이크로 서비스로 데이터를 요청할때 countDownLatch 설정하고 await()
- Kafka를 통해 데이터를 받아오면 읽어서 비즈니스 로직 진행
-
로그인과 회원가입
- Google, 카카오, 네이버 OAuth2와 Spring Security를 이용한 로그인 기능
-
재화 시스템
- 게임중 얻는 아이템 중에서 재화 시스템을 도입해 서버에서 환전
- 환전이 활발하게 이루어지는 재화는 환율이 낮아지고, 반대 경우는 높아지도록 로직을 구성
-
시스템 공지사항
- 공지사항은 관리자만 작성, 수정 가능
- 사용자는 주기적으로 확인하면서 신규 공지사항 등록시 알람 표시
-
게임 데이터 관리
- 사용자의 게임 데이터와 진행한 시나리오를 관리
- 로그인시 불러오기, 주기적인 저장
- 게임 옵션은 클라이언트에서 관리
- 사용자의 게임 데이터와 진행한 시나리오를 관리
-
Redis Map 자료구조를 이용한 환율 시스템
- 서비스 내에서 이용되는 여러 재화(마재은, 청은, 엔화, 원화 등)에 대한 환율 시스템
- 해당 재화를 사용시 서버에서 관리하는 전체 환율이 변동
- 사용량이 많은 재화의 환율은 감소, 반대의 경우 증가하는 간단한 공식
-
친구 시스템
- 스테이지 참가 이전에 함께 데려갈 동료 리스트를 랜덤으로 서버에서 추출
- 스테이지 종료 이후 친구 추가 여부를 묻고, 친구 추가를 하면 친구신청대기 상태
- 상대방이 수락하면 상호간 친구로 등록되어서 함께 데려갈 동료 리스트에 우선적으로 표시
- 친구 삭제 버튼을 통해 삭제