[Unity] Assembly Definition

심지섭·2025년 1월 30일
0

Unity

목록 보기
2/2

어셈블리 정의 (Assembly Definition)

프로젝트 규모가 커질수록 컴파일 시간이 길어지는 경우가 많다. 이러한 문제를 개선할 수 있는 방법 중 하나는 바로 '어셈블리 정의'이다.
유니티의 어셈블리 정의(Assembly Definition)는 C# 스크립트의 컴파일 단위를 나누는 기능이다. 기본적으로 모든 C# 스크립트는 Assembly-CSharp.dll에 포함되지만, 어셈블리 정의를 사용하면 여러 개의 어셈블리로 분리할 수 있다.
단, 예외적으로 Editor 폴더 아래의 스크립트들은 Assembly-Csharp-Editor.dll로 컴파일한다.

어셈블리 정의의 장점

  1. 컴파일 속도 최적화

    • 변경된 어셈블리만 다시 컴파일하기 때문에 불필요한 전체 컴파일 방지할 수 있다.

  2. 모듈화된 코드 관리

    • UI, Core, Player 등 관련 코드들을 폴더 단위로 분리하여 어셈블리 정의하면 유지보수 관점에서 용이하다.

  3. 의존성(Dependency) 설정 가능

    • 특정 어셈블리만 참조하도록 설정하여 불필요한 코드는 접근 차단할 수 있다.

  4. 테스트 코드 분리 가능

    • Editor 전용 코드와 Runtime 코드를 따로 관리 가능하다. 빌드 시 Editor 코드는 제외된다.

어셈블리 정의하는 법

  1. 새 어셈블리 정의 파일(.asmdef) 생성
    • 'Assets → Create → Assembly Definition' 경로를 통해 .asmdef 파일을 생성한다.


  1. 필요한 참조 추가 (Assembly Definition References 설정)
    • 다른 어셈블리를 참조하려면, 해당 .asmdef 파일에서 Assembly Definition References 항목을 설정해야 한다.
    • 참조하려는 .asmdef 파일을 선택하여 추가할 수 있다.

  1. 파일을 해당 폴더에 배치하면 적용 완료
    • 적용하면 해당 폴더와 그 하위 폴더에 있는 스크립트들은 해당 어셈블리로 묶이게 된다.

어셈블리 정의 사용 시 주의점

  1. 런타임 성능에는 영향을 주지 않는다.

    • 따라서 런타임 성능 최적화를 목적으로 사용하는 것은 적절하지 않다.
  1. 어셈블리 간 순환 참조 방지해야 한다.

    • 유니티에서 .asmdef 파일을 사용할 때, 서로 참조(순환 참조)하는 두 개의 어셈블리는 동시에 컴파일할 수 없다. A가 B를 컴파일하기 전에 필요로 하고, B가 A를 컴파일하기 전에 필요로 하기 때문에 서로를 먼저 컴파일해야 하는 상황이 발생할 수 있기 때문이다.

    • OOP 관점에서도 상호 참조가 되어버리면 커플링으로 서로 강하게 묶여버려서 모듈화의 의미가 사라지게 된다. 이렇게 의존성이 꼬여 있으면 한쪽을 수정할 때 다른 쪽도 수정해야하는 경우가 많아 유지보수가 어려워진다.

  1. 너무 세분화하면 관리가 어려워질 수 있다.

    • 어셈블리를 지나치게 세분화하면 설정이 복잡해지기 때문에 부담이 커질 수 있다.

마무리

어셈블리 정의는 컴파일 최적화 기법이다. 주로 규모가 큰 프로젝트에서 컴파일 속도를 줄이고, 코드 모듈화를 돕는 역할을 한다. 또, 자주 변경되는 코드와 변경이 적은 코드를 분리하면 빌드 속도도 빨라질 수 있다.
프로젝트 규모와 상황에 맞춰 적절하게 사용하면 개발 효율과 유지보수 측면에서 유용하게 사용할 수 있을 것 같다.

참고자료

https://www.youtube.com/watch?v=I_2a2wRSF1o

https://docs.unity3d.com/kr/2023.2/Manual/ScriptCompilationAssemblyDefinitionFiles.html

https://learn.microsoft.com/ko-kr/dotnet/standard/assembly/

profile
게임 개발을 하며 배운 것과 경험한 것을 기록하는 공간입니다.

0개의 댓글