.NET 과 C#의 아키텍처
C# 보다 .NET을 먼저 알고가자.
- C#은 단독으로 실행되지 않고,
.NET 런타임 환경(ex. CLR, CoreCLR) 위에서 실행된다. - .NET C#, F#, VB 등 여러 언어를 지원하는 공통 플랫폼이며
공통된 기능, API, 런타임 동작을 제공한다. - 따라서 C#의 코드 구조, 빌드, 실행 방식은 .NET의 구조와 깊이 관련되어 있다.
공식문서 참고 내
" .NET is a free, cross-platform, open-source developer platform
for building many kinds of applications.
It can run programs written in multiple languages, with C# being the most popular.
It relies on a high-performance runtime that is used in production by many high-scale apps "
– Microsoft Docs
“.NET is a free, cross-platform,
open source developer platform for building many different types of applications.”
— 출처: Build .NET applications with C#
이러한 설명들은 .NET이 다양한 애플리케이션을 개발할 수 있는 범용 플랫폼임을 강조하고 있다.
여기서 플랫폼이란,
소프트웨어 개발에서의 의미를 MS 공식 문서를 기준으로 설명해보면 다음과 같다.
플랫폼이란?
어떤 프로그램이 실행되기 위해 필요한 환경 전체를 의미한다.
1. OS - Window, macOS 등
2. 실행 엔진 - .NET CLR, Java JVM, Python 인터프리터 등
3. 라이브러리와 API - 개발에 사용되는 기능들
4. 개발 도구 (IDE, 빌드 툴) - Visual Studio, MSBuild 등
C#으로 만든 프로그램은 다음과 같은 "플랫폼" 위에서 실행된다.
.NET 플랫폼 (ex .NET 8)
Windows/Linux/macOS 운영 체제 .
.NET 런타임(CoreCLR)
사용하는 라이브러리들
쉽게 말하자면
플랫폼 = 프로그램이 실행되고 동작하는 기반
이유 1. C#은 .NET 플랫폼 위에서 실행되는 언어
.NET은 Microsoft에서 개발한 오픈 소스 개발 프레임워크로,
웹, 데스크톱, 모바일, 클라우드, IoT 등 다양한 환경에서 애플리케이션을 개발할 수 있도록 해준다.
.NET이 지원하는 언어들 | |
C# | .NET에서 가장 널리 쓰이는 언어. 객체지향, 타입 안전성, 최신 문법 지원 |
F# | 함수형 프로그래밍 언어. 수학적 계산이나 과학적 처리에 유리 |
VB.NET | 비주얼 베이직의 .NET 버전. 문법이 영어 문장에 가까움 |
C++/CLI | C++ 코드와 .NET을 섞어 쓸 수 있게 해주는 언어 확장 |
PowerShell | .NET 기반의 스크립트 언어로 시스템 자동화에 사용 |
IronPython, IronRuby |
.NET 위에서 돌아가는 파이썬/루비 구현 |
이유 1. C#의 표준 라이브러리는 .NET의 일부
- System, System.Collections, System.IO 등 대부분의
C# 코드에서 사용하는 네임스페이스와 클래스들은 .NET의 클래스 라이브러리
- 즉, C# 언어 자체는 최소한의 구문과 구조만을 제공하고,
기능 구현은 대부분 .NET이 담당
- 즉, C# 언어 자체는 최소한의 구문과 구조만을 제공하고,
"The System namespace is the root namespace for fundamental types in .NET. This namespace includes classes that represent the base data types used by all applications, for example, Object (the root of the inheritance hierarchy), Byte, Char, Array, Int32, and String."
— 출처: .NET Class Library Overview
즉, System, System.Collections, System.IO 등의 네임스페이스는
.NET의 클래스 라이브러리의 일부로, C#에서 자주 사용하는 기능들을 제공한다.
예를 들어, System.Collections 네임스페이스는
리스트, 큐, 해시 테이블 등 다양한 컬렉션을 정의하며,
System.IO 네임스페이스는 파일 및 데이터 스트림의 읽기/쓰기를 지원한다.
따라서, C# 언어 자체는 이러한 기능들을 직접 구현하지 않으며,
.NET 클래스 라이브러리를 통해 제공되는 기능들을 활용하여 애플리케이션을 개발한다.
이는 C#의 아키텍처를 이해하는 데 있어 .NET의 역할과 구조를 먼저 이해해야 하는 이유 중 하나이다.
3. C#의 실행 과정은 .NET의 실행 구조에 의존
실행 과정
C# 코드 → IL(중간 언어) → .NET 런타임(CLR 등)이 JIT 컴파일 → 실행
C#의 실행 과정이 .NET의 실행 구조에 의존한다는 주장은
Microsoft 공식 문서에서 다음과 같이 확인할 수 있다.
".NET provides a run-time environment called the common language runtime that runs the code and provides services that make the development process easier."
— 출처: Common Language Runtime (CLR) overview - .NET
이 문서에 따르면, C#과 같은 .NET 언어로 작성된 코드는
먼저 중간 언어(Intermediate Language, IL)로 컴파일되며,
이후 공통 언어 런타임(Common Language Runtime, CLR)에 의해 실행된다고 말하고 있다.
CLR은 다음과 같은 기능을 수행한다.
- 코드 실행 및 서비스 제공
- 메모리 관리 및 가비지 컬렉션
- 보안 및 예외 처리
- JIT(Just-In-Time) 컴파일을 통한 네이티브 코드 생성
이러한 기능들은 C# 언어 자체가 아닌 .NET의 런타임 환경에서 제공되므로,
C#의 실행 과정은 .NET의 아키텍처에 깊이 의존하고 있다.
즉,
- C# 코드는 먼저 중간 언어(IL)로 컴파일
- IL 코드는 CLR에 의해 JIT 컴파일되어 네이티브 코드로 변환
- CLR은 코드 실행, 메모리 관리, 보안, 예외 처리 등의 기능을 제공
- 따라서, C#의 실행 과정은 .NET의 실행 구조에 의존
이러한 구조는 C#뿐만 아니라
.NET 플랫폼에서 지원하는 다른 언어들(F#, VB.NET 등)에도 동일하게 적용된다.
4. 플랫폼 간 실행(Cross-platform), 성능, GC, 보안 등은 .NET이 처리
.NET은 다양한 운영 체제와 칩 아키텍처에서 실행되도록 설계되었습니다. 공식 문서에 따르면:
".NET has been designed to deliver productivity, performance, security, and reliability. It provides automatic memory management via a garbage collector (GC). It is type-safe and memory-safe, due to using a GC and strict language compilers. It offers concurrency via async/await and Task primitives. It includes a large set of libraries that have broad functionality and have been optimized for performance on multiple operating systems and chip architectures."
— 출처: Introduction to .NET
성능 최적화
.NET 런타임은 성능 향상을 위해 다양한 최적화 기법을 제공한다.
예를 들어, .NET 9에서는 다음과 같은 성능 개선이 이루어졌다.
- 루프 최적화
- 인라이닝 개선
- 프로파일 기반 최적화(PGO) 개선
- Arm64 벡터화 및 코드 생성
- 예외 처리 속도 향상
이러한 최적화는 .NET 런타임 수준에서 이루어지며,
C# 언어 자체의 기능이 아니다.
가비지 컬렉션 (Garbage Collection)
.NET의 가비지 컬렉터는 메모리 할당과 해제를 자동으로 관리한다.
공식 문서에서는 다음과 같이 설명하고 있다.
".NET's garbage collector manages the allocation and release of memory for your application. Each time you create a new object, the common language runtime allocates memory for the object from the managed heap. As long as address space is available in the managed heap, the runtime continues to allocate space for new objects. However, memory is not infinite. Eventually the garbage collector must perform a collection in order to free some memory."
— 출처: Garbage collection
이러한 메모리 관리는 C# 언어가 아닌 .NET 런타임의 기능이다.
보안
.NET 런타임은 코드의 안전성과 보안을 보장하기 위한 다양한 기능을 제공한다.
공식 문서에서는 다음과 같이 설명하고 있다.
"Compilers and tools expose the common language runtime's functionality and enable you to write code that benefits from the managed execution environment. Code that you develop with a language compiler that targets the runtime is called managed code. Managed code benefits from features such as cross-language integration, cross-language exception handling, enhanced security, versioning and deployment support, a simplified model for component interaction, and debugging and profiling services."
— 출처: Common Language Runtime (CLR)
이러한 보안 기능은 C# 언어 자체가 아닌 .NET 런타임에서 제공된.
기능 담당 주체 설명
플랫폼 간 실행 | .NET 런타임 | 다양한 운영 체제와 아키텍처에서의 실행 지원 |
성능 최적화 | .NET 런타임 | JIT 컴파일, PGO, 하드웨어 가속 등 다양한 최적화 기법 제공 |
가비지 컬렉션 | .NET 런타임 | 자동 메모리 관리 및 최적화된 GC 전략 제공 |
보안 | .NET 런타임 | 코드 안전성, 권한 관리, 예외 처리 등 보안 기능 제공 |
따라서, C#으로 개발된 애플리케이션의 실행과 관련된 핵심 기능들은 .NET 런타임에 의해 관리되며,
C# 언어 자체보다는 .NET의 아키텍처와 기능에 의존하고 있다.
.NET 아키텍처 개요
.NET의 아키텍처는 다음과 같은 주요 구성 요소로 이루어져 있다.
1. 공통 언어 런타임 (CLR, Common Language Runtime)
- .NET 애플리케이션의 실행 환경을 제공하며,
메모리 관리, 스레드 관리, 예외 처리, 가비지 수집 등의 핵심 서비스를 담당
2. 기본 클래스 라이브러리 (BCL, Base Class Library)
- 파일 입출력, 데이터베이스 연결, XML 처리, 네트워킹 등 다양한 기능을 제공하는 재사용 가능한 클래스들의 집합
3. 언어 지원
- C#, F#, Visual Basic 등 여러 언어를 지원하며,
이들 언어는 공통 언어 사양(CLS, Common Language Specification)을 준수하여 상호 운용이 가능
4. 애플리케이션 모델
- 웹 애플리케이션을 위한 ASP.NET Core, 데스크톱 애플리케이션을 위한
Windows Forms와 WPF, 모바일 애플리케이션을 위한 .NET MAUI 등 다양한 애플리케이션 모델을 제공
5. 도구 및 SDK
- Visual Studio, Visual Studio Code 등의 개발 도구와 함께,
.NET SDK를 통해 애플리케이션 개발, 빌드, 배포를 지원
크로스 플랫폼 지원
.NET은 Windows, macOS, Linux 등 다양한 운영 체제에서 실행될 수 있도록 설계되었다.
이를 통해 개발자는 하나의 코드베이스로 여러 플랫폼에서 동작하는 애플리케이션을 개발할 수 있다.
아키텍처란?
소프트웨어에서의 아키텍처란,
아키텍처는 소프트웨어 시스템의 구성 요소(컴포넌트)와
그들 간의 관계(구조와 연결 방식)를 전체적으로 설계한 구조를 의미한다.
다시 말해,
소프트웨어가 무엇으로 구성되었고 어떻게 연결되고 상호작용하는지에 대한 전체적인 설계도를 말한다.
Microsoft 공식 문서에서의 정의
“Architecture is the high-level structure of a software system,
the discipline of creating such structures, and the documentation of these structures.”
– Microsoft .NET Architecture Guides
"Architecture"는 원래 건축 설계라는 뜻이다.
건물 아키텍처:
벽, 기둥, 배선, 구조물 등이 어떻게 연결되어 있는지
소프트웨어 아키텍처:
모듈, 라이브러리, 데이터 흐름, API가 어떻게 연결되어 있는지
구분 의미
구분 | 의미 |
일반 정의 | 시스템의 구성 요소들과 관계를 설계한 구조 |
소프트웨어에서 | 프로그램이 어떻게 구성되고 작동하는지의 틀 |
관련 문서 | Microsoft .NET Architecture Guides |
예를 들어, .NET의 아키텍처를 보면:
- 언어: C#, F#, VB
- 런타임: CLR (Common Language Runtime)
- 라이브러리: .NET Base Class Library (예: System.IO, System.Net 등)
- 앱 유형: Web, Desktop, Mobile, Cloud 등
- 도구: SDK, CLI, Visual Studio 등
이러한 구성 요소들이
어떻게 연결되고, 어떤 역할을 수행하며, 어디서 동작하는지를 설명하는 것이 .NET 아키텍처이다.
C# 주요 아키텍처 패턴
기술 스택 보통 사용하는 아키텍처
ASP.NET Core Web | MVC, Clean Architecture |
WPF, MAUI, Xamarin | MVVM |
Blazor | MVVM 유사 구조 또는 컴포넌트 기반 |
Windows Forms | MVP, 계층형 구조 |
Unity | 컴포넌트 기반, ECS, Clean |
클래스 라이브러리 (.dll) | 계층형 또는 도메인 기반 설계 |
API 서버 | MVC + 서비스 계층, 또는 Clean |
MVC와 MVVM은 모두 .NET에서 실제로 사용되는 아키텍처 패턴이며,
사용되는 프로젝트 유형에 따라 선택적으로 사용
1. MVC (Model-View-Controller)
MVC는 애플리케이션을 세 가지 주요 구성 요소로 분리하는 아키텍처 패턴이다.
- Model: 애플리케이션의 데이터와 비즈니스 로직을 관리
- View: 사용자 인터페이스를 담당하며, Model의 데이터를 표시
- Controller: 사용자의 입력을 처리하고, Model과 View를 연결
이 패턴은 관심사의 분리를 통해 유지 보수성과 테스트 용이성을 향상시킨다.
2. MVVM (Model-View-ViewModel)
MVVM은 특히 WPF, UWP, Xamarin, .NET MAUI와 같은 XAML 기반 애플리케이션에서 사용되는 패턴
- Model: 애플리케이션의 데이터와 비즈니스 로직을 포함
- View: 사용자 인터페이스를 정의하며, ViewModel과 데이터 바인딩을 통해 상호 작용
- ViewModel: Model과 View 사이의 중재자로서, 데이터 바인딩과 명령을 통해 View와 통신
MVVM은 UI와 비즈니스 로직의 분리를 통해 테스트 용이성과 코드 재사용성을 높임
패턴 주로 사용되는 곳 플랫폼
패턴 | 주로 사용되는 곳 | 플랫폼 |
MVC (Model-View-Controller) | 웹 애플리케이션 | ASP.NET Core MVC |
MVVM (Model-View-ViewModel) | 데스크톱/모바일 앱 | WPF, UWP, Xamarin, .NET MAUI |
각각 언제 쓰이는가?
MVC는 언제 쓰나?
- ASP.NET Core로 웹 사이트나 RESTful API를 만들 때 사용
- Controller가 URL 요청을 처리하고, View에 데이터를 전달하는 전통적인 웹 구조에 적합
예: 쇼핑몰 웹사이트, 블로그, 관리자 페이지 등
MVVM은 언제 쓰나?
- 사용자 인터페이스가 복잡하고 데이터 바인딩이 중요한 GUI 애플리케이션에서 사용
- View와 Model 사이를 ViewModel이 연결해주며,
XAML 바인딩을 통해 UI 코드 없이 UI를 자동으로 업데이트할 수 있음
예: 데스크톱 앱(WPF), 모바일 앱(MAUI, Xamarin), 크로스 플랫폼 앱
항목 MVC MVVM
사용 환경 | 웹 | 데스크톱 / 모바일 |
플랫폼 | ASP.NET Core | WPF, Xamarin, .NET MAUI 등 |
목적 | 사용자 요청 처리 중심 | UI 상태 및 데이터 중심 |
바인딩 방식 | 수동 (View ↔ Model) | 자동 (View ↔ ViewModel, XAML 데이터 바인딩) |
둘을 같이 쓰는 건?
- 같은 프로젝트 안에서 MVC와 MVVM을 혼합해서 쓰는 경우는 일반적이지 않다.
- 하지만 하나의 솔루션(예: 웹 + 모바일 통합 시스템) 내에 각기 다른 프로젝트에서 각각의 패턴을 사용할 수는 있다.
Unity에서 자주 쓰이는 아키텍처 패턴
유니티(Unity)를 사용할 때는 전통적인 MVC나 MVVM보다는
게임 개발에 적합한 구조를 선택하는 경우가 많다.
하지만 상황에 따라 MVC/MVVM의 개념을 응용하거나 일부 도입하기도 한다.
패턴/구조 설명
컴포넌트 기반 (Entity-Component) |
Unity의 기본 구조. 게임 오브젝트에 다양한 컴포넌트를 붙여 기능을 조립 |
MVC (드물게 사용) | 작은 UI 로직에선 쓸 수 있지만, Unity는 MVC보다는 이벤트 기반 또는 컴포넌트 기반 구조에 더 적합 |
MVVM (거의 사용 안 함) | Unity는 XAML 기반이 아니고, 바인딩 기능이 없기 때문에 MVVM은 사용하기 어렵고 비효율적 |
ECS (Entity Component System) | Unity DOTS에서 쓰이는 고성능 데이터 중심 설계 방식. 복잡한 게임에선 효율적으로 사용됨 |
MVP, Clean Architecture | 중·대형 게임에서 관심사 분리를 위해 도입. 테스트 가능한 구조를 원할 때 사용 |
1. 컴포넌트 기반 아키텍처 (Component-Based Architecture)
개념
Unity의 기본 아키텍처로, 모든 게임 오브젝트(GameObject)는 다양한 컴포넌트(Component)를 조합하여 구성된다.
각 컴포넌트는 특정 기능을 담당하며, 이러한 조합을 통해 복잡한 동작을 구현할 수 있다.
Unity Manual: Introduction to components
특징
- 모듈화: 기능별로 컴포넌트를 분리하여 관리할 수 있다.
- 재사용성: 동일한 컴포넌트를 여러 오브젝트에 적용하여 코드의 재사용이 용이하다.
- 유연성: 필요에 따라 컴포넌트를 추가하거나 제거하여 오브젝트의 동작을 쉽게 변경할 수 있다.
2. ECS (Entity Component System)
개념
ECS는 Unity의 Data-Oriented Technology Stack (DOTS)의 핵심으로,
데이터 중심의 설계를 통해 성능을 극대화하는 아키텍처이다.
전통적인 컴포넌트 기반 아키텍처와 달리,
ECS는 데이터와 로직을 명확히 분리하여 대규모 게임에서의 성능 향상을 목표로 한다.
Unity Manual: Entity Component System
Unity 공식 사이트: ECS for Unity
구성 요소
- Entity: 고유 식별자를 가진 객체로, 컴포넌트의 컨테이너 역할
- Component: 데이터를 담는 구조체로, 로직은 포함하지 않음.
- System: 컴포넌트를 처리하는 로직을 담고 있으며, 특정 조건에 맞는 엔티티들을 대상으로 동작
특징
- 고성능: 데이터 중심 설계를 통해 캐시 효율성을 높이고, 병렬 처리를 활용하여 성능을 향상
- 확장성: 대규모 프로젝트에서의 복잡한 시스템을 효율적으로 관리
- 유지보수성: 데이터와 로직의 분리를 통해 코드의 가독성과 유지보수성을 높임
3. 클린 아키텍처 (Clean Architecture)
개념
클린 아키텍처는 소프트웨어의 유지보수성과 확장성을 높이기 위한 아키텍처로,
의존성 역전 원칙(Dependency Inversion Principle)을 기반으로 계층 간의 의존성을 관리
Unity에서는 복잡한 프로젝트에서의 코드 구조를 명확히 하고, 테스트 용이성을 높이기 위해 적용
구성 계층
- Entity: 비즈니스 규칙을 담는 핵심 계층으로, 다른 계층에 의존하지 않음
- Use Case (Application): 애플리케이션의 특정 동작을 정의하며, Entity와 인터페이스를 통해 상호작용
- Interface Adapter: 외부 시스템(DB, UI 등)과의 인터페이스를 담당하며, Use Case와의 연결을 관리
- Framework & Driver: Unity의 MonoBehaviour, UI 시스템 등 외부 프레임워크와의 통합을 담당
특징
- 의존성 관리: 내부 계층은 외부 계층에 의존하지 않으며, 인터페이스를 통해 의존성을 역전
- 테스트 용이성: 비즈니스 로직이 외부 프레임워크에 의존하지 않으므로, 단위 테스트가 용이
- 유지보수성: 계층별로 책임이 명확히 분리되어 있어, 코드의 변경이 다른 부분에 미치는 영향을 최소화
Unity에서의 적용 사례
GitHub 예제: UnitySimpleCleanArchitecture
Unity 학습 자료: Clean Architecture for Unity
아키텍처 비교 요약
아키텍처 | 주요 특징 | 적용 사례 및 공식 문서 |
컴포넌트 기반 | 모듈화, 재사용성, 유연성 | Unity Manual |
ECS | 고성능, 데이터 중심 설계, 병렬 처리 지원 | ECS for Unity |
클린 아키텍처 | 의존성 역전, 테스트 용이성, 유지보수성 향상 | UnitySimpleCleanArchitecture |
https://learn.microsoft.com/en-us/dotnet/fundamentals/
.NET documentation
Learn about .NET, an open-source developer platform for building many different types of applications.
learn.microsoft.com
https://learn.microsoft.com/en-us/dotnet/core/introduction?utm_source=chatgpt.com