본문 바로가기
Golang

[Golang] Go 언어에서의 패키지 이름 짓기 (no under_scores or mixedCaps)

by gungle 2024. 8. 7.

Go 언어에서 패키지 이름은 코드의 가독성과 유지보수성에 중요한 역할을 한다. 패키지 이름은 간결하고 명확해야 하며, 공백이나 여러 어절을 사용할 수 없다. 이번 글에서는 Go 언어에서 패키지 이름을 짓는 방법과 그 중요성에 대해 알아본다.

 

패키지 이름의 중요성

Go 코드의 조직화는 패키지를 통해 이루어진다. 패키지 이름은 해당 패키지의 내용과 목적을 쉽게 이해할 수 있도록 도와준다. 잘 지어진 패키지 이름은 클라이언트 코드가 패키지를 어떻게 사용해야 하는지 명확하게 나타내며, 패키지 유지보수자가 패키지의 내용을 관리하는 데에도 도움이 된다.

 

패키지 이름 짓기 규칙과 관습

  1. 소문자 사용: Go의 패키지 이름은 모두 소문자로 작성되어야 한다. 대문자를 포함하는 패키지 이름은 권장되지 않으며, 일반적으로 사용되지 않는다. 이는 URL과 경로에서 대소문자 구분 문제를 피하고, 일관된 접근 방식을 유지하기 위함이다.
  2. 간결하고 명확한 이름: 패키지 이름은 해당 패키지의 기능을 명확하게 설명할 수 있도록 간결하게 선택된다. 예를 들어, net, os, fmt 같은 이름은 각각 네트워킹, 운영 체제 기능, 포맷팅 기능을 다루는 패키지임을 직관적으로 이해할 수 있게 한다.
  3. 언더스코어(_)나 대시(-) 사용 금지: 패키지 이름에 언더스코어(_)나 대시(-)를 사용하는 것은 허용되지 않는다. 대신, 이름이 여러 단어로 구성될 필요가 있는 경우 간결하게 연결하여 사용한다. 예를 들어, httputils나 appconfig 같이 표현할 수 있다.
  4. 복합어 사용: Go에서는 패키지 이름으로 공백이나 여러 어절을 사용할 수 없다. 만약 "only kakao"와 같은 이름을 패키지 이름으로 사용하고 싶다면, onlykakao 혹은 kakaoonly와 같이 연결하여 사용해야 한다.
  5. 경로와의 관계: 패키지 경로의 마지막 요소가 패키지 이름으로 사용된다. 예를 들어, github.com/user/stringutils라는 저장소에 있는 패키지는 일반적으로 stringutils라는 이름을 사용한다. 이는 패키지를 외부에서 참조할 때의 식별자 역할을 하므로 명확하게 정의하는 것이 중요하다.

 

나쁜 패키지 이름 피하기

나쁜 패키지 이름은 코드 탐색과 유지보수를 어렵게 만든다. 예를 들어, util, common, misc와 같은 이름은 패키지 내용이 무엇인지 알 수 없게 만든다. 이러한 패키지는 시간이 지남에 따라 의존성이 증가하여 컴파일 속도를 크게 느리게 만들 수 있다. 이러한 패키지를 수정하려면 공통 이름 요소를 가진 타입과 함수를 찾아 별도의 패키지로 분리해야 한다.

 

나쁜 패키지 이름의 예시와 해결 방법

예시:

package util

func NewStringSet(...string) map[string]bool {...}
func SortStringSet(map[string]bool) []string {...}

클라이언트 코드:

set := util.NewStringSet("c", "a", "b")
fmt.Println(util.SortStringSet(set))

위의 예제에서는 util 패키지 이름이 너무 일반적이어서 패키지의 내용을 이해하기 어렵다. 이러한 패키지를 개선하기 위해 타입과 함수 이름에 따라 별도의 패키지로 분리한다.

해결 방법:

package stringset

func New(...string) map[string]bool {...}
func Sort(map[string]bool) []string {...}

클라이언트 코드:

set := stringset.New("c", "a", "b")
fmt.Println(stringset.Sort(set))

이렇게 분리하면 새로운 패키지의 목적이 더욱 명확해진다.

 

네이밍 충돌 피하기

1. 불필요한 패키지 이름 충돌 피하기:

  • 디렉토리가 다른 패키지들이 동일한 이름을 가질 수 있지만, 자주 함께 사용되는 패키지들은 서로 다른 이름을 가져야 혼란을 줄일 수 있다.
  • 특히 인기 있는 표준 패키지 이름(io, http 등)을 사용하는 것을 피해야 한다.

2. 단일 패키지에 모든 API를 넣지 않기:

  • 많은 프로그래머가 모든 인터페이스를 하나의 패키지에 넣는 실수를 범한다. api, types, interfaces 등의 이름으로 패키지를 만들면 유지보수가 어렵고, 충돌이 발생할 수 있다.
  • 대신, 공용 패키지와 구현 패키지를 디렉토리로 분리하여 관리한다.

 

좋은 패키지 이름의 예

좋은 패키지 이름은 짧고 명확해야 한다. 일반적으로 소문자로 작성되며, 밑줄(_)이나 혼합 대소문자(MixedCaps)를 사용하지 않는다. 보통 단순 명사 형태로 작성된다.

  • time: 시간 측정 및 표시 기능 제공
  • list: 이중 연결 리스트 구현
  • http: HTTP 클라이언트 및 서버 구현
// 좋은 예
package jsonutil

// 나쁜 예
package json_utils   // 언더스코어 사용 금지
package jsonData     // 대문자 사용 금지

 

결론

패키지 네이밍은 Go 프로그램에서 중요한 부분이다. 좋은 패키지 이름을 선택하고 코드를 잘 조직화하면 클라이언트가 패키지를 이해하고 사용하기 쉬워지며, 유지보수자도 패키지를 원활하게 확장할 수 있다. 이러한 네이밍 규칙과 관습을 따르면 Go 코드의 일관성과 가독성을 유지하는 데 도움이 된다.

 

참고

https://go.dev/blog/package-names