Go 1.16: Go 모듈에서 버전 철회

발행: (2026년 1월 12일 오전 12:59 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

서문

Go Modules는 Go 1.11에서 공식적으로 도입되었으며, Go 1.16부터 기본적으로 활성화됩니다. 패키지가 이미 배포된 경우 다음과 같은 상황을 마주할 수 있습니다:

  • 릴리스된 버전에서 심각한 문제가 발견되어 다른 사람이 사용하지 못하도록 하고 싶을 때.
  • 잘못된 버전 번호로 실수해서 배포했을 때(예: 의도한 v0.4.0 대신 v1.0.0을 배포).

패키지가 이미 배포된 상황에서는 모듈 버전 리트랙션을 통해 문제를 알리고 해당 버전의 향후 사용을 차단해야 합니다.

이 글에서는 Go 1.16에 추가된(아직 널리 알려지지 않은) 리트랙션 기능을 설명하고, 사용 방법을 시연합니다.

TL;DR

리트랙션이란?

리트랙션은 특정 모듈 버전을 retracted(리트랙션) 상태로 표시하여, 해당 버전이 문제를 포함하고 있으므로 사용하면 안 된다는 것을 나타냅니다.

왜 리트랙션이 필요한가?

전형적인 시나리오:

  1. 중대한 버그가 발견되어 이미 배포된 버전을 사용하고 있는 다른 프로젝트에 영향을 미칠 때.
  2. 잘못된 버전 번호가 릴리스된 경우(예: v0.4.0v1.0.0으로 잘못 배포) 다른 프로젝트가 이를 의존하고 있을 때.

리트랙션을 통해 모듈 작성자는 이러한 문제를 go get/go list 명령을 통해 직접 사용자에게 전달할 수 있습니다.

이전에는 리트랙션을 어떻게 처리했는가?

Go 1.16 이전에는 내장된 리트랙션 메커니즘이 없었습니다. 작성자는 README에 주석을 남길 수 있었지만, go get이 자동으로 해당 정보를 표시할 방법은 없었습니다.

Go Modules 리트랙션 사용법

다음 예시는 공식 Go Playground 데모를 기반으로 합니다.

문제 1: 릴리스된 버전에서 심각한 문제가 발견됨

모듈 gopher.live/ue0ddd4a99c02/proverb를 관리하고 있으며 이미 v0.2.0을 릴리스했다고 가정합니다. 심각한 버그를 발견했으므로 해당 버전을 리트랙션하고 싶습니다.

  1. retract 지시문을 go.mod에 추가:

    go mod edit -retract=v0.2.0

    go.mod는 다음과 같이 보입니다:

    module gopher.live/ue0ddd4a99c02/proverb
    
    go 1.16
    
    // Go proverb was totally wrong
    retract v0.2.0
  2. 새 버전을 커밋하고 태그 지정(예: v0.3.0):

    git add -A
    git commit -m "Fix severe error in Go proverb"
    git push origin main
    
    git tag v0.3.0
    git push origin v0.3.0
  3. 리트랙션된 버전을 가져오려 할 때 경고 확인:

    go get gopher.live/ue0ddd4a99c02/proverb@v0.2.0
    go: warning: gopher.live/ue0ddd4a99c02/proverb@v0.2.0: retracted by module author: Go proverb was totally wrong
    go: to switch to the latest unretracted version, run:
        go get gopher.live/ue0ddd4a99c02/proverb@latest
    go get: downgraded gopher.live/ue0ddd4a99c02/proverb v0.3.0 => v0.2.0

    이 경고는 v0.2.0을 더 이상 사용하면 안 된다는 점을 명확히 알려 주며, 사용자를 최신 리트랙션되지 않은 버전으로 안내합니다.

관련 질문

  • 리트랙션 정보를 보려면 go get(또는 go list)을 실행해야 하나요?
    네. 리트랙션 메타데이터는 go get, go list 등 모듈을 조회할 때 함께 가져옵니다.

관련 학습 자료

Back to Blog

관련 글

더 보기 »

Go의 비밀스러운 삶: Concurrency

경쟁 조건(race condition)의 혼란에 질서를 부여한다. Chapter 15: Sharing by Communicating 아카이브는 그 화요일에 유난히 시끄러웠다. 목소리 때문이 아니라 t...

Go에서 우아한 도메인 주도 설계 객체

❓ Go에서 도메인 객체를 어떻게 정의하시나요? Go는 전형적인 객체‑지향 언어가 아닙니다. Domain‑Driven Design(DDD) 같은 개념을 구현하려고 할 때, 예를 들어 En…