반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 상위 패키지가 하위 패키지를 래핑하는 방법은 어떻게 되는지 간략히 알아보았습니다.
질문 >
Go 에서 상위 패키지가 하위 패키지를 래핑하는 방법은 어떻게 되나요?
답변 >
Go에서 상위 패키지가 하위 패키지를 래핑(wrapping)하는 방법은 하위 패키지의 비공용(Unexported) 함수나 데이터를 감싸고, 상위 패키지에서 이를 공용(Exported) 인터페이스로 노출하는 방식입니다. 이를 통해 하위 패키지의 세부 구현을 숨기고, 외부에 필요한 기능만 제공합니다.
1. 디렉토리 구조
myproject/
├── main.go // 실행 파일
├── utils/ // 상위 패키지
│ ├── stringutils/ // 하위 패키지
│ │ └── utils.go
│ └── public.go // 상위 패키지 래퍼
└── go.mod // 모듈 설정 파일
2. 코드 예제
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. 주요 원칙
- 하위 패키지의 함수와 변수 비공용화
- 하위 패키지에서 소문자로 시작하는 이름을 사용해 외부 접근을 제한합니다.
- 상위 패키지에서 필요한 기능만 래핑
- 상위 패키지에서 하위 패키지의 비공용 함수나 데이터를 래핑하여 외부에 공용 인터페이스를 제공합니다.
- 모듈화를 유지
- 하위 패키지는 특정 기능에 집중하고, 상위 패키지는 인터페이스를 단순화하여 외부에서 사용하기 쉽게 만듭니다.
4. 장점과 단점
4.1. 장점
- 캡슐화: 하위 패키지의 구현 세부사항이 외부에 노출되지 않아, 코드 유지보수가 용이합니다.
- 인터페이스 통제: 상위 패키지를 통해 필요한 기능만 외부에 노출할 수 있습니다.
- 구조적 분리: 하위 패키지와 상위 패키지 간 역할 분담이 명확해집니다.
4.2. 단점
- 추가적인 코드 작성 필요: 상위 패키지에서 래핑 코드를 추가로 작성해야 합니다.
- 성능 오버헤드: 래핑 과정에서 약간의 함수 호출 비용이 추가됩니다.
5. 실용적인 응용
- API 게이트웨이
- 상위 패키지가 여러 하위 패키지의 API를 통합하고, 단일 진입점으로 제공.
- 유틸리티 래핑
- 여러 하위 유틸리티 패키지의 기능을 상위 패키지에서 조합하여 제공.
- 보안 및 접근 제어
- 상위 패키지에서 래핑 과정에 추가적인 검증이나 로깅 로직을 삽입.
6. 고급 사례: 인터페이스와 래핑의 결합
하위 패키지에서 구현한 세부 사항을 상위 패키지에서 인터페이스를 통해 노출하면 더 높은 유연성과 테스트 가능성을 확보할 수 있습니다.
6.1. 인터페이스 정의 (utils/public.go)
package utils
import "myproject/utils/stringutils"
// StringManipulator는 문자열 조작 인터페이스를 정의합니다.
type StringManipulator interface {
Reverse(s string) string
}
// stringManipulatorImpl은 하위 패키지를 사용하는 구조체입니다.
type stringManipulatorImpl struct{}
func (s *stringManipulatorImpl) Reverse(str string) string {
return stringutils.Reverse(str)
}
// NewStringManipulator는 인터페이스 구현체를 생성합니다.
func NewStringManipulator() StringManipulator {
return &stringManipulatorImpl{}
}
6.2. 메인 파일 (main.go)
package main
import (
"fmt"
"myproject/utils"
)
func main() {
manipulator := utils.NewStringManipulator()
reversed := manipulator.Reverse("hello")
fmt.Println("Reversed String:", reversed)
}
7. 요약
- 하위 패키지의 구현을 비공용으로 유지하고, 상위 패키지에서 래핑하여 필요한 기능만 외부에 노출합니다.
- 인터페이스를 활용하면 더 높은 유연성과 테스트 가능성을 제공합니다.
- 이 접근법은 코드의 캡슐화, 유지보수성, 확장성을 크게 향상시킵니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 Socket.IO 프로토콜은 어떻게 구현하고 활용할 수 있나요? (0) | 2025.01.16 |
---|---|
👨💻 [Go] Go 에서 internal 폴더는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.16 |
👨💻 [Go] Go 에서 하위 패키지에 직접적인 접근을 막고, 상위 패키지를 통해서만 하위 패키지의 기능을 제공하려면, 어떻게 해야 하나요? (0) | 2025.01.15 |
👨💻 [Go] Go 에서 상위 패키지와 하위 패키지를 구분하는 방법이 어떻게 되나요? (0) | 2025.01.15 |
👨💻 [Go] Go 에서 패키지 내부에 여러개의 go 파일로 나눠서 구현하는 방법은 어떻게 되나요? (0) | 2025.01.15 |