내부 패키지와 워크스페이스
internal/, replace 지시문 및 go work
내부 패키지와 워크스페이스은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
internal/ 디렉터리
internal/ 디렉터리 안의 패키지는 부모 디렉터리 트리 안에 있는 코드만 가져올 수 있습니다. 이를 통해 패키지 캡슐화를 강제합니다:
// Project structure:
// myapp/
// main.go
// internal/
// auth/auth.go <- can only be imported by myapp/
// db/db.go <- can only be imported by myapp/
// api/
// handlers.go <- can import myapp/internal/auth
// External package CANNOT do:
// import "myapp/internal/auth" <- compile errorinternal/ 패키지 사용하기
같은 모듈 안에서 internal/ 디렉터리보다 상위에 있는 코드는 내부 패키지를 자유롭게 가져올 수 있습니다:
// myapp/api/handlers.go
package api
import (
"myapp/internal/auth"
"myapp/internal/db"
)
func GetUser(id int) (*db.User, error) {
if !auth.IsValid() {
return nil, auth.ErrUnauthorized
}
return db.FindUser(id)
}internal/을 사용하는 이유
internal/ 규칙의 이점:
- 다른 모듈이 구현 세부 사항에 의존하지 못하게 합니다
- 외부 호출자를 중단시키지 않고 자유롭게 구조를 변경할 수 있습니다
- 공개 API의 일부가 아니라는 점을 명확히 나타냅니다
- 표준 Go 도구가 컴파일 시 이 제한을 적용합니다
Go 작업 공간 — go work
Go 1.18에서는 replace 지시문 없이 여러 로컬 모듈을 동시에 작업할 수 있도록 작업 공간이 도입되었습니다:
# Create a workspace in parent directory:
go work init ./myapp ./mylib
# Creates go.work:
# go 1.21
# use (
# ./myapp
# ./mylib
# )
# Now myapp can import mylib without replace directivesgo work sync
go work sync로 작업 공간의 의존성을 동기화합니다:
# go.work file:
go 1.21
use (
./api
./worker
./shared
)
# Sync all module dependencies:
go work sync
# Build across all workspace modules:
go build ./...
# Test across all workspace modules:
go test ./...작업 공간과 replace 지시문 비교
로컬에서 여러 모듈을 개발하는 두 가지 접근 방식을 비교합니다:
// BEFORE workspaces (cumbersome):
// go.mod in myapp:
// replace github.com/me/mylib => ../mylib
// Must remove before publishing!
// WITH workspaces (cleaner):
// go.work at root:
// use (./myapp ./mylib)
// go.mod files stay clean — go.work is gitignored작업 공간 사용 사례
다음과 같은 경우 Go 작업 공간을 사용합니다:
- 라이브러리와 이를 사용하는 프로그램을 동시에 개발할 때
- 서로를 참조하는 여러 모듈이 있는 모노레포에서 작업할 때
- 게시하기 전에 공유 모듈의 변경 사항을 테스트할 때
- 앱과 함께 의존성의 분기를 작업할 때
go work add와 go work use
go work 하위 명령으로 작업 공간 항목을 관리합니다:
# Add a module to the workspace
go work use ./newservice
# Remove a module from workspace
go work use -r ./oldservice
# Edit go.work directly (opens $EDITOR):
go work edit
# go.work should usually be gitignored:
echo "go.work" >> .gitignore
echo "go.work.sum" >> .gitignoreinternal/과 작업 공간 함께 사용하기
모노레포에서는 내부 패키지와 작업 공간을 자연스럽게 함께 사용할 수 있습니다:
// Monorepo structure:
// services/
// go.work
// auth-service/
// internal/tokens/ <- private to auth-service
// order-service/
// internal/pricing/ <- private to order-service
// shared/
// models/ <- shared across services
// go.work:
// use (./auth-service ./order-service ./shared)패키지 구성 모범 사례
Go 프로젝트 배치 권장 사항:
- 소규모 프로젝트에서는 평평한 패키지 구조를 사용하고, 너무 이른 구성을 피합니다
- 외부에서 사용하지 않을 구현 세부 사항에는
internal/을 사용합니다 - CLI main 패키지는
cmd/appname/아래에 둡니다 - 여러 모듈이 있는 저장소에는 작업 공간을 사용하되
go.work는 gitignore에 추가합니다 - 깊은 중첩을 피하고 패키지 계층을 최대 3~4단계로 유지합니다
빠른 확인
internal/ 디렉터리의 패키지를 가져올 수 있는 주체는 누구인가요?
요약: 내부 패키지와 작업 공간
요약:
internal/은 가져오기를 부모 디렉터리 트리로 제한하며 컴파일러가 이를 적용합니다- 외부 사용자가 구현 세부 사항을 볼 수 없도록
internal/을 사용합니다 go work init은 여러 모듈을 로컬에서 개발하기 위한 작업 공간을 생성합니다- 작업 공간은 로컬 개발에서
replace지시문을 대신합니다 go.work와go.work.sum을 Gitignore에 추가합니다
자주 묻는 질문
“내부 패키지와 워크스페이스” 강의는 무료인가요?
네 — “내부 패키지와 워크스페이스” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“내부 패키지와 워크스페이스”에서 뭘 배우나요?
internal/, replace 지시문 및 go work 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“내부 패키지와 워크스페이스” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 패키지: Go 코드 구성
- go mod를 사용한 Go 모듈
- 외부 의존성 추가
- 내부 패키지와 워크스페이스