Dart 튜토리얼 18편: 패키지 제작과 구조(dart create·lib/src·package layout·패키지 페이지)

요약#

핵심 요지#

  • 문제 정의: 패키지를 “만드는 것”은 시작일 뿐이고, 공개 API 경계(lib vs lib/src)와 문서(README/CHANGELOG), 예제 구조가 없으면 유지보수가 어려워진다.
  • 핵심 주장: 패키지는 dart create -t package1로 시작하고, 공개 API는 lib/에, 구현은 lib/src/2에 두며, 공개 표면은 lib/<package>.dart에서 export3로 정리하는 방식이 제시된다.
  • 주요 근거: lib/src는 외부에서 import하면 안 되는 것으로 설명되고, show4로 export 대상을 제한하는 예시가 제시된다.
  • 실무 기준: “(1) 패키지 생성 → (2) 공개 API 파일 구성 → (3) README/CHANGELOG 작성 → (4) 예제 코드/문서 형식 정리”를 한 번에 잡아두면, 배포와 사용성이 같이 좋아진다.

문서가 설명하는 범위#

  • dart create -t package로 패키지 기본 구조를 만드는 방법
  • liblib/src 경계, 공개 API를 export로 구성하는 방법
  • README.md/CHANGELOG.md 형식과 패키지 페이지 작성 팁(코드 블록에 dart 지정 등)

읽는 시간: 13분 | 난이도: 중급


참고 자료#


문제 상황#

패키지는 “다른 사람이 가져다 쓰는 코드”입니다.
따라서 폴더 구조와 공개 API 경계가 흐리면, 외부 사용자에게 의도치 않은 구현이 노출되고, 작은 변경도 큰 변경으로 느껴집니다.
또한 README/CHANGELOG/예제가 없으면 “어떻게 쓰는지”를 사용자가 스스로 추측해야 합니다.
그래서 패키지는 코드만이 아니라 구조와 문서까지 포함해 설계해야 합니다.


해결 방법#

단계 1: dart create -t package로 패키지 골격을 만들기#

Why#

NOTE

패키지의 최소 구조(예: pubspec.yaml, lib/)를 수동으로 만들면 빠르게 누락이 생길 수 있습니다.
초기 구조는 템플릿을 쓰는 흐름이 제시됩니다.

What#

NOTE

패키지 템플릿으로 새 패키지를 만들 때는 dart create-t package를 사용합니다.

How#

TIP

패키지 생성 명령은 다음과 같습니다.

Terminal window
$ dart create -t package <PACKAGE_NAME>

Watch out#

WARNING

패키지 생성 이후에도 “공개 API 경계”와 “문서/예제”는 직접 정리해야 합니다.
즉, 템플릿은 시작일 뿐이며, 구조를 의도대로 다듬는 단계가 필요합니다.

결론: 패키지는 템플릿으로 시작하고, 바로 “공개 API 경계” 설계로 넘어갑니다.


단계 2: lib는 공개, lib/src는 구현으로 분리하기#

Why#

NOTE

구현 코드가 외부에 직접 노출되면, 사용자가 구현 세부에 의존하게 됩니다.
그 상태에서 리팩터링을 하면, 사용자 코드가 깨지기 쉬워집니다.

What#

NOTE

lib/는 다른 패키지가 import할 수 있는 공개 라이브러리 위치로 설명됩니다.
반면 lib/src/ 아래 구현 코드는 “사적인 구현”으로 취급되며, 외부에서 import할 필요가 없다고 설명됩니다.

How#

TIP

공개 API는 lib/<package>.dart 같은 “메인 라이브러리 파일”에서 export로 모아서 제공하는 방식이 제시됩니다.
또한 show로 export할 심볼을 제한해, 공개 표면을 명확히 할 수 있습니다.

export 'src/cascade.dart' show Cascade;
export 'src/handler.dart' show Handler;
export 'src/hijack_exception.dart' show HijackException;
export 'src/middleware.dart' show Middleware, createMiddleware;
export 'src/middleware/add_chunked_encoding.dart' show addChunkedEncoding;
export 'src/middleware/logger.dart' show logRequests;
export 'src/middleware_extensions.dart' show MiddlewareExtensions;
export 'src/pipeline.dart' show Pipeline;
export 'src/request.dart' show Request;
export 'src/response.dart' show Response;
export 'src/server.dart' show Server;
export 'src/server_handler.dart' show ServerHandler;

Watch out#

WARNING

part5 지시문이 언급되지만, 일반적인 코드 분할 목적이라면 “작은 라이브러리(미니 라이브러리)”로 나누는 방향이 권장되는 것으로 설명됩니다.
즉, 여러 파일을 한 라이브러리로 묶는 방식은 신중하게 선택해야 합니다.

결론: 공개 API는 lib/, 구현은 lib/src/로 분리하고, export로 공개 표면을 의도대로 구성합니다.


단계 3: README/CHANGELOG로 “사용자 관점” 정보를 제공하기#

Why#

NOTE

패키지 사용자는 코드를 열어보기 전에 README부터 봅니다.
업그레이드할 때는 CHANGELOG를 보고 “무엇이 바뀌었는지”를 판단합니다.

What#

NOTE

README.md는 패키지 페이지에 렌더링되어 표시된다고 설명됩니다.
CHANGELOG.md는 릴리즈별 섹션과 버전 헤딩 형식이 제시됩니다.

How#

TIP

CHANGELOG.md 예시는 다음 형식이 제시됩니다.

# 1.0.1
* Fixed missing exclamation mark in `sayHi()` method.
# 1.0.0
* **Breaking change:** Removed deprecated `sayHello()` method.
* Initial stable release.
## Upgrading from 0.1.x
Change all calls to `sayHello()` to instead be to `sayHi()`.
# 0.1.1
* Deprecated the `sayHello()` method; use `sayHi()` instead.
# 0.1.0
* Initial development release.

Watch out#

WARNING

CHANGELOG는 도구가 파싱할 수 있도록 “버전마다 섹션/일관된 헤딩 레벨/버전 번호 포함” 같은 규칙이 제시됩니다.
즉, 형식을 제각각으로 쓰면 자동화 도구와 호환성이 떨어질 수 있습니다.

결론: README/CHANGELOG는 패키지의 “사용법/변경 이력”을 전달하는 핵심 파일이므로, 형식부터 맞춥니다.


단계 4: 패키지 페이지/예제 코드는 “복사 가능한 예시 + 올바른 코드 블록”으로 구성하기#

Why#

NOTE

사용자는 패키지 페이지에서 “바로 복사해서 실행”할 수 있는 예시를 원합니다.
예시가 없거나 읽기 어렵다면, 사용자는 패키지를 떠나기 쉽습니다.

What#

NOTE

README에 “Get started/Usage” 섹션과 이해하기 쉬운 코드 샘플을 넣는 팁이 제시됩니다.
또한 코드 블록은 ```dart 형태로 Dart 문법 강조를 적용하는 팁이 제시됩니다.

How#

TIP

다음처럼 코드 블록에 dart를 지정하면 Dart 문법 강조가 적용됩니다.

final like = 'this';

Watch out#

WARNING

예제 코드는 “작고 복사 가능한 단위”가 기본이며, 더 큰 예시는 example/ 디렉터리에 두는 흐름이 언급됩니다.
즉, README에 모든 것을 넣기보다는 “페이지 + 예제 디렉터리”로 역할을 분리하는 편이 좋습니다.

결론: 패키지 페이지는 “복사 가능한 최소 예시 + 올바른 코드 블록(````dart`)“을 기본으로 구성합니다.

Footnotes#

  1. dart create(dart create): 템플릿을 기반으로 프로젝트/패키지 구조를 생성하는 도구다.

  2. lib/src(lib/src): 패키지 내부 구현을 두는 관례적인 디렉터리다.

  3. export(export): 다른 라이브러리의 API를 재노출(re-export)하는 지시문이다.

  4. show(show): export/import에서 노출할 심볼을 제한하는 문법이다.

  5. part(part): 하나의 라이브러리를 여러 파일로 분리하는 지시문이다.

공유

이 글이 도움이 되었다면 다른 사람과 공유해주세요!

Dart 튜토리얼 18편: 패키지 제작과 구조(dart create·lib/src·package layout·패키지 페이지)
https://moodturnpost.net/posts/dart/dart-package-creation-layout/
작성자
Moodturn
게시일
2026-01-04
Moodturn

목차