본문 바로가기
Language/Go

package name base, util, or common

by ocwokocw 2022. 6. 26.

- 출처: https://dave.cheney.net/2019/01/08/avoid-package-names-like-base-util-or-common

- package name

좋은 Go package를 작성하려면 이름을 잘 지어야 한다. 하나의 단어로 해당 package가 무엇을 하는지 간략하게 나타낼 수 있어야 한다.
 
package name을 보다보면 utility 라는 이름을 종종 볼 수 있다. 이런 package명은 관계없는 기능들이 많이 포함되어있어서 package 명을 보고 무엇을 제공하는지 알기가 힘들다.
 
utils나 helpers 같은 package 이름은 계층 구조가 깊은package를 개발하고 순환참조 없이 helper 기능들을 공유하기를 원할 때 사용하곤 한다. utility 기능들을 새로운 package로 추출하면 순환 참조 문제를 해결할수는 있지만 프로젝트의 설계 문제를 불러오며, 해당 이름이 사용 목적을 반영하지 못하고 순환 참조를 방지하는 기능만을 한다.
 
utils나 helpers package 문제를 해결하려면 어디서 참조되는지를 분석하여 관련 기능들을 호출 package로 옮겨야 한다. 이를 수행한 결과 중복된 코드가 발생하더라도 두 package 간의 종속성이 발생하는것보단 낫다. utility 기능이 여러 package 에서 사용되는 경우 각각 해당 설명을 포함할 수 있는 이름을 가진 단일 측면에 초점을 맞춘 여러 package가 더 낫다.
 
base, common과 같은 이름의 package들은 2개 이상의 연관된 package에서 공통적인 기능들, 예를 들어 client와 server간의 공통적인 type들, 혹은 server와 그의 mock객체가 있다고 할 때, 이를 리팩토링한 결과 별도 package로 분리될 때 나타난다. 솔루션은 client, server, common 코드를 하나의 package로 통합하여 package 수를 줄이는것이다.
 
예를 들어 net/http package는 client와 server package를 갖고 있지 않은 대신, client.go와 server.go 파일을 갖고 있고 각각은 해당 type을 보유하고 있다. transport.go는 HTTP client와 server 양측에서 사용되는 공통적인 메시지 전송 코드를 갖고 있다.
 
package명을 작성할때에는 해당 package가 무엇을 포함하고 있느냐가 아닌 무엇을 제공하느냐에 추점을 맞추어야 한다.
 
 

'Language > Go' 카테고리의 다른 글

Go - context (blog)  (0) 2022.11.13
Go - pipelines and cancellation  (0) 2022.10.21
Empty struct  (0) 2022.06.21
Zero value  (0) 2022.06.17
Error handling을 간단하게  (0) 2022.06.16

댓글