cmod.ify

[Technical Review] 말랑이 메이커 #1: AWS DynamoDB 기반의 서버리스 카카오톡 육성 시뮬레이션 개발기 본문

Project

[Technical Review] 말랑이 메이커 #1: AWS DynamoDB 기반의 서버리스 카카오톡 육성 시뮬레이션 개발기

modifyC 2026. 2. 18. 02:39
728x90
반응형

1. 프로젝트 개요 (Project Overview)

'말랑이 메이커'는 사용자가 카카오톡 인터페이스를 통해 자신만의 디지털 캐릭터 '말랑이'를 실시간으로 육성하는 챗봇 기반 시뮬레이션 게임입니다. 본 프로젝트의 핵심 UX 설계 철학은 "전광판 스타일(Electronic Display Style)" UI를 구현하여, 텍스트 기반 환경에서도 육성 시뮬레이션 특유의 직관적인 상태 피드백과 몰입감을 제공하는 데 있습니다.

기술적으로는 AWS DynamoDB 기반의 서버리스 지향 아키텍처를 채택하여 인프라 관리 부담을 제거하고, 다수의 사용자가 동시에 상호작용하는 환경에서 실시간 데이터 정합성을 보장하는 견고한 시스템을 구축하는 것을 목표로 하였습니다.

2. 시스템 아키텍처 및 기술 스택 (System Architecture & Tech Stack)

높은 동시성 처리와 저지연 응답 속도를 확보하기 위해 다음과 같은 기술 스택을 구성하였습니다.

  • Interface: Kakao i OpenBuilder (Skill Server)
  • Backend: FastAPI (Python 3.10+) - 비동기 처리를 통한 효율적인 요청 관리
  • Database: AWS DynamoDB (NoSQL) - 실시간 게임 데이터 처리를 위한 저지연(Low-latency) 및 고가용성 보장
  • Infrastructure: AWS IAM (최소 권한 원칙 적용), ngrok (개발 단계의 터널링 환경 구축)

설계 의도: 관리형 서비스 중심의 아키텍처 설계를 통해 확장성을 확보하고, DynamoDB의 On-demand 스케일링을 활용하여 급격한 트래픽 변동에도 유연하고 비용 효율적으로 대응하도록 설계하였습니다.

3. 핵심 게임 메커니즘 (Core Game Mechanics)

실시간 육성 및 진화 (Clamping Logic)

사용자는 '밥 주기', '쓰다듬기', '똥 치우기' 등 다양한 상호작용을 통해 말랑이의 상태를 관리합니다. 이때 모든 수치 변화는 Clamping Logic(min(100, new_health))을 적용하여 데이터 오버플로우를 방지하고 경계값 내에서 안정적으로 유지됩니다.

캐릭터는 레벨에 따라 총 15단계의 동적 진화 과정을 거치며, title_tag 문자열의 마지막 문자를 파싱하여 emoji를 추출하는 방식의 동적 칭호 시스템을 통해 시각적 다양성을 확보했습니다.

고도화된 예외 처리 및 가드 클로즈 (Guard Clauses)

시스템 안정성을 위해 State-based Guard Clauses를 도입하였습니다.

  • 시간 기반 제어: '쓰다듬기'(일 1회), '청소'(일 2회) 등 일일 활동 제한 로직을 통해 무분별한 성장을 방지합니다.
  • 확률 기반 필살기: 현재 체력에 비례한 성공 확률(최대 80%)을 계산하며, 실패 시 즉시 데이터가 초기화(사망)되는 하이 리스크-하이 리턴 구조를 구현했습니다. 이때 명령어 진입점에서 생존 여부와 만렙 여부를 우선 판별하여 적절한 UI로 분기합니다.

채팅방 기반 랭킹 시스템

room_id 필드를 인덱스로 활용하여 동일 채팅방 내 TOP 3 랭킹을 실시간 산출합니다. 랭킹 로직은 level을 최우선 기준으로 하되, 동일 레벨일 경우 exp를 기준으로 내림차순 정렬(reverse=True)하여 경쟁의 공정성을 확보했습니다.

4. 기술적 도전 및 최적화 전략 (Technical Challenges & Optimization)

DB I/O 최적화 및 Latency 단축

  • 문제점 (Problem): 데이터 업데이트 후 최신 상태를 사용자에게 노출하기 위해 UpdateItem 연산 후 다시 GetItem을 호출하는 비효율적인 I/O 발생으로 응답 지연이 우려되었습니다.
  • 해결책 (Solution): Atomic State Management 방식을 채택했습니다. 연산 직후 계산된 최신 수치를 메모리 내 변수에 즉시 할당하고 이를 응답 메시지 조립에 직접 활용하는 '단일 트랜잭션 내 응답 생성' 전략을 통해, 추가적인 Read 호출 없이 응답 속도를 약 50% 단축하는 성과를 거두었습니다.

응답 스키마 정합성 및 Forced Resource Allocation

  • 문제점 (Problem): 카카오톡 클라이언트에서 textCard와 basicCard를 혼용할 경우 "Must be of the same schema" 에러가 발생하며 응답이 거부되는 현상이 발견되었습니다.
  • 해결책 (Solution): 모든 응답 규격을 basicCard로 단일화했습니다. 특히 이미지가 불필요한 랭킹 시스템 등의 응답에서도 시스템 기본 이미지 URL을 강제로 할당(Forced Resource Allocation) 하여 런타임 스키마 에러를 원천 차단했습니다.

데이터 정합성 및 In-place Update 구조

  • 문제점 (Problem): 다양한 액션 수행 시 DB 로드 시점과 로컬 갱신 시점의 차이로 인해 이전 상태의 '낡은 데이터(Stale Data)'가 출력되는 정합성 오류가 발생했습니다.
  • 해결책 (Solution): 데이터 로드 객체와 비즈니스 로직 가공 객체를 엄격히 분리하고 In-place Update(동적 상태 갱신) 방식을 적용했습니다. 액션 성공 시 DB 반영 수치를 로컬 객체에 즉시 동기화하여 별도의 재조회 없이도 항상 실시간 데이터를 사용자에게 전달합니다.

UX 한계 극복: 컨텍스트 기반 UI 설계

  • 문제점 (Problem): 카카오톡 인터페이스의 '응답당 버튼 3개 제한' 규격으로 인해 다양한 게임 명령어를 배치하기 어려웠습니다.
  • 해결책 (Solution): Contextual UI 전략을 사용했습니다. 도움말 요청 시에만 Quick Replies(바로가기) 를 동적으로 팝업시키고, 만렙(Lv.15) 도달 시에는 '새로 분양' 및 '명예의 전당' 버튼으로 구성을 변경하여 제한된 환경 내에서 최적의 조작 환경을 구현했습니다.

5. 최신 업데이트 및 버그 수정 (Recent Bug Fixes)

  • 사망 로직 및 Origin Type 정합성 개선: 필살기 실패 시 사망 대사가 새로 생성될 다음 캐릭터의 타입으로 출력되던 버그를 수정했습니다. 요청 컨텍스트 시작 시점에 origin_malang_type을 선언하여, 사망한 캐릭터 본래의 타입을 참조하도록 로직을 교정했습니다.
  • UI/UX 안정화 (Card Splitting): 상태창의 텍스트가 길어질 경우 발생하는 글자 짤림 현상을 해결하기 위해, 응답을 simpleText(나레이션)와 basicCard(상태창) 두 개로 분할(Splitting) 하여 출력하는 방식으로 가독성을 확보했습니다.
  • 데이터 표현 정교화: 메시지 조립 시 "그냥 말랑이"라는 플레이스홀더가 노출되던 문제를 descriptions.py 연동을 통한 동적 메시지 생성 로직으로 통합하여 데이터 일관성을 높였습니다.
  • Base URL 호출 순서 교정: 사망 시 이미지 URL 반환 과정에서 Base URL 변수가 호출 시점보다 늦게 설정되어 발생하는 오류를 변수 선언 순서 조정을 통해 해결했습니다.

6. 결론 및 향후 전망 (Conclusion)

본 프로젝트는 AWS Solutions Architect 관점의 설계를 통해 서버리스 환경에서 발생할 수 있는 데이터 정합성 및 Latency 문제를 구조적으로 해결하였습니다. 특히 NoSQL 환경에서 채팅방 기반 랭킹과 같은 관계형 데이터를 효율적으로 처리하고, 카카오톡 API의 물리적 제약을 컨텍스트 기반 UI 설계로 극복한 점은 기술적 유연성을 입증합니다.

향후에는 확장성 있는 데이터 구조를 기반으로 유저 간 상호작용 기능을 더욱 강화하고, 견고한 예외 처리 로직을 고도화하여 보다 완성도 높은 서버리스 게임 엔진으로 발전시킬 계획입니다.

 

 

https://github.com/MODIFYC/MalangMaker?tab=readme-ov-file

 

GitHub - MODIFYC/MalangMaker

Contribute to MODIFYC/MalangMaker development by creating an account on GitHub.

github.com

 

728x90
반응형