0Pricing
Go Academy · 강의

내부 패키지와 워크스페이스

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 error

internal/ 패키지 사용하기

같은 모듈 안에서 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 directives

go 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" >> .gitignore

internal/과 작업 공간 함께 사용하기

모노레포에서는 내부 패키지와 작업 공간을 자연스럽게 함께 사용할 수 있습니다:

// 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 패키지: Go 코드 구성
  2. go mod를 사용한 Go 모듈
  3. 외부 의존성 추가
  4. 내부 패키지와 워크스페이스
← Go Academy(으)로 돌아가기