프로그래밍

👨‍💻 [Go] Go 에서 하위 패키지에 직접적인 접근을 막고, 상위 패키지를 통해서만 하위 패키지의 기능을 제공하려면, 어떻게 해야 하나요?

밝음의기둥 2025. 1. 15. 14:23
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Go 에서 하위 패키지에 직접적인 접근을 막고, 상위 패키지를 통해서만 하위 패키지의 기능을 제공하려면, 어떻게 해야 되는지 간략히 알아보았습니다.


질문 >

Go 에서 하위 패키지에 직접적인 접근을 막고, 상위 패키지를 통해서만 하위 패키지의 기능을 제공하려면, 어떻게 해야 하나요?

답변 >

Go에서 하위 패키지에 대한 직접적인 접근을 막고, 상위 패키지를 통해서만 하위 패키지의 기능을 제공하려면 다음 방법들을 활용할 수 있습니다.


1. Go의 접근 제어 규칙 이해

  • 공용(Exported) 요소: 이름이 대문자로 시작하면 패키지 외부에서 접근 가능.
  • 비공용(Unexported) 요소: 이름이 소문자로 시작하면 패키지 내부에서만 접근 가능.

이를 활용해 하위 패키지의 요소를 비공용으로 정의하고, 상위 패키지에서만 이를 래핑(wrapping)하여 외부에 공개할 수 있습니다.


2. 접근 제어 구조 설계

디렉토리 구조 예시

myproject/
├── main.go
├── utils/
│   ├── stringutils/
│   │   └── utils.go
│   └── public.go
└── go.mod


2.1. 하위 패키지 (stringutils/utils.go)

package stringutils

// reverse는 비공용 함수로, 패키지 외부에서는 접근 불가
func reverse(s string) string {
	runes := []rune(s)
	for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
		runes[i], runes[j] = runes[j], runes[i]
	}
	return string(runes)
}

2.2. 상위 패키지 (utils/public.go)

package utils

import "myproject/utils/stringutils"

// ReverseString은 하위 패키지의 비공용 함수 reverse를 래핑하여 제공
func ReverseString(s string) string {
	return stringutils.Reverse(s)
}

2.3. 메인 파일 (main.go)

package main

import (
	"fmt"
	"myproject/utils"
)

func main() {
	// 상위 패키지를 통해 하위 패키지의 기능 사용
	reversed := utils.ReverseString("hello")
	fmt.Println("Reversed String:", reversed)
}


3. 접근 제어의 주요 원칙

  1. 하위 패키지의 요소를 비공용으로 유지
    • 하위 패키지 내에서 소문자로 시작하는 함수, 변수, 상수만 정의.
    • 외부 패키지가 직접 접근하지 못하도록 설정.
  2. 상위 패키지를 통해 공용 인터페이스 제공
    • 상위 패키지에서 필요한 기능만 노출하고, 하위 패키지의 구현 세부사항은 감춥니다.

4. 추가 고려사항

4.1. 네임스페이스 충돌 방지

  • 상위 패키지와 하위 패키지의 이름이 명확히 구분되도록 설계합니다.

4.2. 패키지 간 의존성 관리

  • 하위 패키지와 상위 패키지 간 의존성을 최소화하고, 불필요한 상호 참조를 피합니다.

4.3. 인터페이스를 활용한 추상화

  • 상위 패키지에서 인터페이스를 정의하고, 하위 패키지가 이를 구현하도록 설계하여 더 큰 유연성을 제공합니다.

5. 장단점

장점

  1. 캡슐화 강화: 하위 패키지의 세부 구현을 숨겨, 외부에서 오용할 가능성을 줄입니다.
  2. 코드 변경 용이성: 하위 패키지의 구현이 변경되어도, 상위 패키지의 공용 인터페이스만 유지하면 외부 코드를 수정할 필요가 없습니다.
  3. 모듈화: 기능별로 패키지를 분리해 코드 구조를 명확히 하고 유지보수를 용이하게 만듭니다.

단점

  1. 추가적인 래핑 코드 필요: 상위 패키지에서 하위 패키지의 기능을 노출하기 위해 추가적인 래핑 코드가 필요합니다.
  2. 약간의 성능 오버헤드: 상위 패키지의 래핑으로 인해 함수 호출 비용이 약간 증가할 수 있습니다.

6. 요약

  • 하위 패키지의 요소를 비공용으로 정의(소문자 시작)하여 외부 접근을 막습니다.
  • 상위 패키지가 하위 패키지의 기능을 래핑해 필요한 기능만 공용으로 노출합니다.
  • 이 설계를 통해 코드 캡슐화와 유지보수성을 크게 향상시킬 수 있습니다.


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형