Unity코드 아키텍처와 품질

테스트 가능한 Unity 아키텍처

Unity 의존 코드는 얇게 두고, 핵심 로직은 순수 C#으로 분리해 테스트 가능성을 높이는 구조를 정리합니다.

마지막 수정 2026년 3월 21일

기본 패턴

text
MonoBehaviour
  -> 입력, lifecycle, scene wiring

순수 C# class
  -> 규칙, 계산, 상태 전이

설명

  • Unity 프로젝트가 커질수록 가장 중요한 구조 선택 중 하나는 "무엇을 MonoBehaviour 안에 둘 것인가"입니다. 모든 규칙과 상태를 컴포넌트 안에 몰아넣으면 테스트도 어렵고, 씬 의존도도 커지고, 재사용성도 떨어집니다.
  • 반대로 MonoBehaviour를 입력 수집, 참조 연결, lifecycle 처리, 뷰 갱신처럼 Unity에 꼭 필요한 역할로 얇게 두고, 게임 규칙과 계산은 순수 C# 클래스로 분리하면 훨씬 다루기 쉬워집니다.
  • 예를 들어 체력 계산, 쿨다운 규칙, 인벤토리 정렬, 퀘스트 상태 전이는 대부분 엔진 없이도 돌아갈 수 있습니다. 이런 부분이 순수 클래스에 있으면 EditMode 테스트로 빠르게 검증할 수 있습니다.
  • ScriptableObject는 설정값과 공유 데이터를 분리하는 데 도움을 줄 수 있고, MonoBehaviour는 그 데이터를 씬과 연결하는 adapter 역할을 맡게 만들 수 있습니다.
  • 결국 테스트 가능한 Unity 아키텍처란 거창한 프레임워크보다 경계 설정입니다. "이 로직은 엔진이 꼭 필요한가?"를 계속 묻는 습관이 구조를 결정합니다.

빠른 정리

계층책임
MonoBehaviourlifecycle, scene wiring, input, view update
순수 C# class계산, 규칙, 상태 전이, 도메인 로직
ScriptableObject설정값, shared data, asset 기반 데이터
테스트 전략규칙은 EditMode, 엔진 통합은 PlayMode
핵심 질문이 코드는 Unity 없이도 실행 가능한가

주의할 점

모든 것을 추상화 계층으로 나누는 것도 과합니다. 작은 프로토타입에서는 단순한 MonoBehaviour 하나가 더 나을 수 있고, 반복 수정이 많아질 때 비로소 분리가 큰 이득을 줍니다.

참고 링크

3 sources