Alert

์ด ๊ธ€์€ Claude Code์˜ ๋„์›€์„ ๋ฐ›์•„ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

TL;DR

  • ์ €์žฅ์†Œ โŠƒ ๋ชจ๋“ˆ โŠƒ ํŒจํ‚ค์ง€์˜ ์„ธ ๊ณ„์ธต ๊ตฌ์กฐ์™€ ๊ฐ ์ธต์˜ ์—ญํ•  ๊ตฌ๋ถ„
  • ๋ชจ๋“ˆ์€ go.mod๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๊ณ  ์ „์—ญ์—์„œ ์œ ์ผํ•œ ์‹๋ณ„์ž(๋ณดํ†ต ์ €์žฅ์†Œ ๊ฒฝ๋กœ)๋ฅผ ๊ฐ€์ง
  • import๋Š” ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ํด๋”(ํŒจํ‚ค์ง€) ๋‹จ์œ„์ด๊ณ , ๊ฒฝ๋กœ๋Š” ๋ชจ๋“ˆ ์ด๋ฆ„ + ํด๋” ๊ฒฝ๋กœ
  • ์‹๋ณ„์ž ์ฒซ ๊ธ€์ž ๋Œ€๋ฌธ์ž๋ฉด ๊ณต๊ฐœ, ์†Œ๋ฌธ์ž๋ฉด ๋น„๊ณต๊ฐœ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ•์ œ
  • ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ช…๊ณผ ์ผ์น˜์‹œํ‚ค๊ณ  ์„ค๋ช…์ ์œผ๋กœ ์ง“๋˜ ํ•จ์ˆ˜ ์ด๋ฆ„์—์„œ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์Œ
  • internal/ ํด๋”๋Š” ๋ถ€๋ชจ ํŠธ๋ฆฌ ๋ฐ–์—์„œ import ๋ถˆ๊ฐ€, go mod tidy๋กœ ์˜์กด์„ฑ ๋™๊ธฐํ™”
  • ํ”„๋กœ์ ํŠธ๋Š” ์ž‘์œผ๋ฉด ๋‹จ์ผ ํŒจํ‚ค์ง€, ์ปค์ง€๋ฉด cmd/ยทinternal/ยทpkg/๋กœ ๋ถ„๋ฆฌ

Python์—์„œ๋Š” ๊ฐ™์€ ํด๋”์˜ ํŒŒ์ผ์„ import utils์ฒ˜๋Ÿผ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ์ƒ๋Œ€๊ฒฝ๋กœ(from . import helper)๋กœ ๋Œ์–ด๋‹ค ์“ด๋‹ค. Go๋Š” ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์•„๋ฌด ํŒŒ์ผ์ด๋‚˜ ๊ฒฝ๋กœ๋กœ ๋ถ€๋ฅด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€๋ผ๋Š” ๋‹จ์œ„๋กœ ์›€์ง์ธ๋‹ค. ์ด ๊ธ€์€ Python์˜ ๋ชจ๋“ˆ/ํŒจํ‚ค์ง€/import/pip์— ์ต์ˆ™ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ Go์˜ ์ฝ”๋“œ ๊ตฌ์„ฑ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋„๋ก ์ •๋ฆฌํ•œ๋‹ค.


1. ์ €์žฅ์†Œยท๋ชจ๋“ˆยทํŒจํ‚ค์ง€ โ€” ์„ธ ๊ณ„์ธต

Go์˜ ์ฝ”๋“œ ๊ตฌ์„ฑ์€ ์„ธ ๋‹จ๊ณ„๋กœ ์Œ“์—ฌ ์žˆ๋‹ค. ์œ„์—์„œ๋ถ€ํ„ฐ ์ €์žฅ์†Œ, ๋ชจ๋“ˆ, ํŒจํ‚ค์ง€๋‹ค.

  • ์ €์žฅ์†Œ(repository) โ€” ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(VCS)์ด ๋‹ค๋ฃจ๋Š” ๊ณต๊ฐ„์ด๋‹ค. ๊นƒ ์ €์žฅ์†Œ ํ•˜๋‚˜๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•œ๋‹ค. ์ฝ”๋“œ ์ „์ฒด๊ฐ€ ๋ณด๊ด€๋˜๊ณ  ๋ฒ„์ „์ด ๋งค๊ฒจ์ง€๋Š” ๊ฐ€์žฅ ๋ฐ”๊นฅ ๊ป๋ฐ๊ธฐ๋‹ค.
  • ๋ชจ๋“ˆ(module) โ€” ์ €์žฅ์†Œ ์•ˆ์—์„œ ํ•จ๊ป˜ ๋ฐฐํฌ๋˜๋Š” Go ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ์ƒ์œ„ ๋ฃจํŠธ๋‹ค. ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒจํ‚ค์ง€๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ „์—ญ์—์„œ ์œ ์ผํ•œ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ณดํ†ต ์ €์žฅ์†Œ ๊ฒฝ๋กœ(github.com/user/proj)๋ฅผ ๊ทธ๋Œ€๋กœ ์‹๋ณ„์ž๋กœ ์“ด๋‹ค. ๋ฃจํŠธ์— go.mod ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ๋ชจ๋“ˆ๋กœ ์ธ์ •๋œ๋‹ค.
  • ํŒจํ‚ค์ง€(package) โ€” ํ•จ๊ป˜ ์ปดํŒŒ์ผ๋˜๋Š” ์†Œ์Šค ํŒŒ์ผ์˜ ๋ฌถ์Œ์ด๋‹ค. ํŒŒ์ผ ์ƒ๋‹จ์˜ package ์„ ์–ธ์œผ๋กœ ์ด๋ฆ„์ด ์ •ํ•ด์ง€๊ณ , import์˜ ์ตœ์†Œ ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค. ํ•˜๋‚˜์˜ ํด๋”๊ฐ€ ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋‹ค.

์ €์žฅ์†Œ์™€ ๋ชจ๋“ˆ์€ ๋ณดํ†ต 1:1

๋Œ€๋ถ€๋ถ„์€ ์ €์žฅ์†Œ ํ•˜๋‚˜์— ๋ชจ๋“ˆ ํ•˜๋‚˜(๋ฃจํŠธ์— go.mod ํ•˜๋‚˜)๋‹ค. ์ด ๊ธ€๋„ ๊ทธ ๊ธฐ๋ณธ ๊ฒฝ์šฐ๋ฅผ ์ „์ œํ•œ๋‹ค. ๋‹ค๋งŒ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— go.mod๋ฅผ ๋” ๋‘๋ฉด ํ•œ ์ €์žฅ์†Œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ๋กœ ๊ฐˆ๋ฆฌ๋Š” ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ์ €์žฅ์†Œ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณธ์ฒด์™€, ๋ฌด๊ฑฐ์šด ์˜์กด์„ฑ์„ ์“ฐ๋Š” tools/ยทexamples/๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌํ•  ๋•Œ ์“ด๋‹ค. ๋‹ค๋งŒ ๋ชจ๋“ˆ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์œผ๋ฉด ์ƒ๋Œ€๊ฒฝ๋กœ import๊ฐ€ ์•ˆ ๋˜๊ณ  ๋„๊ตฌ(go build ./... ๋“ฑ)๋„ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ๋งŒ ๋™์ž‘ํ•ด ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฏ€๋กœ, ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†์œผ๋ฉด ์ €์žฅ์†Œ๋‹น ๋ชจ๋“ˆ ํ•˜๋‚˜๊ฐ€ ๊ถŒ์žฅ๋œ๋‹ค.

Python๊ณผ ๋Œ€๋น„ํ•˜๋ฉด ์ด๋ ‡๋‹ค.

PythonGo
๋ชจ๋“ˆ = ํŒŒ์ผ ํ•˜๋‚˜(utils.py)ํŒจํ‚ค์ง€ = ํด๋” ํ•˜๋‚˜
ํŒจํ‚ค์ง€ = ๋””๋ ‰ํ„ฐ๋ฆฌ + __init__.py๋ชจ๋“ˆ = go.mod๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์•ฑ
(์ €์žฅ์†Œ ๊ฐœ๋…์€ ์–ธ์–ด ์ฐจ์›์—์„œ ์•ˆ ๋‹ค๋ฃธ)์ €์žฅ์†Œ = VCS ๊ณต๊ฐ„, ๋ชจ๋“ˆ์„ ๋‹ด๋Š” ๋ฐ”๊นฅ ๊ป๋ฐ๊ธฐ

๊ฐ€์žฅ ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ง€์ ์€ โ€œํŒจํ‚ค์ง€โ€๋ผ๋Š” ๋‹จ์–ด๋‹ค. Python์—์„œ ํŒจํ‚ค์ง€๋Š” pip install๋กœ ๋ฐ›๋Š” ๋ฐฐํฌ ๋‹จ์œ„์— ๊ฐ€๊น์ง€๋งŒ, Go์—์„œ ๊ทธ ๋ฐฐํฌ ๋‹จ์œ„๋Š” ๋ชจ๋“ˆ์ด๋‹ค. Go์˜ ํŒจํ‚ค์ง€๋Š” ๋” ์ž‘์€ ๋‹จ์œ„, ์ฆ‰ importํ•ด์„œ ์“ฐ๋Š” ํด๋” ํ•˜๋‚˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๋‹จ์–ด ๋งคํ•‘ ์ฃผ์˜

  • Python โ€œmoduleโ€(ํŒŒ์ผ) โ†” Go โ€œpackageโ€(ํด๋”)
  • Python โ€œpackageโ€(pip๋กœ ๋ฐ›๋Š” ๊ฒƒ) โ†” Go โ€œmoduleโ€(go get์œผ๋กœ ๋ฐ›๋Š” ๊ฒƒ)

๊ฐ™์€ ๋‹จ์–ด๋ผ๋„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด ํ•œ ์นธ์”ฉ ์–ด๊ธ‹๋‚œ๋‹ค. ์ด ํ‘œ๋ฅผ ๋จธ๋ฆฟ์†์— ๋‘๋ฉด ๋‚˜๋จธ์ง€๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.


2. ๋ชจ๋“ˆ ์‹œ์ž‘ํ•˜๊ธฐ

์ƒˆ ํ”„๋กœ์ ํŠธ๋Š” ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™”๋กœ ์‹œ์ž‘ํ•œ๋‹ค. 01ํŽธ์—์„œ ๋‹ค๋ฃฌ go mod init์ด ๊ทธ ๋ช…๋ น์ด๋‹ค.

mkdir myproj && cd myproj
go mod init github.com/user/myproj

์ด ๋ช…๋ น์ด go.mod ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค. ๋‚ด์šฉ์€ ๋‹จ์ˆœํ•˜๋‹ค.

module github.com/user/myproj
 
go 1.24

์—ฌ๊ธฐ์„œ module ์ค„์— ์ ํžŒ ์ด๋ฆ„์ด ํ•ต์‹ฌ์ด๋‹ค. ์ด ์ด๋ฆ„์ด ๋ชจ๋“  import ๊ฒฝ๋กœ์˜ ๊ธฐ์ค€์ ์ด ๋œ๋‹ค. ๋ชจ๋“ˆ ์•ˆ์—์„œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ๋ถ€๋ฅผ ๋•Œ ๊ฒฝ๋กœ๊ฐ€ ์ „๋ถ€ ์ด ์ด๋ฆ„์—์„œ ์ถœ๋ฐœํ•œ๋‹ค.

Python์œผ๋กœ ์น˜๋ฉด pyproject.toml์„ ๋งŒ๋“œ๋Š” ์ผ์— ํ•ด๋‹นํ•œ๋‹ค. uv init์ด๋‚˜ [project] ์„น์…˜์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ์ž๋ฆฌ๋‹ค.

# pyproject.toml โ€” Python ์ชฝ ๋Œ€์‘
[project]
name = "myproj"
version = "0.1.0"

๋‹ค๋งŒ ๊ฒฐ์ •์  ์ฐจ์ด๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค. Python์˜ name์€ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ์“ฐ๋Š” ์ด๋ฆ„์ผ ๋ฟ, ์ฝ”๋“œ ์•ˆ์˜ import ๊ฒฝ๋กœ์™€ ์ง์ ‘ ๋ฌถ์ด์ง€ ์•Š๋Š”๋‹ค. Go์˜ module ์ด๋ฆ„์€ ๊ณง๋ฐ”๋กœ import ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค. ๋ชจ๋“ˆ ์ด๋ฆ„์„ ์ •ํ•œ๋‹ค๋Š” ๊ฑด import ๊ฒฝ๋กœ๋ฅผ ์ •ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ณดํ†ต ์ €์žฅ์†Œ๋ฅผ ์˜ฌ๋ฆด ์ฃผ์†Œ(github.com/user/myproj)๋ฅผ ๊ทธ๋Œ€๋กœ ์“ด๋‹ค.

ํ•˜ํ•„ ์ €์žฅ์†Œ ์ฃผ์†Œ๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š”, ๋ชจ๋“ˆ ์ด๋ฆ„์ด import ์ ‘๋‘์‚ฌ์ด์ž Go๊ฐ€ ๊ทธ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์œ„์น˜์ด๊ธฐ๋„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‚˜ ํ˜ผ์ž ๋กœ์ปฌ์—์„œ๋งŒ ๋นŒ๋“œํ•œ๋‹ค๋ฉด module myproj์ฒ˜๋Ÿผ ์•„๋ฌด ์ด๋ฆ„์ด๋‚˜ ์ค˜๋„ ์ž˜ ๋Œ์•„๊ฐ„๋‹ค. ํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€(๋ฏธ๋ž˜์˜ ๋‚˜ ํฌํ•จ) ์ด ๋ชจ๋“ˆ์„ go get์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๋ฉด ๊ทธ ์ด๋ฆ„์ด ์‹ค์ œ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ์—ฌ์•ผ ํ•œ๋‹ค. Go๋Š” ์ฒซ ๊ฒฝ๋กœ ์š”์†Œ์— ์ (.)์ด ์—†๋Š” ์ด๋ฆ„(myproj)์€ ์›๊ฒฉ์—์„œ ๋ฐ›์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋ฏ€๋กœ, ๋„๋ฉ”์ธ์ด ๋“ค์–ด๊ฐ„ ์ฃผ์†Œ๋ผ์•ผ ์–ด๋””์„œ ๊ฐ€์ ธ์˜ฌ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋ชจ๋“ˆ ์ด๋ฆ„์„ ๋‚˜์ค‘์— ๋ฐ”๊พธ๋ฉด ์ƒ๊ธฐ๋Š” ์ผ

๋ชจ๋“ˆ ์ด๋ฆ„์€ ๊ทธ ๋ชจ๋“ˆ ์•ˆ ๋ชจ๋“  ํŒจํ‚ค์ง€์˜ import ์ ‘๋‘์‚ฌ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ฉด ๊ทธ ์ ‘๋‘์‚ฌ๋ฅผ ์“ฐ๋˜ import๊ฐ€ ์ „๋ถ€ ๊นจ์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด module myproj๋กœ ์‹œ์ž‘ํ•ด์„œ ์ด๋ ‡๊ฒŒ ์งฐ๋‹ค๊ณ  ํ•˜์ž.

// main.go โ€” ๋ชจ๋“ˆ ์ด๋ฆ„์ด myproj์ผ ๋•Œ
import "myproj/extract"

๋‚˜์ค‘์— ๊ณต๊ฐœํ•˜๋ ค๊ณ  go.mod์˜ ๋ชจ๋“ˆ ์ด๋ฆ„์„ github.com/user/myproj๋กœ ๋ฐ”๊พธ๋ฉด, ์œ„ import๋Š” ๋” ์ด์ƒ ์—†๋Š” myproj๋ฅผ ๊ฐ€๋ฆฌ์ผœ ๋นŒ๋“œ๊ฐ€ ๊นจ์ง„๋‹ค. ๋ชจ๋“ˆ ์•ˆ์˜ ๋ชจ๋“  ์ž๊ธฐ ํŒจํ‚ค์ง€ import๋ฅผ ์ƒˆ ์ ‘๋‘์‚ฌ๋กœ ๊ณ ์ณ์•ผ ํ•œ๋‹ค.

// ์ „๋ถ€ ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”์•ผ ํ•จ
import "github.com/user/myproj/extract"

์™ธ๋ถ€ ํŒจํ‚ค์ง€(fmt, github.com/gin-gonic/gin ๋“ฑ)๋ฅผ ๋ถ€๋ฅด๋Š” import๋Š” ์•ˆ ๊นจ์ง€๊ณ , ๋‚ด ๋ชจ๋“ˆ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋˜ import๋งŒ ๊นจ์ง„๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด๋ฏธ ์ด ๋ชจ๋“ˆ์„ ์˜์กด์„ฑ์œผ๋กœ ์“ฐ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋„ ๋˜‘๊ฐ™์ด ๊นจ์ง„๋‹ค(๊ทธ๋“ค์—๊ฒ ์‚ฌ์‹ค์ƒ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ๋œ๋‹ค). ๊ทธ๋ž˜์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹ค์ œ ์ €์žฅ์†Œ ์ฃผ์†Œ๋กœ ์ •ํ•ด๋‘๋Š” ๊ฒŒ ์ข‹๋‹ค.


3. ํŒจํ‚ค์ง€์™€ import

ํŒจํ‚ค์ง€๋Š” ํด๋”, import๋Š” ํด๋” ๋‹จ์œ„

๋ชจ๋“  Go ํŒŒ์ผ์€ ์ฒซ ์ค„์— ์ž๊ธฐ๊ฐ€ ์†ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ ์–ธํ•œ๋‹ค.

package extract

์—ฌ๊ธฐ์„œ ๋‘ ๊ทœ์น™์ด ๋”ฐ๋ผ์˜จ๋‹ค.

  • ๊ฐ™์€ ํด๋”์˜ ํŒŒ์ผ์€ ๊ฐ™์€ ํŒจํ‚ค์ง€์—ฌ์•ผ ํ•œ๋‹ค. ํ•œ ํด๋” ์•ˆ์—์„œ package extract์™€ package parse๋ฅผ ์„ž์„ ์ˆ˜ ์—†๋‹ค.
  • import๋Š” ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ํด๋”(ํŒจํ‚ค์ง€) ๋‹จ์œ„๋กœ ํ•œ๋‹ค. Python์ฒ˜๋Ÿผ ํŠน์ • ํŒŒ์ผ(from utils.helper import f)์„ ์ฝ• ์ง‘์–ด ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š”๋‹ค. ํด๋”๋ฅผ ํ†ต์งธ๋กœ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ ์•ˆ์˜ ๊ณต๊ฐœ ์‹๋ณ„์ž๋ฅผ ์“ด๋‹ค.

import ๊ฒฝ๋กœ๋Š” ๋ชจ๋“ˆ ์ด๋ฆ„ + ํด๋” ๊ฒฝ๋กœ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๋ชจ๋“ˆ์ด github.com/user/myproj์ด๊ณ  ๊ทธ ์•ˆ์— extract/ ํด๋”๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฒฝ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

import "github.com/user/myproj/extract"

Python์˜ from myproj.extract import names์™€ ๋ชจ์–‘์€ ๋น„์Šทํ•˜์ง€๋งŒ, Go๋Š” ์ (.) ๋Œ€์‹  ์Šฌ๋ž˜์‹œ(/)๋กœ ๊ฒฝ๋กœ๋ฅผ ์ž‡๊ณ , ๋์— ์˜ค๋Š” ๊ฑด ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ํด๋”๋ผ๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

์—„๋ฐ€ํžˆ๋Š” import๋Š” ํด๋” ๊ฒฝ๋กœ๋‹ค

๊ฒฝ๋กœ ๋์˜ extract๋Š” ํด๋” ์ด๋ฆ„์ด์ง€, ๊ทธ ์•ˆ ํŒŒ์ผ์ด ์„ ์–ธํ•œ package ์ด๋ฆ„์ด ์•„๋‹ˆ๋‹ค. ๋‘˜์€ ๋ณ„๊ฐœ๋‹ค. import๋Š” ํด๋” ๊ฒฝ๋กœ๋กœ ํ•˜๊ณ , ์ฝ”๋“œ์—์„œ ๋ถ€๋ฅผ ๋•Œ๋Š” ๊ทธ ํด๋”๊ฐ€ ์„ ์–ธํ•œ package ์ด๋ฆ„์œผ๋กœ ํ•œ๋‹ค. ๋ณดํ†ต ์ด ๋‘˜์„ ๊ฐ™๊ฒŒ ๋งž์ถ”์ง€๋งŒ(๊ด€๋ก€) ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค โ€” ํด๋”๊ฐ€ coolstuff์ธ๋ฐ package mylib์ด๋ฉด import ".../coolstuff"๋กœ ๊ฐ€์ ธ์™€ mylib.Hello()๋กœ ๋ถ€๋ฅธ๋‹ค. ๋ณ„์นญ์„ ์•ˆ ๋ถ™์—ฌ๋„ Go๊ฐ€ ์†Œ์Šค์—์„œ package ์ด๋ฆ„์„ ์ฝ์–ด ์•Œ์•„์„œ ๋ฌถ์–ด์ฃผ๋ฏ€๋กœ ๊ทธ๋ƒฅ ๋™์ž‘ํ•œ๋‹ค. ๋‹ค๋งŒ goimports๋Š” ํด๋” ์ด๋ฆ„๊ณผ package ์ด๋ฆ„์ด ๋‹ค๋ฅด๋ฉด ํ—ท๊ฐˆ๋ฆผ์„ ์ค„์ด๋ ค๊ณ  ์‹ค์ œ package ์ด๋ฆ„์„ ๋ณ„์นญ์œผ๋กœ ๋ถ™์—ฌ์ค€๋‹ค(import mylib ".../coolstuff").

๊ฐ™์€ ํŒจํ‚ค์ง€ ์•ˆ์—์„œ๋Š” import๊ฐ€ ํ•„์š” ์—†๋‹ค

๊ฐ™์€ ํด๋”์— ์žˆ๊ณ  ๊ฐ™์€ package ์ด๋ฆ„์„ ๊ฐ€์ง„ ํŒŒ์ผ๋ผ๋ฆฌ๋Š” ์„œ๋กœ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋ถ€๋ฅธ๋‹ค. import๋„, ์ ‘๋‘์–ด๋„ ํ•„์š” ์—†๋‹ค.

// a.go
package extract
func Names() {}
 
// b.go (๊ฐ™์€ ํด๋”)
package extract
func run() {
    Names() // ๊ฐ™์€ ํŒจํ‚ค์ง€ โ€” ๊ทธ๋ƒฅ ํ˜ธ์ถœ
}

Python์—์„œ ๊ฐ™์€ ๋ชจ๋“ˆ(ํŒŒ์ผ) ์•ˆ์˜ ํ•จ์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ๋ถ€๋ฅด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐ๊ฐ์ธ๋ฐ, Go์—์„œ๋Š” ๊ทธ ๋ฒ”์œ„๊ฐ€ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ํด๋” ์ „์ฒด๋กœ ๋„“์–ด์ง„๋‹ค. ํด๋” ์•ˆ์˜ ํŒŒ์ผ๋“ค์ด ์‚ฌ์‹ค์ƒ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง„๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋Š” ํด๋”๋ฅผ ๋‚˜๋ˆ„๊ณ  importํ•œ๋‹ค

๋‹ค๋ฅธ ๋™์ž‘์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ ค๋ฉด ํด๋”๋ฅผ ๋‚˜๋ˆ„๊ณ , ์“ฐ๋Š” ์ชฝ์—์„œ importํ•œ๋‹ค.

// extract/extract.go
package extract
func Names() []string { return nil }
 
// main.go
package main
 
import "github.com/user/myproj/extract"
 
func main() {
    names := extract.Names() // ํŒจํ‚ค์ง€ ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผ
}

๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ์‹๋ณ„์ž๋Š” ๋ฐ˜๋“œ์‹œ ํŒจํ‚ค์ง€๋ช….์‹๋ณ„์ž ํ˜•ํƒœ๋กœ ๋ถ€๋ฅธ๋‹ค(extract.Names). ์ด ์ ์ด Python์˜ from x import *์™€ ๋‹ค๋ฅด๋‹ค. Go๋Š” ์ด๋ฆ„์„ ์ „์—ญ์œผ๋กœ ํ’€์–ด ํ—ค์น˜์ง€ ์•Š๊ณ , ํ•ญ์ƒ ์–ด๋А ํŒจํ‚ค์ง€์—์„œ ์™”๋Š”์ง€ ๋“œ๋Ÿฌ๋‚ธ๋‹ค.

์ด๋ฆ„์ด ๊ฒน์น˜๋Š” ํŒจํ‚ค์ง€๋Š” alias๋กœ ๊ตฌ๋ถ„

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ํด๋” ๊ฒฝ๋กœ๋Š” ๋‹ค๋ฅด์ง€๋งŒ ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ crypto/rand์™€ math/rand ๋‘˜ ๋‹ค ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด rand๋‹ค. ๊ทธ๋Œ€๋กœ ๊ฐ™์ด importํ•˜๋ฉด ์ถฉ๋Œํ•˜๋ฏ€๋กœ ๋ณ„์นญ(alias)์„ ๋ถ™์ธ๋‹ค.

import (
    crand "crypto/rand"
    mrand "math/rand"
)
 
func main() {
    _ = crand.Reader
    _ = mrand.Intn(10)
}

Python์˜ import numpy as np์™€ ๊ฐ™์€ ๋ฐœ์ƒ์ด๋‹ค. ๋‹ค๋งŒ Go์—์„œ๋Š” ๋ณด๊ธฐ ์ข‹์ž๊ณ  ์“ฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ‘ธ๋Š” ์‹ค์šฉ์  ์žฅ์น˜๋กœ ์ฃผ๋กœ ์“ด๋‹ค.

์ •๋ฆฌ

  • ๊ฐ™์€ ํŒจํ‚ค์ง€ = ๊ฐ™์€ ํด๋” + ๊ฐ™์€ package๋ช… โ†’ import ๋ถˆํ•„์š”, ๊ทธ๋ƒฅ ํ˜ธ์ถœ
  • ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ = ๋‹ค๋ฅธ ํด๋” โ†’ import ํ•„์š” + ํŒจํ‚ค์ง€๋ช….์‹๋ณ„์ž๋กœ ์ ‘๊ทผ
  • import ๊ฒฝ๋กœ = ๋ชจ๋“ˆ ์ด๋ฆ„ + ํด๋” ๊ฒฝ๋กœ

4. ๊ณต๊ฐœ์™€ ๋น„๊ณต๊ฐœ: ๋Œ€๋ฌธ์ž ๊ทœ์น™

Go์—๋Š” public, private ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋‹ค. ๋Œ€์‹  ์‹๋ณ„์ž ์ฒซ ๊ธ€์ž์˜ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์™ธ๋ถ€ ๊ณต๊ฐœ ์—ฌ๋ถ€๋ฅผ ์ •ํ•œ๋‹ค.

  • ์ฒซ ๊ธ€์ž๊ฐ€ ๋Œ€๋ฌธ์ž โ†’ ๊ณต๊ฐœ(exported). ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ฒซ ๊ธ€์ž๊ฐ€ ์†Œ๋ฌธ์ž โ†’ ๋น„๊ณต๊ฐœ(unexported). ๊ฐ™์€ ํŒจํ‚ค์ง€ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
package extract
 
func Names() []string { return nil } // ๊ณต๊ฐœ โ€” ๋ฐ–์—์„œ extract.Names() ๊ฐ€๋Šฅ
func parse() string   { return "" }  // ๋น„๊ณต๊ฐœ โ€” extract ํŒจํ‚ค์ง€ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ
 
type User struct {
    Name string // ๊ณต๊ฐœ ํ•„๋“œ
    age  int    // ๋น„๊ณต๊ฐœ ํ•„๋“œ
}

์ด ๊ทœ์น™์€ ํ•จ์ˆ˜, ํƒ€์ž…, ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ๊ตฌ์กฐ์ฒด ํ•„๋“œ ๋“ฑ ๋ชจ๋“  ํŒจํ‚ค์ง€ ๋ ˆ๋ฒจ ์‹๋ณ„์ž์— ๋˜‘๊ฐ™์ด ์ ์šฉ๋œ๋‹ค. ๊ทธ๋ž˜์„œ 02ํŽธ์—์„œ ์ด๋ฆ„ ์ง“๋Š” ๋ฒ•์„ ๋‹ค๋ฃฐ ๋•Œ ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ๋‹จ์ˆœํ•œ ์Šคํƒ€์ผ์ด ์•„๋‹ˆ๋ผ๊ณ  ํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. ์ฒซ ๊ธ€์ž ํ•˜๋‚˜๊ฐ€ ์ ‘๊ทผ ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

Python๊ณผ ๋น„๊ตํ•˜๋ฉด ์ฐจ์ด๊ฐ€ ๋ถ„๋ช…ํ•˜๋‹ค. Python์—์„œ _name์ฒ˜๋Ÿผ ๋ฐ‘์ค„์„ ๋ถ™์ด๋Š” ๊ฑด โ€œ์“ฐ์ง€ ๋ง๋ผโ€๋Š” ๊ด€๋ก€์ผ ๋ฟ, ๊ฐ•์ œ๋ ฅ์ด ์—†๋‹ค. ๋ฐ–์—์„œ obj._name์œผ๋กœ ์ ‘๊ทผํ•ด๋„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋ง‰์ง€ ์•Š๋Š”๋‹ค.

# Python โ€” ๊ด€๋ก€์ผ ๋ฟ, ๋ง‰์ง€ ์•Š์Œ
class User:
    def __init__(self):
        self.name = "Alice"
        self._age = 30   # "๋‚ด๋ถ€์šฉ"์ด๋ผ๋Š” ์‹ ํ˜ธ์ผ ๋ฟ
 
u = User()
print(u._age)  # 30 โ€” ๊ทธ๋ƒฅ ์ ‘๊ทผ๋จ

Go๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ•์ œํ•œ๋‹ค. ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ์‹๋ณ„์ž๋ฅผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ๋ถ€๋ฅด๋ฉด ์ปดํŒŒ์ผ ์ž์ฒด๊ฐ€ ์‹คํŒจํ•œ๋‹ค.

๊ณต๊ฐœ API๋ฅผ ์ข๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ฒ•

๋ฐ–์—์„œ ๊ผญ ์จ์•ผ ํ•˜๋Š” ๊ฒƒ๋งŒ ๋Œ€๋ฌธ์ž๋กœ, ๋‚˜๋จธ์ง€๋Š” ์†Œ๋ฌธ์ž๋กœ ๋‘”๋‹ค. ๊ณต๊ฐœ ๋ฉด์ ์ด ์ข์„์ˆ˜๋ก ๋‚˜์ค‘์— ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ฐ”๊ฟ€ ์ž์œ ๊ฐ€ ์ปค์ง„๋‹ค. Python์—์„œ๋Š” ์ด๊ฑธ ๊ทœ์œจ๋กœ ์ง€์ผœ์•ผ ํ•˜์ง€๋งŒ, Go์—์„œ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋งŒ ๋งž์ถ”๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋Œ€์‹  ์ง€์ผœ ์ค€๋‹ค.


5. ํŒจํ‚ค์ง€ ์ด๋ฆ„ ์ง“๊ธฐ ๊ด€๋ก€

๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„๊ณผ ๋งž์ถ˜๋‹ค

ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ ๋ณดํ†ต ๊ทธ ํŒจํ‚ค์ง€๊ฐ€ ๋“  ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„๊ณผ ๊ฐ™๊ฒŒ ์ง“๋Š”๋‹ค. extract/ ํด๋” ์•ˆ ํŒŒ์ผ์ด๋ฉด package extract๋‹ค. ์˜ˆ์™ธ๋Š” ์‹คํ–‰ ํŒŒ์ผ์˜ ์ง„์ž…์ ์ด ๋˜๋Š” main, ๊ทธ๋ฆฌ๊ณ  ๋ฒ„์ „์ด ๋ถ™์€ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ •๋„๋‹ค. ์ด ๊ด€๋ก€๋ฅผ ์ง€ํ‚ค๋ฉด import ๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰ ์กฐ๊ฐ๊ณผ ์ฝ”๋“œ์—์„œ ์“ฐ๋Š” ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด ์ผ์น˜ํ•ด ํ˜ผ๋ž€์ด ์ค„์–ด๋“ ๋‹ค.

์„ค๋ช…์ ์œผ๋กœ ์ง“๋Š”๋‹ค โ€” util ๊ฐ™์€ ์žกํƒ• ๊ธˆ์ง€

์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ํ•œ๋ฐ ๋ชจ์€ util, common, helpers ๊ฐ™์€ ์ด๋ฆ„์€ ํ”ผํ•œ๋‹ค. ๊ทธ ์•ˆ์— ๋ญ๊ฐ€ ์žˆ๋Š”์ง€ ์ด๋ฆ„๋งŒ ๋ด์„œ๋Š” ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ธฐ๋Šฅ์„ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ด๋ฆ„์œผ๋กœ ํด๋”๋ฅผ ๋‚˜๋ˆˆ๋‹ค.

// ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ โ€” util์— ๋ญ๊ฐ€ ๋“ค์—ˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค
util.ExtractNames(doc)
 
// ๊ถŒ์žฅ โ€” ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด ๊ณง ์„ค๋ช…์ด ๋œ๋‹ค
extract.Names(doc)

ํŒจํ‚ค์ง€๋ช…์„ ์‹๋ณ„์ž์—์„œ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š”๋‹ค

ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ๋Š” ํ•ญ์ƒ ํŒจํ‚ค์ง€๋ช….์‹๋ณ„์ž ํ˜•ํƒœ๊ฐ€ ๋˜๋ฏ€๋กœ, ์‹๋ณ„์ž์— ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ๋˜ ๋„ฃ์œผ๋ฉด ๋ง์ด ๊ฒน์นœ๋‹ค.

// ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ โ€” "extract.ExtractNames" ์ฒ˜๋Ÿผ extract๊ฐ€ ๋‘ ๋ฒˆ
package extract
func ExtractNames() {}
 
// ๊ถŒ์žฅ โ€” ํ˜ธ์ถœํ•˜๋ฉด "extract.Names"๋กœ ๊น”๋”ํ•˜๋‹ค
package extract
func Names() {}

์˜ˆ์™ธ๋Š” ํŒจํ‚ค์ง€ ์ด๋ฆ„๊ณผ ํ•ต์‹ฌ ํƒ€์ž…/ํ•จ์ˆ˜๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐ™์•„์ง€๋Š” ๊ฒฝ์šฐ๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ sort.Sort๊ฐ€ ๊ทธ๋Ÿฐ ์˜ˆ๋‹ค. ์ •๋ ฌ ํŒจํ‚ค์ง€์˜ ๋Œ€ํ‘œ ๋™์ž‘์ด ์ •๋ ฌ์ด๋‹ˆ ์ด๋ฆ„์ด ๊ฒน์ณ๋„ ์–ด์ƒ‰ํ•˜์ง€ ์•Š๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ๋งŒ ์˜ˆ์™ธ๋กœ ๋‘”๋‹ค.

ํ•œ ์ค„ ๊ธฐ์ค€

ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ ์–ด๋–ป๊ฒŒ ์ฝํžˆ๋Š”์ง€๋ฅผ ๋จผ์ € ๊ทธ๋ ค ๋ณธ๋‹ค. extract.Names(doc)์ฒ˜๋Ÿผ ํŒจํ‚ค์ง€๋ช…๊ณผ ์‹๋ณ„์ž๊ฐ€ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ฝํžˆ๋ฉด ์ž˜ ์ง€์€ ์ด๋ฆ„์ด๋‹ค.


6. internal ํŒจํ‚ค์ง€

๊ณต๊ฐœ ์ฝ”๋“œ์™€ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋‚˜๋ˆŒ ๋•Œ Go๋Š” internal/์ด๋ผ๋Š” ํŠน๋ณ„ํ•œ ํด๋” ์ด๋ฆ„์„ ์ œ๊ณตํ•œ๋‹ค. internal/ ์•ˆ์˜ ํŒจํ‚ค์ง€๋Š” ๊ทธ ํด๋”์˜ ๋ถ€๋ชจ ๋””๋ ‰ํ„ฐ๋ฆฌ ํŠธ๋ฆฌ ๋ฐ–์—์„œ๋Š” importํ•  ์ˆ˜ ์—†๋‹ค. ์ด ์ œ์•ฝ์€ ๊ด€๋ก€๊ฐ€ ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ•์ œํ•œ๋‹ค.

๊ตฌ์กฐ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

myproj/
โ”œโ”€โ”€ go.mod              // module github.com/user/myproj
โ”œโ”€โ”€ main.go
โ”œโ”€โ”€ internal/
โ”‚   โ””โ”€โ”€ store/
โ”‚       โ””โ”€โ”€ store.go    // package store
โ””โ”€โ”€ extract/
    โ””โ”€โ”€ extract.go      // package extract

์—ฌ๊ธฐ์„œ internal/store๋Š” myproj/ ํŠธ๋ฆฌ ์•ˆ์˜ ์ฝ”๋“œ(main.go, extract)์—์„œ๋Š” ์ž์œ ๋กญ๊ฒŒ importํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์€ github.com/user/myproj/internal/store๋ฅผ importํ•˜๋ ค ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

// ๊ฐ™์€ ๋ชจ๋“ˆ ์•ˆ โ€” ๊ฐ€๋Šฅ
import "github.com/user/myproj/internal/store"
 
// ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ โ€” ์ปดํŒŒ์ผ ์—๋Ÿฌ
// use of internal package ... not allowed

์“ฐ์ž„์€ ๋ช…ํ™•ํ•˜๋‹ค. ๊ณต๊ฐœํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ internal/์— ๋‘๋ฉด, ์™ธ๋ถ€์—์„œ ๊ทธ ์ฝ”๋“œ์— ์˜์กดํ•˜๋Š” ์ผ์„ ์›์ฒœ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณต๊ฐœ API๋Š” ์ข๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋‚ด๋ถ€๋Š” ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ์ž์œ ๊ฐ€ ์ƒ๊ธด๋‹ค.

Python์—๋Š” ์ด๋Ÿฐ ๊ฐ•์ œ ์žฅ์น˜๊ฐ€ ์—†๋‹ค. 4๋ฒˆ์—์„œ ๋ณธ _prefix์ฒ˜๋Ÿผ ํŒจํ‚ค์ง€ ์ฐจ์›์—์„œ๋„ โ€œ๋‚ด๋ถ€์šฉโ€์ด๋ผ๋Š” ์‹ ํ˜ธ๋ฅผ ์ค„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ๊ตณ์ด importํ•˜๊ฒ ๋‹ค๋ฉด ๋ง‰์„ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. Go์˜ internal/์€ ํด๋” ์ด๋ฆ„ ํ•˜๋‚˜๋กœ ๊ทธ ๊ฒฝ๊ณ„๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ง€์ผœ ์ค€๋‹ค.


7. ์˜์กด์„ฑ ๊ด€๋ฆฌ

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ช…๋ น์€ 01ํŽธ์˜ go get/go install ํ‘œ์™€ ์ด์–ด์ง„๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์˜์กด์„ฑ ๊ด€๋ฆฌ์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.

์ถ”๊ฐ€์™€ ์ •๋ฆฌ

# ์˜์กด์„ฑ ์ถ”๊ฐ€ โ€” go.mod์™€ go.sum์— ๊ธฐ๋ก๋œ๋‹ค
go get github.com/gin-gonic/gin
 
# ์˜์กด์„ฑ ์ •๋ฆฌยท๋™๊ธฐํ™” โ€” ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์“ฐ๋Š” ๊ฒƒ์— ๋งž์ถ˜๋‹ค
go mod tidy

go get์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , go mod tidy๋Š” ์ฝ”๋“œ๋ฅผ ํ›‘์–ด ์‹ค์ œ๋กœ importํ•˜๋Š” ๊ฒƒ๋งŒ ๋‚จ๊ธฐ๊ณ  ๋น ์ง„ ๊ฑด ์ฑ„์šด๋‹ค. ์•ˆ ์“ฐ๋Š” ์˜์กด์„ฑ์€ go.mod์—์„œ ๋น ์ง€๊ณ , importํ–ˆ๋Š”๋ฐ ๋น ์ง„ ๊ฑด ์ถ”๊ฐ€๋œ๋‹ค. ์ž‘์—…์„ ๋งˆ์นœ ๋’ค go mod tidy๋ฅผ ๋Œ๋ ค ์ƒํƒœ๋ฅผ ๋งž์ถ”๋Š” ๊ฒŒ ์Šต๊ด€์ด๋‹ค.

๋ฒ„์ „ ํ™•์ธ๊ณผ ์—…๊ทธ๋ ˆ์ด๋“œ

# ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „ ๋ชฉ๋ก ํ™•์ธ
go list -m -versions github.com/gin-gonic/gin
 
# ํŠน์ • ๋ฒ„์ „ ์ง€์ •
go get github.com/gin-gonic/gin@v1.10.0
 
# ๋งˆ์ด๋„ˆยทํŒจ์น˜๊นŒ์ง€ ์ตœ์‹ ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ
go get -u github.com/gin-gonic/gin
 
# ํŒจ์น˜ ๋ฒ„์ „๋งŒ ์˜ฌ๋ฆฌ๊ธฐ(๋” ๋ณด์ˆ˜์ )
go get -u=patch github.com/gin-gonic/gin

go.sum์˜ ์—ญํ• 

go get์„ ํ•˜๋ฉด go.mod์— ๋ฒ„์ „์ด, go.sum์— ๊ทธ ๋ฒ„์ „์˜ ์ฒดํฌ์„ฌ์ด ๊ธฐ๋ก๋œ๋‹ค. go.sum์€ ๋ฐ›์€ ์˜์กด์„ฑ์ด ์œ„๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ž ๊ธˆ ์—ญํ• ์„ ํ•œ๋‹ค. Python์˜ uv.lock์ด๋‚˜ requirements.txt์˜ ํ•ด์‹œ ํ•€๊ณผ ๋น„์Šทํ•œ ์œ„์น˜๋‹ค. ๋‘ ํŒŒ์ผ ๋ชจ๋‘ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ์ปค๋ฐ‹ํ•œ๋‹ค.

Python๊ณผ ๋Œ€์‘์„ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๋‹ค.

GoPython(uv)์šฉ๋„
go get <pkg>uv add <pkg>์˜์กด์„ฑ ์ถ”๊ฐ€
go mod tidyuv sync์‹ค์ œ ์‚ฌ์šฉ์— ๋งž๊ฒŒ ์ •๋ฆฌยท๋™๊ธฐํ™”
go get -u <pkg>uv lock --upgrade-package <pkg>์—…๊ทธ๋ ˆ์ด๋“œ
go.mod + go.sumpyproject.toml + uv.lock์˜์กด์„ฑ ๋ช…์„ธ + ์ž ๊ธˆ

๋ฒค๋”๋ง์€ ์ง€๊ธˆ์€ ๋น„์„ ํ˜ธ

์˜์กด์„ฑ์„ ์ €์žฅ์†Œ ์•ˆ vendor/ ํด๋”์— ๋ณต์‚ฌํ•ด ๋„ฃ๋Š” ๋ฒค๋”๋ง๋„ ๊ฐ€๋Šฅํ•˜๋‹ค(go mod vendor). ๋‹ค๋งŒ ๋ชจ๋“ˆ ์บ์‹œ์™€ go.sum ๊ฒ€์ฆ์ด ์ž๋ฆฌ์žก์€ ์ง€๊ธˆ์€ ํŠน์ˆ˜ํ•œ ์ƒํ™ฉ(ํ์‡„๋ง ๋นŒ๋“œ ๋“ฑ)์ด ์•„๋‹ˆ๋ฉด ์ž˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ๋ณธ์€ ๋ชจ๋“ˆ ์บ์‹œ์— ๋งก๊ธด๋‹ค.


8. ๋ชจ๋“ˆ ๊ตฌ์„ฑ(ํ”„๋กœ์ ํŠธ ๋ ˆ์ด์•„์›ƒ)

์ •ํ•ด์ง„ ์ •๋‹ต ๊ตฌ์กฐ๊ฐ€ ๊ฐ•์ œ๋˜์ง€๋Š” ์•Š์ง€๋งŒ, ๊ทœ๋ชจ์— ๋”ฐ๋ผ ์ž๋ฆฌ์žก์€ ๊ด€๋ก€๊ฐ€ ์žˆ๋‹ค.

์ž‘์œผ๋ฉด ๋‹จ์ผ ํŒจํ‚ค์ง€

์ฝ”๋“œ๊ฐ€ ์ž‘์œผ๋ฉด ํด๋”๋ฅผ ๋‚˜๋ˆ„์ง€ ์•Š๊ณ  ๋ฃจํŠธ์— ํŒŒ์ผ ๋ช‡ ๊ฐœ๋กœ ๋‘”๋‹ค. package main ํ•˜๋‚˜๋กœ ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋ฏธ๋ฆฌ ํด๋”๋ถ€ํ„ฐ ์ชผ๊ฐœ๋Š” ๊ฑด ๊ณผํ•˜๋‹ค.

myproj/
โ”œโ”€โ”€ go.mod
โ”œโ”€โ”€ main.go
โ””โ”€โ”€ helper.go

์—ฌ๋Ÿฌ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” cmd/

์‹คํ–‰ ํŒŒ์ผ์„ ์—ฌ๋Ÿฟ ๋งŒ๋“ ๋‹ค๋ฉด(์˜ˆ: ์„œ๋ฒ„์™€ CLI ๋„๊ตฌ), ๋ฃจํŠธ์— cmd/ ํด๋”๋ฅผ ๋‘๊ณ  ๋ฐ”์ด๋„ˆ๋ฆฌ๋งˆ๋‹ค ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.

myproj/
โ”œโ”€โ”€ go.mod
โ”œโ”€โ”€ cmd/
โ”‚   โ”œโ”€โ”€ server/
โ”‚   โ”‚   โ””โ”€โ”€ main.go   // ์„œ๋ฒ„ ๋ฐ”์ด๋„ˆ๋ฆฌ
โ”‚   โ””โ”€โ”€ cli/
โ”‚       โ””โ”€โ”€ main.go   // CLI ๋ฐ”์ด๋„ˆ๋ฆฌ
โ”œโ”€โ”€ internal/         // ๊ณต๊ฐœํ•˜์ง€ ์•Š์„ ๋‚ด๋ถ€ ์ฝ”๋“œ
โ””โ”€โ”€ pkg/              // ์™ธ๋ถ€์— ๊ณต๊ฐœํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ(ํ•„์š”ํ•  ๋•Œ๋งŒ)
  • internal/ โ€” ์ด ๋ชจ๋“ˆ ์•ˆ์—์„œ๋งŒ ์“ฐ๋Š” ์ฝ”๋“œ(6๋ฒˆ ์ฐธ๊ณ ). ์™ธ๋ถ€ import ์ฐจ๋‹จ
  • pkg/ โ€” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ๊ฐ€์ ธ๋‹ค ์จ๋„ ๋˜๋Š” ๊ณต๊ฐœ ์ฝ”๋“œ. ํ•„์š”ํ•  ๋•Œ๋งŒ ๋งŒ๋“ ๋‹ค

pkg/๋Š” ์˜๋ฌด๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ณต๊ฐœํ•  ๊ฒŒ ์—†์œผ๋ฉด ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

์ˆœํ™˜ ์˜์กด์„ฑ์€ ์ปดํŒŒ์ผ ์—๋Ÿฌ

ํŒจํ‚ค์ง€ A๊ฐ€ B๋ฅผ importํ•˜๊ณ  B๊ฐ€ ๋‹ค์‹œ A๋ฅผ importํ•˜๋ฉด, Go๋Š” ์ด๋ฅผ ์ˆœํ™˜ ์˜์กด์„ฑ์œผ๋กœ ๋ณด๊ณ  ์ปดํŒŒ์ผ์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค. Python์€ ๋Ÿฐํƒ€์ž„์— ์ˆœํ™˜ import๋ฅผ ์–ด๋А ์ •๋„ ํ—ˆ์šฉํ•˜์ง€๋งŒ, Go๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋ง‰๋Š”๋‹ค. ์ˆœํ™˜์ด ์ƒ๊ธฐ๋ฉด ๋ณดํ†ต ๊ณตํ†ต ๋ถ€๋ถ„์„ ์ œ3์˜ ํŒจํ‚ค์ง€๋กœ ๋นผ์„œ ํ‘ผ๋‹ค.

init ํ•จ์ˆ˜์™€ blank import๋Š” ์ ˆ์ œ

ํŒจํ‚ค์ง€์—๋Š” init ํ•จ์ˆ˜๋ฅผ ๋‘˜ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ํ•จ์ˆ˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์ž๋™์œผ๋กœ ํ•œ ๋ฒˆ ์‹คํ–‰๋œ๋‹ค. ํŽธํ•ด ๋ณด์ด์ง€๋งŒ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ์ฝ”๋“œ์— ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์•„ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ๋ช…์‹œ์ ์ธ ์ดˆ๊ธฐํ™”๋ฅผ ์“ฐ๊ณ  init์€ ์ ˆ์ œํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

blank import๋Š” ๊ทธ init๋งŒ ์‹คํ–‰์‹œํ‚ค๋ ค๊ณ  ์‹๋ณ„์ž ์—†์ด ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค.

import _ "github.com/lib/pq" // ํŒจํ‚ค์ง€์˜ init๋งŒ ์‹คํ–‰(๋“œ๋ผ์ด๋ฒ„ ๋“ฑ๋ก ๋“ฑ)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„ ๋“ฑ๋ก์ฒ˜๋Ÿผ ์ •ํ•ด์ง„ ํŒจํ„ด์—์„œ๋งŒ ์“ฐ๊ณ , ์ผ๋ฐ˜์ ์ธ ์˜์กด์„ฑ ์—ฐ๊ฒฐ์—๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค.


Python ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ•œ ์ค„ ์š”์•ฝ

Go์—์„œ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๊ณ  ๋ฌถ๋Š” ๋‹จ์œ„๋Š” ํด๋”(ํŒจํ‚ค์ง€)์™€ go.mod(๋ชจ๋“ˆ)๋‹ค. ๋Œ€์†Œ๋ฌธ์ž๋กœ ๊ณต๊ฐœ ๋ฒ”์œ„๋ฅผ ์ •ํ•˜๊ณ , import ๊ฒฝ๋กœ๋Š” ๋ชจ๋“ˆ ์ด๋ฆ„์—์„œ ์ถœ๋ฐœํ•œ๋‹ค โ€” Python์ฒ˜๋Ÿผ ์•„๋ฌด ํŒŒ์ผ์ด๋‚˜ ๋Œ์–ด์˜ค๋Š” ๋Œ€์‹ , ๊ฒฝ๊ณ„๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ง€์ผœ ์ค€๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ๋ชจ๋“ˆ๊ณผ ํŒจํ‚ค์ง€์˜ ํฐ ๊ทธ๋ฆผ์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” 07ํŽธ, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” 08ํŽธ์—์„œ ๋‹ค๋ค˜๊ณ , ์•ž์œผ๋กœ๋Š” ๊ณ ๋ฃจํ‹ด๊ณผ ๋™์‹œ์„ฑ(๊ณ ๋ฃจํ‹ด ์Šค์ผ€์ค„๋ง, ์ฑ„๋„), ์ œ๋„ค๋ฆญ์ฒ˜๋Ÿผ ๋” ๊นŠ์€ ์ฃผ์ œ๋ฅผ ๋ณ„๋„ ํŽธ์—์„œ ๋‹ค๋ฃฌ๋‹ค. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ๋ฒ•์ด ๊ถ๊ธˆํ•  ๋•Œ๋Š” pkg.go.dev์—์„œ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ๊ณต๊ฐœ๋œ ๋ชจ๋“ˆ์ด ์ž๋™์œผ๋กœ ์ธ๋ฑ์‹ฑ๋˜์–ด ์žˆ์–ด, ํŒจํ‚ค์ง€์˜ ๊ณต๊ฐœ ์‹๋ณ„์ž์™€ ๋ฌธ์„œ๋ฅผ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.