순환 의존성, 컴파일 시간, Include 문제 해결
11강. 순환 의존성, 컴파일 시간, Include 문제 해결
1. 이번 강의에서 해결할 문제
Game Module이 Interaction Module을 사용하고 Interaction Module이 다시 Game Character를 Include합니다. Build.cs 양쪽에 서로를 추가하거나 CircularlyReferencedDependentModules로 허용하면 빌드는 우연히 통과해도 독립 빌드와 재사용성이 무너지고 작은 Header 변경이 큰 재컴파일을 일으킵니다.
2. 학습 목표
3. 핵심 개념
Header Guard는 같은 Header의 중복 포함을 막지만 Module 구조의 순환을 해결하지 않습니다. Module A와 B가 서로 Public 의존하면 어느 쪽도 독립적으로 사용할 수 없습니다. 해법은 보통 세 가지입니다.
- 양쪽이 공유하는 작은 인터페이스·데이터를 하위 Contract Module로 이동
- 상위 게임 규칙이 플러그인 Delegate나 Interface를 구현하도록 의존성 역전
- 실제로 한 책임이면 Module을 다시 합치기
4. 단계별 실습
잘못된 그래프
GameProject ─▶ ReusableInteraction
▲ │
└──────────────────┘ MyPlayerCharacter 직접 참조
개선된 흐름
DECLARE_MULTICAST_DELEGATE_TwoParams(
FOnInteractionCommitted,
AActor* /* Instigator */,
AActor* /* Target */);
class REUSABLEINTERACTION_API FInteractionEvents
{
public:
static FOnInteractionCommitted& OnCommitted();
};
게임 모듈은 Event를 구독해 Quest를 갱신합니다. Runtime 플러그인은 GameProject를 모릅니다. 수명 긴 정적 Delegate를 사용한다면 구독 Handle을 소유 객체·Module 종료 시 반드시 제거합니다. 상황에 따라 UObject Interface나 Component Delegate가 더 안전할 수 있습니다.
Include 문제는 /showIncludes, UBT Build Timing, Unreal Insights Build 같은 현재 환경 도구로 관찰할 수 있습니다. 정확한 옵션은 UE와 Compiler 버전을 확인하고, 측정 없이 Unity Build를 끄거나 PCH를 늘려 해결했다고 단정하지 않습니다.
5. 코드가 동작하는 이유
하위 플러그인이 Event만 발행하고 상위 게임이 구독하면 컴파일 의존성은 Game → Plugin 한 방향입니다. 런타임 호출 흐름은 반대로 전달될 수 있지만 C++ Include와 Link 그래프는 순환하지 않습니다. 이는 제어 흐름과 소스 의존성이 동일할 필요가 없기 때문입니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
순환 의존성, 컴파일 시간, Include 문제 해결 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.