.NET이란

Hun·2일 전

commit

목록 보기
4/4
post-thumbnail

🏎️

📌 .NET이란?

.NET은 마이크로소프트가 만든 개발 플랫폼입니다.
언어 하나를 말하는 게 아니라, 언어 + 컴파일러 + 런타임 + 표준 라이브러리 + 도구를 묶은 생태계 전체를 말해요.

  • 주 언어: C# (그 외 F#, VB.NET)
  • 웹: ASP.NET Core
  • ORM: Entity Framework Core
  • 패키지 관리: NuGet

자바로 치면 "Java 언어 + JDK + JVM + Spring + Maven" 을 한 회사가 통째로 만든 느낌입니다.


📜 이름이 헷갈리는 이유

.NET은 이름 변천이 꽤 복잡합니다.

시기이름특징
2002~.NET Framework윈도우 전용, 기업 레거시 시스템에 아직 많이 남아 있음
2016~.NET Core오픈소스, 크로스 플랫폼 (윈도우 · 리눅스 · 맥)
2020~.NET 5, 6, 7 ...Core를 기반으로 이름을 통합. 이후 그냥 ".NET + 버전 숫자"

그래서 현장에서 ".NET"이라고 하면

  • 오래된 윈도우 서버의 .NET Framework 4.x 일 수도 있고
  • 리눅스 컨테이너에서 도는 최신 .NET 일 수도 있습니다

둘은 호환이 완전하지 않아서 "어떤 .NET이냐" 를 먼저 확인하는 게 중요해요.


🏗️ .NET의 구조

[C# 소스코드]
      │  컴파일 (Roslyn 컴파일러)
      ▼
[IL (중간 언어)] ── .dll / .exe (어셈블리)
      │  실행 시
      ▼
[CLR (Common Language Runtime)]
      │  JIT 컴파일
      ▼
[기계어] → CPU에서 실행
구성 요소역할
RoslynC# 소스를 IL로 컴파일하는 컴파일러
IL (Intermediate Language)OS · CPU에 독립적인 중간 코드
어셈블리 (.dll / .exe)IL과 메타데이터를 담은 배포 단위
CLRIL을 실행하는 런타임. JIT, GC, 예외 처리, 타입 안전성 담당
BCL (Base Class Library)컬렉션, 파일, 네트워크 등 기본 라이브러리
CTS / CLS여러 .NET 언어가 서로 호환되도록 하는 공통 타입 규칙

어디서 많이 본 구조죠? 맞습니다. 자바와 거의 같은 구조입니다.


☕ 자바와 1:1 비교

역할Java.NET
대표 언어Java (Kotlin, Scala)C# (F#, VB.NET)
컴파일러javacRoslyn (csc)
중간 코드바이트코드 (.class)IL
배포 단위.jar어셈블리 (.dll)
런타임JVMCLR
JIT 컴파일러HotSpotRyuJIT
기본 라이브러리JDK 클래스 라이브러리BCL
빌드 · 패키지Maven / Gradledotnet CLI · MSBuild / NuGet
웹 프레임워크Spring BootASP.NET Core
ORMJPA / HibernateEntity Framework Core
네이티브 컴파일GraalVM Native ImageNative AOT

코드로 보면

// Java
public class Hello {
    public static void main(String[] args) {
        List<Integer> nums = List.of(1, 2, 3, 4);
        List<Integer> evens = nums.stream()
                .filter(n -> n % 2 == 0)
                .toList();
        System.out.println(evens);
    }
}
// C#
var nums = new List<int> { 1, 2, 3, 4 };
var evens = nums.Where(n => n % 2 == 0).ToList();   // LINQ
Console.WriteLine(string.Join(", ", evens));

C#은 최상위 문(top-level statements)을 지원해서 class, Main 없이 바로 코드를 쓸 수 있습니다.
자바의 Stream API에 해당하는 게 LINQ 예요.


🔍 구조는 같은데, 뭐가 다를까?

1. 누가 만들고 관리하나

  • Java: 언어 스펙이 있고, 구현체는 여러 회사가 만듦 (OpenJDK, Oracle JDK, Temurin, Corretto 등)
  • .NET: 사실상 마이크로소프트 단일 주도 (오픈소스이고 .NET Foundation이 있지만 개발은 MS 중심)

2. 제네릭

// Java - 타입 소거 (Type Erasure)
List<String> a = new ArrayList<>();
List<Integer> b = new ArrayList<>();
// 런타임에는 둘 다 그냥 ArrayList
// C# - 런타임에도 타입 정보가 살아있음 (Reified Generics)
var a = new List<string>();
var b = new List<int>();
// 런타임에도 List<string>, List<int>로 구분됨

자바는 실행 시점에 제네릭 타입 정보가 지워지고, .NET은 남아 있습니다.
그래서 .NET은 List<int>처럼 기본 타입을 박싱 없이 다룰 수 있어 성능상 유리한 경우가 있어요.

3. 값 타입 (struct)

  • .NET: struct로 사용자 정의 값 타입을 만들 수 있음 (힙이 아닌 스택에 할당 가능)
  • Java: 값 타입은 int, double 같은 기본형만. 사용자 정의 값 타입은 Project Valhalla 로 개발 중

4. 언어 기능의 속도

C#은 비동기(async/await), LINQ, 프로퍼티(get; set;) 같은 기능을 비교적 일찍 도입했고,
Java는 하위 호환성을 중시해서 천천히, 대신 신중하게 기능을 추가하는 편입니다. (최근엔 Record, Virtual Thread 등으로 빠르게 따라오는 중)


⚖️ .NET의 장단점

✅ 장점

  • 툴 통합이 강력함 — Visual Studio, Rider, dotnet CLI 하나로 생성 · 빌드 · 테스트 · 배포까지
  • 성능 — ASP.NET Core는 웹 프레임워크 벤치마크에서 상위권으로 자주 언급됨
  • 언어가 현대적 — 새로운 문법 도입이 빠름
  • MS 생태계와 궁합 — Windows Server, SQL Server, Azure, Active Directory
  • 활용 범위가 넓음 — 웹, 데스크톱(WPF, WinForms, MAUI), 게임(Unity가 C# 사용)

❌ 단점

  • 국내 시장에서는 Java가 압도적 — 특히 SI · 공공 · 금융은 Java(전자정부 프레임워크, Spring) 중심이라 채용 공고 수가 적음
  • 레거시 분열 — 오래된 시스템은 윈도우 전용 .NET Framework라서, 최신 .NET으로 옮기려면 마이그레이션 비용이 큼
  • 벤더 의존성 — 방향성을 사실상 MS가 결정
  • 오픈소스 라이브러리 생태계 규모는 Java보다 작은 편

🤔 그럼 언제, 왜 쓰나?

  • 회사 인프라가 윈도우 · MS 중심일 때 (Windows Server, SQL Server, AD, Azure)
  • 제조업 MES, 사내 업무용 데스크톱 프로그램
  • 게임 개발 (Unity)
  • 이미 .NET Framework 레거시가 많은 회사의 유지보수 · 현대화

🔗 연계(EAI) 관점에서 본 .NET

고객사에 Java 시스템과 .NET 시스템이 섞여 있는 경우가 흔합니다.
특히 공장 쪽 MES나 윈도우 기반 사내 시스템은 .NET인 경우가 많아서,
직접 개발하진 않더라도 "상대 시스템이 .NET이다" 라는 걸 이해하고 있으면 연계 협의가 훨씬 수월해요.

💡 EAI 솔루션의 플랫폼과 연결 대상 시스템의 플랫폼은 상관없습니다.
자바 기반 TIBCO도 .NET 시스템과 DB, HTTP, MQ, 파일 같은 표준 방식으로 얼마든지 연계합니다.

.NET 진영의 EAI는?

.NET 진영의 대표 EAI는 마이크로소프트의 BizTalk Server 입니다.

  • 윈도우 서버 + .NET Framework 기반의 EAI/ESB 솔루션
  • 어댑터, 맵(변환), 오케스트레이션, 비즈니스 룰 엔진 등 EAI 기능을 두루 갖춤
  • 특히 EDI(기업 간 전자문서 교환) 쪽에서 강점

다만 지금은 세대교체 중입니다.

항목일정
마지막 버전BizTalk Server 2020
판매 종료 (예정)2027년 3월
메인스트림 지원 종료2028년 4월
연장 지원 종료2030년 4월
후속 제품Azure Logic Apps (Azure Integration Services)

국내에서 TIBCO, webMethods 가 대표로 꼽히는 이유도 여기서 보입니다.
둘 다 자바 기반이라 윈도우 · 리눅스 · 유닉스를 가리지 않고, 특정 플랫폼에 묶이지 않아서
유닉스 · 리눅스 서버가 많은 금융 · 대기업 환경과 자바 중심의 국내 SI 생태계에 잘 맞았거든요.


🌐 다른 대표적인 실행 구조들

Java와 .NET은 "중간 코드 + 가상 머신(런타임)" 구조입니다. 다른 대표적인 구조들은 이렇습니다.

구조대표 언어실행 방식특징
중간 코드 + VMJava, C#소스 → 중간 코드 → VM이 JIT로 실행한 번 빌드로 여러 OS, 실행 중 최적화
네이티브 컴파일C, C++, Go, Rust소스 → 바로 기계어빠른 시작, VM 없음, OS · CPU별로 따로 빌드
인터프리터Python, Ruby소스 → 바이트코드 → 한 줄씩 해석 실행개발이 빠르고 유연, 실행 속도는 상대적으로 느림
JS 엔진JavaScript (Node.js)V8 엔진이 JS를 JIT 컴파일이벤트 루프 기반 비동기, 웹과 서버를 같은 언어로
BEAM VMErlang, ElixirBEAM 가상 머신의 경량 프로세스장애 격리 · 고가용성, 통신 · 메신저 계열에서 강함

최근엔 경계도 흐려지는 중이라, Java(GraalVM)와 .NET(Native AOT)도 네이티브 컴파일을 지원합니다.

📎 네이티브 컴파일은 다음 글 (링크 예정) 에서 한번 다뤄볼까 합니다.


📝 한 줄 정리

.NET = 마이크로소프트판 JVM 생태계.
구조는 자바와 거의 쌍둥이고, 차이는 누가 관리하느냐 · 제네릭 · 값 타입 · 생태계가 강한 영역에 있다.

profile
구른다

0개의 댓글