์Šค๋‚ต๊นƒ ๐Ÿช : Git Submodule - ์—ฌ๋Ÿฌ ๋ ˆํฌ๋ฅผ ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฃจ๋Š” ๋ฒ•

Nova | ๊น€์ธํ›„ยท2025๋…„ 3์›” 15์ผ

์Šค๋‚ต๊นƒ ๐Ÿช

๋ชฉ๋ก ๋ณด๊ธฐ
1/2
post-thumbnail

Git Submodule์„ ์จ์•ผ ํ• ๊นŒ? ๐Ÿค”

ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ €์žฅ์†Œ๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ˆœ๊ฐ„, Git Submodule์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”.

ํ•˜์ง€๋งŒ ์ •๋ง Submodule์ด ์ตœ์„ ์ผ๊นŒ์š”? ๐Ÿค”

๋…๋ฆฝ์ ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ํŠน์ • ๋ฒ„์ „ ์ƒํƒœ๋ฅผ ๊ณ ์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด Submodule์ด ์ ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์žฆ๊ณ , ์ตœ์‹  ๋ฒ„์ „์„ ์ž์ฃผ ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค๋ฉด Subtree๋‚˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(npm, pip ๋“ฑ)๊ฐ€ ๋” ๋‚˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ Git Submodule์˜ ๊ฐœ๋…๊ณผ ํ™œ์šฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ MSA(Microservices Architecture)์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

โธป

MSA์—์„œ Git Submodule์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

โœ… Submodule์ด ์ ์ ˆํ•œ ๊ฒฝ์šฐ

MSA ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค๊ฐ€ ํ˜‘๋ ฅํ•˜์—ฌ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ์š”.
๊ฐ ์„œ๋น„์Šค๊ฐ€ ๊ณตํ†ต๋œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋…๋ฆฝ์ ์œผ๋กœ ์šด์˜๋˜๊ธธ ์›ํ•  ๋•Œ, Git Submodule์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์˜ˆ์ œ: ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—์„œ ๊ณต์œ ํ•˜๋Š” ๊ฒฝ์šฐ


์ƒํ™ฉ

  • MSA์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค(์˜ˆ: user-service, order-service, payment-service)๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์„œ๋น„์Šค์—์„œ ๊ณตํ†ต๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ฝ”๋“œ(common-utils)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ด ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํŠน์ • ๋ฒ„์ „์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—์„œ ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ Git Submodule๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด,
    ๊ฐ ์„œ๋น„์Šค๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜๋ฉด์„œ๋„ ํŠน์ • ๋ฒ„์ „์˜ common-utils๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—์„œ ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์„œ๋ธŒ๋ชจ๋“ˆ๋กœ ์ถ”๊ฐ€

    cd user-service
    git submodule add https://github.com/company/common-utils.git libs/common-utils
    git commit -m "Add common-utils submodule"
    cd ../order-service
    git submodule add https://github.com/company/common-utils.git libs/common-utils
    git commit -m "Add common-utils submodule"
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด common-utils๋Š” ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ๋…๋ฆฝ์ ์ธ ํด๋”๋กœ ์กด์žฌํ•˜์ง€๋งŒ,
    ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋ฉด ํ•œ ๋ฒˆ์˜ ์—…๋ฐ์ดํŠธ๋กœ ๋ชจ๋“  ์„œ๋น„์Šค์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๊ฐ ์„œ๋น„์Šค๋Š” ํŠน์ • ๋ฒ„์ „์˜ common-utils๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ํ•„์š”ํ•  ๋•Œ๋งŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ ์—…๋ฐ์ดํŠธ (ํ•„์š”ํ•  ๋•Œ๋งŒ)

    cd libs/common-utils
    git pull origin main
    cd ../..
    git add .
    git commit -m "Update common-utils to latest version"

โธป

โŒ Git Submodule์ด ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

MSA์—์„œ Git Submodule์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ธ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ณตํ†ต ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์–ด ๋ชจ๋“  ์„œ๋น„์Šค์—์„œ ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์„ ์œ ์ง€ํ•ด์•ผ ํ•  ๋•Œ
  • ๊ณตํ†ต ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ˆœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋ฉด, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(npm, pip, maven)๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ 
  • ๋ชจ๋“  ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ๊ฐ™์€ ์ €์žฅ์†Œ์— ์žˆ๋Š” ๋ชจ๋†€๋ฆฌ์‹(monolithic) ํ”„๋กœ์ ํŠธ์ผ ๋•Œ

๐Ÿ“Œ ์˜ˆ์ œ: API ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

์ƒํ™ฉ

  • api-client๋ผ๋Š” ๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ณ ,
    ๋ชจ๋“  ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค(user-service, order-service, payment-service)์—์„œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋ฉฐ, ๋ชจ๋“  ์„œ๋น„์Šค์—์„œ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ์ด ๊ฒฝ์šฐ api-client๋ฅผ Git Submodule๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค,
    ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(npm, pip, maven ๋“ฑ)๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

    ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ (์˜ˆ: npm)

    npm install @company/api-client@latest
    • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—์„œ ์ตœ์‹  ๋ฒ„์ „์˜ api-client๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด,
      Git Submodule์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

โธป

Git Submodule vs Git Subtree vs ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋น„๊ต

Git Submodule์„ ๋„์ž…ํ•˜๊ธฐ ์ „์—, ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค๊ณผ ๋น„๊ตํ•ด๋ณผ๊ฒŒ์š”.

์ฆ‰,

  • Git Submodule์€ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์ž์ฃผ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์ž์ฃผ ์ผ์–ด๋‚œ๋‹ค๋ฉด Git Subtree๋‚˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ ๋” ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โธป

Git Submodule ์‚ฌ์šฉ๋ฒ• ์š”์•ฝ

Submodule ์ถ”๊ฐ€

git submodule add <์„œ๋ธŒ๋ชจ๋“ˆ_๋ ˆํฌ_URL> <์„œ๋ธŒ๋ชจ๋“ˆ_๋””๋ ‰ํ† ๋ฆฌ_๊ฒฝ๋กœ>
git commit -m "Add submodule"

์„œ๋ธŒ๋ชจ๋“ˆ์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ํด๋ก ํ•  ๋•Œ

git clone --recurse-submodules <๋ ˆํฌ_URL>

or

git submodule update --init --recursive

์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ

git submodule update --remote

์„œ๋ธŒ๋ชจ๋“ˆ ์‚ญ์ œ

git submodule deinit -f <์„œ๋ธŒ๋ชจ๋“ˆ_๋””๋ ‰ํ† ๋ฆฌ>
rm -rf .git/modules/<์„œ๋ธŒ๋ชจ๋“ˆ_๋””๋ ‰ํ† ๋ฆฌ>
git rm -f <์„œ๋ธŒ๋ชจ๋“ˆ_๋””๋ ‰ํ† ๋ฆฌ>
git commit -m "Remove submodule"

โธป

๐Ÿ“Œ ๊ฒฐ๋ก : Git Submodule์„ ์จ์•ผ ํ• ๊นŒ?

Git Submodule์„ ์“ฐ๊ธฐ ์ข‹์€ ๊ฒฝ์šฐ๐Ÿคญ

  • ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ๋‚ด ํ”„๋กœ์ ํŠธ์— ํฌํ•จํ•ด์•ผ ํ•  ๋•Œ
  • ํŠน์ • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณ ์ •๋œ ๋ฒ„์ „์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•  ๋•Œ
  • ๋ณ€๊ฒฝ์ด ์ž์ฃผ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์„œ๋ธŒ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ

Git Submodule์ด ๋น„ํšจ์œจ์ ์ธ ๊ฒฝ์šฐ๐Ÿ˜ต

  • ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ณ , ์ตœ์‹  ๋ฒ„์ „์„ ๊ณ„์† ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(npm, pip, maven)๋กœ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ ๊ฒฝ์šฐ

โธป

Git Submodule, ์—ฌ๋Ÿฌ๋ถ„์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”?

Git Submodule์„ ์จ์•ผ ํ• ๊นŒ์š”?
์•„๋‹ˆ๋ฉด Git Subtree๋‚˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ ๋” ๋‚˜์„๊นŒ์š”?


๐ŸŽ ์‹ค์ˆ˜์—์„œ ๋ฐฐ์šฐ๋Š” Git ๊ฐ•์˜๋„ ์žˆ์–ด์š”!

ํ˜น์‹œ Git ์ถฉ๋Œ, ๋˜๋Œ๋ฆฌ๊ธฐ, ํ˜‘์—… ๋ธŒ๋žœ์น˜ ์ „๋žต ๋“ฑ
์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ์‹ค์Šต ์ค‘์‹ฌ์œผ๋กœ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด,
์ œ๊ฐ€ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๋งŒ๋“  ๊ฐ•์˜๋„ ์ฐธ๊ณ ํ•ด๋ณด์„ธ์š”!

  • ๋˜๋Œ๋ฆฌ๋Š” ๊ฐ๊ฐ: reflog, reset, revert, ์•ˆ์ „ํ•œ push
  • ํ˜‘์—… ๋ฃจํ‹ด: ๋ธŒ๋žœ์น˜ ์ „๋žต, PR ์ฒดํฌ๋ฆฌ์ŠคํŠธ, ๋ณดํ˜ธ ๊ทœ์น™
  • ์‹ค์Šต ๋ ˆํฌ ๊ธฐ๋ฐ˜ ์‹œ๋‚˜๋ฆฌ์˜ค 6์ข…์œผ๋กœ ์ง์ ‘ ๋ชธ์œผ๋กœ ์ตํžˆ๋Š” ํ๋ฆ„

๐ŸŽฌ ๊ฐ•์˜ ์†Œ๊ฐœ ์˜์ƒ: https://lnkd.in/gMWTUSf3
๐Ÿ“Œ ์ˆ˜๊ฐ• ๋งํฌ: https://lnkd.in/gVVBhJ4g
๐Ÿ’ธ ์˜คํ”ˆ ๊ธฐ๋… ํ• ์ธ ์ค‘์ž…๋‹ˆ๋‹ค!

์—์ด์ „ํŠธ๊ฐ€ ์ฝ”๋“œ๋Š” ์ž˜ ์งœ์ค˜๋„,
๋ฒ„์ „ ๊ด€๋ฆฌ ์Šต๊ด€์€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์•ผ ์šฐ๋ฆฌ๊ฐ€ ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธฐํšŒ์— Git๊ณผ ์ข€ ๋” ์นœํ•ด์ ธ๋ณด์„ธ์š”. ๐Ÿ™‚

0๊ฐœ์˜ ๋Œ“๊ธ€