지난 7월 28일부터 8월 20일까지, 약 한 달간 진행했던 Project Escape가 막을 내렸습니다. 짧지 않은 시간 동안 많은 시도와 고민을 거쳤고, 그 과정에서 여러 배움과 한계도 함께 마주했습니다. 이번 글에서는 프로젝트 종료 후 돌아본 개선점과 회고를 기록하려 합니다.
이번 프로젝트에서 가장 크게 부딪힌 문제는 예상보다 복잡해진 구조와 데이터 이동의 빈도 증가였습니다.
처음에는 퀵 슬롯이 인벤토리의 역할을 겸하고 있었고, 여기서 아이템을 꺼내 손에 들고 사용하는 흐름을 단순하게 설계했습니다. 단일 책임 원칙을 지키고자, 퀵 슬롯과 Usable 관리 기능을 분리하여 Hero에 컴포넌트와 인터페이스를 부착하는 구조를 채택했지요. 당시에는 입력이 들어오면 Hero가 퀵 슬롯 매니저에서 아이템 포인터를 가져오고, 이를 Usable 매니저가 처리하는 방식이 가장 깔끔하다고 생각했습니다.
하지만 기능이 점점 추가되면서 Hero가 두 매니저를 중재해야 하는 역할이 늘어났고, 그 과정에서 퀵 슬롯 매니저와 Usable 매니저의 결합도가 높아지는 문제가 발생했습니다. 또한 언리얼에 대한 이해 부족으로, 컴포넌트가 직접 액터를 제어하지 못하고 오히려 액터가 컴포넌트를 호출해 동작을 구현하는 방식이 복잡도를 더 키웠습니다.
결과적으로, SOLID 원칙을 의식적으로 따르려 했음에도 불구하고, 데이터 이동 경로를 충분히 예측하지 못한 탓에 오히려 SOLID 원칙을 위반하는 상황까지 생겨났습니다.
이번 프로젝트를 통해 가장 크게 느낀 점은 데이터 흐름을 사전에 충분히 예측하는 것이 얼마나 중요한가였습니다. 기능을 설계하기 전, 데이터가 어디에서 생성되고 어디로 전달되며 얼마나 자주 이동하는지를 먼저 그려보는 습관이 필요하다는 것을 깨달았습니다. 이렇게 하면 불필요하게 중재자가 늘어나거나, 특정 클래스에 과도한 책임이 집중되는 문제를 줄일 수 있습니다.
또한, 언리얼 엔진의 컴포넌트 구조에 대한 이해 부족 역시 복잡도를 키운 원인이 되었습니다. 앞으로는 액터 중심이 아니라 컴포넌트가 주도적으로 동작하는 구조를 설계하는 연습을 더 해야겠다고 생각합니다. 이를 통해 불필요한 의존성을 줄이고, 각 컴포넌트가 자신이 맡은 책임을 더 명확하게 수행할 수 있도록 만들고 싶습니다.
이번에 SOLID 원칙을 맹목적으로 적용하려다 오히려 위반하는 상황을 경험하면서, 원칙은 절대적인 답이 아니라 프로젝트 맥락 속에서 유연하게 적용해야 하는 참고 도구라는 점을 실감했습니다. 앞으로는 원칙을 무조건 지키는 데 집중하기보다, 실제로 프로젝트의 단순성과 유지보수성을 높이는 방향으로 선택하고 적용하려 합니다.
또 하나의 배움은 복잡도 관리의 중요성입니다. 새로운 기능을 추가할 때마다 기존 구조가 단순성을 유지하고 있는지 꾸준히 점검하고, 필요하다면 리팩토링을 통해 구조를 정리해야 합니다. 이 과정에서 불필요하게 늘어난 인터페이스나 중재 계층을 과감히 줄여, 추상화가 실제로 단순성을 높이는 역할을 하도록 해야 합니다.
마지막으로, 이번 경험을 통해 게임플레이와 시스템적 요구 사이의 균형을 잡는 것이 설계의 핵심이라는 것을 알게 되었습니다. 플레이어 경험을 해치지 않으면서도 유지보수 가능한 구조를 만들기 위해, 더 넓은 시야에서 객체와 시스템을 바라보고 장기적인 관점에서 설계를 고민하는 습관을 길러야 한다고 느꼈습니다.
이 경험을 통해, 단순히 원칙을 지키는 것에 집착하기보다는 프로젝트 맥락에서 실질적으로 단순하고 유지보수하기 쉬운 구조가 무엇인지를 더 고민해야 함을 깨달았습니다. 또한 구조 설계 단계에서 “데이터가 얼마나 자주, 어디로 이동할 것인지”를 먼저 추론하는 것이 중요하다는 점도 배웠습니다. 앞으로는 코드를 더 넓은 시야로 바라보며, 원칙은 참고하되 실제 상황에 맞는 유연한 설계를 해 나가고자 합니다.