팀스파르타 내일배움캠프

📌 Unity에서 인스펙터 드래그 앤 드롭보다 코드 구독이 선호되는 이유 정리

creator2041 2025. 5. 22. 10:34

Unity 프로젝트를 진행하며 인스펙터에서 버튼이나 이벤트 리스너를 연결하는 방식은 매우 직관적이고 편하다. 하지만 프로젝트 규모가 커지고 유지보수, 협업, 기능 확장 요구가 생기기 시작하면 "코드 기반의 구독/연결 구조"가 훨씬 강력하다는 걸 체감하게 된다.


🔁 인스펙터 방식의 장점과 한계

✅ 장점

  • 빠르고 직관적이다: Button 클릭 이벤트, OnClick 등은 UI 디자이너나 초보 개발자에게 친숙하다.
  • 테스트가 쉽다: 씬을 실행한 뒤 버튼을 눌러보면서 이벤트 반응을 직접 확인할 수 있다.
  • 코드 작성 없이 인터랙션 구성 가능하다.

❌ 단점 (규모가 커질수록 심각해지는 문제)

  1. 관계가 외부적이라 추적이 불가능하다.
    • 연결된 함수나 대상이 어디서 호출되는지 코드를 통해서는 알 수 없다.
    • 나중에 왜 어떤 이벤트가 발생했는지 원인을 찾기 어렵다.
  2. 런타임 중 동적 변경이 불가능하다.
    • 특정 조건에 따라 구독을 해제하거나 연결을 바꿔야 할 경우, 인스펙터 연결만으로는 대응이 안 된다.
  3. 리팩토링이나 컴포넌트 이동 시 오류 발생 가능
    • 대상이 사라졌거나 이름이 바뀌었는데 연결은 남아 있으면, 런타임 시 에러가 나거나 무반응이 된다.
  4. 컴파일 타임 안전성이 없다
    • 연결된 함수가 사라져도 컴파일 에러는 없으며, Silent Failure가 발생한다.

✅ 코드 기반 구독 방식이 더 좋은 이유

1. 명시적이다 (Explicit)

  • 누가, 언제, 어떤 대상에게 어떤 메서드를 구독했는지가 코드 상에서 바로 드러난다.
  • 협업 중에도 해당 동작이 어떤 흐름에 속해 있는지 파악이 쉽다.
Player.OnDie += ShowGameOverUI;

2. 추적 가능하다 (Traceable)

  • Ctrl + 클릭, 검색으로 어디서 구독하고 어디서 해제하는지 빠르게 파악 가능하다.
  • 문제 생겼을 때, 어느 라인에서 무슨 일이 있었는지를 디버깅하기 좋다.

3. 동적으로 제어 가능하다 (Dynamic)

  • 상황에 따라 어떤 함수를 구독하거나 해제할 수 있다.
  • 예: 특정 퀘스트 조건 달성 전까지는 UI 버튼이 눌러도 아무 일도 안 일어나게 구성 가능.
if (player.Level >= 10)
    player.OnSkillUsed += OpenSkillWindow;

4. 해제까지 명시할 수 있다 (Unsubscribe Safety)

  • OnDisable()이나 OnDestroy()에서 안전하게 해제 가능 → 메모리 누수 및 중복 실행 방지
void OnDisable()
{
    Player.OnDie -= ShowGameOverUI;
}

🔎 델리게이트/이벤트뿐만 아니라 이런 곳에서도 코드 구독이 낫다

🧭 1. Input System

  • PlayerInput 컴포넌트에서 SendMessage 방식보다는 C# Event로 직접 Subscribe 하는 것이 더 명시적이다.
playerInput.actions["Jump"].performed += ctx => Jump();

🧭 2. ScriptableObject 이벤트 버스 (EventChannel 방식)

  • 여러 컴포넌트가 하나의 이벤트를 참조할 때 인스펙터 연결은 위험하다.
  • 코드로 Raise() → Subscribe() 구조를 사용하면 매우 유연하고 확장 가능하다.

🧭 3. Animation 이벤트

  • 애니메이션 이벤트를 코드에서 다루면 클립 변경 시에도 대응 가능
  • 인스펙터에서 이벤트 함수 연결은 한 번 깨지면 어디가 잘못됐는지 추적 불가

🧭 4. UI Button 등 단순 이벤트도 코드로 연결 가능

myButton.onClick.AddListener(() => { Debug.Log("Clicked!"); });
  • 코드 상에서 언제 연결하고 언제 해제할지 결정 가능함

🧠 코드 기반 연결의 장점 요약

구분 인스펙터 연결 코드 기반 구독

추적 가능성 거의 없음 코드상 명확하게 추적 가능
디버깅 어렵고 시간이 많이 듬 어디서 발생했는지 금방 알 수 있음
조건부 실행 불가능 가능
실행 흐름 가시성 숨겨져 있음 완전 공개
리팩토링 내성 약함 강함 (컴파일 에러 발생)
테스트 가능성 거의 없음 유닛 테스트 가능

✍️ 마치며

초기에는 드래그 앤 드롭이 빠르고 쉬워 보일 수 있다.
하지만 프로젝트가 성장하고, 협업 인원이 늘어나고, 유지보수가 필요해지는 순간
“관계가 보이지 않는 구조”는 가장 위험한 구조가 된다.

반면, 코드 기반 구독은 처음엔 조금 더 코드가 길어지더라도
확장성, 안정성, 추적성, 테스트성 모든 면에서 우수하다.

그래서 Unity에서도 실무 프로젝트일수록 인스펙터 연결보다는
코드 기반 이벤트 시스템과 델리게이트 기반 구독 방식이 주류가 된다.