본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

C# 문서
C#
C# 시작하기기본 문법타입과 데이터프로젝트와 패키지오류 처리와 테스트핵심 개념: LINQ, 델리게이트, 비동기
토론

C# 안내서 · 4/6

프로젝트와 패키지

프로그램이 커지면 코드를 여러 프로젝트로 나누고, 다른 사람이 만든 라이브러리를 가져다 쓰게 됩니다. .NET에서는 이 일을 어셈블리, 프로젝트, 솔루션, NuGet 패키지라는 네 가지 단위로 다룹니다. 이 장에서는 각 단위의 관계를 정리하고, 프로젝트 참조와 패키지 추가, 그리고 배포용 결과물을 만드는 방법을 살펴봅니다.

어셈블리 · 프로젝트 · 솔루션

단위설명
어셈블리빌드 결과물인 .dll(라이브러리) 또는 실행 파일입니다. 컴파일된 코드와 형식 정보(메타데이터)를 담습니다.
프로젝트.csproj 하나가 어셈블리 하나를 만듭니다. 소스 파일, 대상 프레임워크, 의존성을 정합니다.
솔루션여러 프로젝트를 묶어 한 번에 빌드 · 테스트하는 목록입니다. .sln 또는 새 XML 형식인 .slnx 파일입니다.
NuGet 패키지어셈블리와 메타데이터를 묶은 .nupkg 파일로, nuget.org 같은 저장소에서 내려받아 씁니다.

네임스페이스와 어셈블리는 별개의 개념입니다. 네임스페이스는 이름을 정리하는 논리적 단위이고, 어셈블리는 배포되는 물리적 단위입니다. 한 어셈블리에 여러 네임스페이스가 들어갈 수도 있고, 같은 네임스페이스가 여러 어셈블리에 걸칠 수도 있습니다.

솔루션과 여러 프로젝트 만들기

흔한 구조는 실행 프로젝트, 핵심 로직을 담은 클래스 라이브러리, 테스트 프로젝트를 한 솔루션에 두는 것입니다. 다음 명령으로 그 뼈대를 만들 수 있습니다.

mkdir Shop && cd Shop
dotnet new sln -n Shop
dotnet new classlib -o src/Shop.Core
dotnet new console -o src/Shop.Cli
dotnet sln add src/Shop.Core src/Shop.Cli

# Shop.Cli 가 Shop.Core 를 쓰도록 프로젝트 참조 추가
dotnet add src/Shop.Cli reference src/Shop.Core

dotnet build   # 솔루션 폴더에서 실행하면 모든 프로젝트를 빌드합니다

프로젝트 참조를 추가하면 Shop.Cli.csproj에 다음 항목이 생깁니다. 빌드할 때 참조된 프로젝트가 먼저 빌드되고, 그 어셈블리가 출력 폴더로 복사됩니다.

<ItemGroup>
  <ProjectReference Include="..\Shop.Core\Shop.Core.csproj" />
</ItemGroup>

접근 한정자와 어셈블리 경계

다른 프로젝트에서 쓸 수 있는 것은 public으로 선언한 타입과 멤버뿐입니다. internal은 같은 어셈블리 안에서만 보이므로, 라이브러리의 내부 구현을 감추는 데 씁니다. 최상위 타입에 접근 한정자를 생략하면 internal이 됩니다.

// src/Shop.Core/PriceCalculator.cs
namespace Shop.Core;

public static class PriceCalculator
{
    public static decimal WithTax(decimal price) => Round(price * (1 + TaxRate));

    internal const decimal TaxRate = 0.1m;          // 이 어셈블리 안에서만 보입니다

    private static decimal Round(decimal value) => Math.Round(value, 0);
}
// src/Shop.Cli/Program.cs
using Shop.Core;

Console.WriteLine(PriceCalculator.WithTax(10_000m)); // 11000
// PriceCalculator.TaxRate 는 internal 이라 여기서 쓸 수 없습니다

테스트 프로젝트에서 internal 멤버를 시험해야 한다면 라이브러리 쪽에 InternalsVisibleTo 특성을 지정해 특정 어셈블리에만 공개할 수 있습니다.

NuGet 패키지 사용

NuGet은 .NET의 패키지 관리자입니다. dotnet add package로 패키지를 추가하면 프로젝트 파일에 PackageReference가 기록되고, 빌드할 때 패키지가 자동으로 복원됩니다.

cd src/Shop.Cli
dotnet add package Humanizer           # 최신 안정 버전 추가
dotnet add package Humanizer --version <버전>  # 특정 버전 지정
dotnet list package                    # 참조 중인 패키지 보기
dotnet list package --outdated         # 새 버전이 있는 패키지 보기
dotnet remove package Humanizer        # 제거
dotnet restore                         # 패키지 복원만 따로 실행
using Humanizer;

Console.WriteLine("order_created_at".Humanize()); // Order created at
Console.WriteLine(TimeSpan.FromMinutes(95).Humanize(2)); // 1 hour, 35 minutes

패키지를 고를 때는 nuget.org에서 내려받기 수, 최근 업데이트, 라이선스, 대상 프레임워크를 확인합니다. 여러 프로젝트가 같은 패키지 버전을 써야 한다면 솔루션 루트의 Directory.Packages.props에서 버전을 한곳에 관리하는 중앙 패키지 관리를 쓸 수 있고, 공통 빌드 설정은 Directory.Build.props에 모아 둘 수 있습니다.

게시(publish)

dotnet build의 결과는 개발용입니다. 다른 컴퓨터에 배포할 결과물은 dotnet publish로 만듭니다.

# 프레임워크 종속: 대상 컴퓨터에 .NET 런타임이 있어야 합니다(결과물이 작음)
dotnet publish src/Shop.Cli -c Release -o out

# 자체 포함: 런타임까지 함께 담습니다(설치 없이 실행)
dotnet publish src/Shop.Cli -c Release -r linux-x64 --self-contained -o out-linux

# 단일 파일로 묶기
dotnet publish src/Shop.Cli -c Release -r win-x64 --self-contained -p:PublishSingleFile=true

-r은 대상 플랫폼을 뜻하는 런타임 식별자(RID)로, win-x64, linux-x64, osx-arm64 등이 있습니다. 시작 속도와 메모리가 중요하다면 프로젝트에 <PublishAot>true</PublishAot>를 넣어 네이티브 AOT로 컴파일할 수 있지만, 리플렉션을 많이 쓰는 라이브러리와는 맞지 않을 수 있습니다. 라이브러리를 NuGet 패키지로 만들어 공유하려면 dotnet pack -c Release를 실행합니다.

정리

  • 프로젝트 하나가 어셈블리 하나를 만들고, 솔루션은 여러 프로젝트를 묶습니다.
  • dotnet sln add로 솔루션에 프로젝트를 넣고, dotnet add reference로 프로젝트끼리 연결합니다.
  • 다른 어셈블리에 공개할 것은 public, 내부 구현은 internal로 선언합니다.
  • dotnet add package로 NuGet 패키지를 추가하면 PackageReference가 기록되고 빌드할 때 복원됩니다.
  • 배포용 결과물은 dotnet publish로 만들며, 프레임워크 종속 · 자체 포함 · 단일 파일 · 네이티브 AOT 중에서 고릅니다.
이 장에 대해 질문이 있나요?
이전 장타입과 데이터다음 장오류 처리와 테스트

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.