프로젝트 규모가 커질수록 컴파일 시간이 길어지는 경우가 많다. 이러한 문제를 개선할 수 있는 방법 중 하나는 바로 '어셈블리 정의'이다.
유니티의 어셈블리 정의(Assembly Definition)는 C# 스크립트의 컴파일 단위를 나누는 기능이다. 기본적으로 모든 C# 스크립트는 Assembly-CSharp.dll에 포함되지만, 어셈블리 정의를 사용하면 여러 개의 어셈블리로 분리할 수 있다.
단, 예외적으로 Editor 폴더 아래의 스크립트들은 Assembly-Csharp-Editor.dll로 컴파일한다.
컴파일 속도 최적화
모듈화된 코드 관리
의존성(Dependency) 설정 가능
테스트 코드 분리 가능
런타임 성능에는 영향을 주지 않는다.
어셈블리 간 순환 참조 방지해야 한다.
유니티에서 .asmdef 파일을 사용할 때, 서로 참조(순환 참조)하는 두 개의 어셈블리는 동시에 컴파일할 수 없다. A가 B를 컴파일하기 전에 필요로 하고, B가 A를 컴파일하기 전에 필요로 하기 때문에 서로를 먼저 컴파일해야 하는 상황이 발생할 수 있기 때문이다.
OOP 관점에서도 상호 참조가 되어버리면 커플링으로 서로 강하게 묶여버려서 모듈화의 의미가 사라지게 된다. 이렇게 의존성이 꼬여 있으면 한쪽을 수정할 때 다른 쪽도 수정해야하는 경우가 많아 유지보수가 어려워진다.
너무 세분화하면 관리가 어려워질 수 있다.
어셈블리 정의는 컴파일 최적화 기법이다. 주로 규모가 큰 프로젝트에서 컴파일 속도를 줄이고, 코드 모듈화를 돕는 역할을 한다. 또, 자주 변경되는 코드와 변경이 적은 코드를 분리하면 빌드 속도도 빨라질 수 있다.
프로젝트 규모와 상황에 맞춰 적절하게 사용하면 개발 효율과 유지보수 측면에서 유용하게 사용할 수 있을 것 같다.
https://www.youtube.com/watch?v=I_2a2wRSF1o
https://docs.unity3d.com/kr/2023.2/Manual/ScriptCompilationAssemblyDefinitionFiles.html