본문 바로가기
프로그래밍

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

by 밝음의기둥 2025. 1. 15.
반응형

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


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

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


반응형