Dev_TIMI

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

by its_TIMI

Git์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ €์žฅ์†Œ๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ, MSA(Microservices Architecture), ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง์ ‘ ๊ด€๋ฆฌ ๋“ฑ์ด ํ•ด๋‹น๋œ๋‹ค.

์ด๋•Œ, ์—ฌ๋Ÿฌ ์ €์žฅ์†Œ๋ฅผ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ Git Submodule์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ง‰์ƒ ์‚ฌ์šฉํ•ด๋ณด๋ ค ํ•˜๋ฉด Git Submodule์ด ์ •๋ง ํ•„์š”ํ•œ๊ฐ€? ๋ผ๋Š” ๊ณ ๋ฏผ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Subtree, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(npm, pip, maven) ๊ฐ™์€ ๋Œ€์•ˆ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.๐Ÿค”

 

์ด ๊ธ€์—์„œ๋Š” Git Submodule์ด ๋ฌด์—‡์ธ์ง€, ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณธ๋‹ค. 


Git Submodule vs Git Subtree vs ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €, ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ?

 

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

๋ฐฉ์‹ ํŠน์ง• ์‚ฌ์šฉ ์‚ฌ๋ก€
Git Submodule ๋…๋ฆฝ์ ์ธ ๋ ˆํฌ๋ฅผ ๋งํฌํ•˜์—ฌ ๊ด€๋ฆฌ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌํ•จ, ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์ ํŠธ ์œ ์ง€
Git Subtree ์™ธ๋ถ€ ๋ ˆํฌ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ๋ณ‘ํ•ฉ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‰ฝ๊ฒŒ ๋ฐ˜์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € (npm, pip, maven ๋“ฑ) ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฒ„์ „๋ณ„๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

 

ํ•œ๋งˆ๋””๋กœ ์ •๋ฆฌํ•˜๋ฉด?

Submodule: ์™ธ๋ถ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ํŠน์ • ๋ฒ„์ „ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์ ์ ˆ

Subtree: ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ๋‚ด ๋ ˆํฌ์— ํ†ตํ•ฉํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์™€์•ผ ํ•  ๋•Œ ์ ์ ˆ

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„๋กœ ์œ ์ง€ํ•˜๋ฉฐ ์‰ฝ๊ฒŒ ์„ค์น˜·๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ ์ ˆ

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ, ์„œ๋ธŒ๋ชจ๋“ˆ์€ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ํฌํ•จํ•  ๋•Œ ์ ํ•ฉํ•˜์ง€๋งŒ, ์ž์ฃผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์„œ๋ธŒํŠธ๋ฆฌ๋‚˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ› ๏ธ Git Submodule ์‚ฌ์šฉ๋ฒ•

 

1๏ธโƒฃ ์„œ๋ธŒ๋ชจ๋“ˆ ์ถ”๊ฐ€ํ•˜๊ธฐ

 

Submodule์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋ณธ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด, common-library๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ libs/common-library ํด๋”์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

git submodule add https://github.com/example/common-library.git libs/common-library
git commit -m "Add submodule: common-library"

 

์ด์ œ libs/common-library ํด๋”์— common-library ๋ ˆํฌ๊ฐ€ ํฌํ•จ๋œ๋‹ค.

 


2๏ธโƒฃ ์„œ๋ธŒ๋ชจ๋“ˆ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํด๋ก ํ•  ๋•Œ

 

์„œ๋ธŒ๋ชจ๋“ˆ์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ํด๋ก ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ธŒ๋ชจ๋“ˆ์ด ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ์„œ๋ธŒ๋ชจ๋“ˆ์„ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด --recurse-submodules ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

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

 

์ด๋ฏธ ํด๋ก ํ•œ ๊ฒฝ์šฐ, ์„œ๋ธŒ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

git submodule update --init --recursive

 

 


3๏ธโƒฃ ์„œ๋ธŒ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ

 

Submodule์€ ๋…๋ฆฝ์ ์ธ ์ €์žฅ์†Œ์ด๋ฏ€๋กœ, ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ์™€ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

git submodule update --remote

 

์„œ๋ธŒ๋ชจ๋“ˆ์ด ํŠน์ • ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ๋ผ๊ฐ€๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

cd <์„œ๋ธŒ๋ชจ๋“ˆ_๋””๋ ‰ํ† ๋ฆฌ>
git checkout main
cd ..
git add <์„œ๋ธŒ๋ชจ๋“ˆ_๋””๋ ‰ํ† ๋ฆฌ>
git commit -m "Update submodule to latest version"

4๏ธโƒฃ ์„œ๋ธŒ๋ชจ๋“ˆ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•

 

์„œ๋ธŒ๋ชจ๋“ˆ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

git submodule deinit -f libs/common-library
rm -rf .git/modules/libs/common-library
git rm -f libs/common-library
git commit -m "Remove submodule: common-library"

 

์ด์ œ ์„œ๋ธŒ๋ชจ๋“ˆ์ด ์™„์ „ํžˆ ์ œ๊ฑฐ๋œ๋‹ค.

 


โš ๏ธ Git Submodule ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

 

โœ” ๊ด€๋ฆฌ ๋‚œ์ด๋„ ์ฆ๊ฐ€

    : ์„œ๋ธŒ๋ชจ๋“ˆ์€ ๊ธฐ๋ณธ Git ์›Œํฌํ”Œ๋กœ์šฐ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ, ํŒ€์›๋“ค์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค.

 

โœ” CI/CD ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ

    : ์ผ๋ถ€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋Š” ์„œ๋ธŒ๋ชจ๋“ˆ์„ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์œผ๋ฏ€๋กœ, .gitmodules๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ˆ™์ง€ํ•ด์•ผ ํ•œ๋‹ค.

 

โœ” ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์ ์ธ ๋ณต์žก๋„ ์ฆ๊ฐ€

    : ๋‹จ์ˆœํ•œ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์„œ๋ธŒ๋ชจ๋“ˆ๋ณด๋‹ค ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

 


๐Ÿš€ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ…

 

Git Submodule์€ ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ Git ์ €์žฅ์†Œ๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ MSA ํ™˜๊ฒฝ์—์„œ ํŠน์ • ๋ชจ๋“ˆ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์œ ์ง€ํ•  ๊ฒฝ์šฐ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด,

โ“ ์„œ๋ธŒ๋ชจ๋“ˆ์ด ์ ์ ˆํ•œ ๊ฒฝ์šฐโ“ 

โœ” ํŠน์ • ์™ธ๋ถ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋…๋ฆฝ์ ์ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•  ๋•Œ

โœ” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ํฌํ•จํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

โœ” ํ”„๋กœ์ ํŠธ ๊ฐ„ ๊ฐ•ํ•œ ์˜์กด์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ (ex: ๋‚ด๋ถ€ ๊ณตํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

 

์ ์ ˆํ•˜๋‹ค.

 

ํ•˜์ง€๋งŒ, ์„œ๋ธŒ๋ชจ๋“ˆ์„ ๊ณผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ ์ค‘ํ•˜๊ฒŒ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๊ฒฐ๊ตญ, ํŒ€ ๋‚ด์—์„œ ์„œ๋ธŒ๋ชจ๋“ˆ์ด ๊ผญ ํ•„์š”ํ•œ์ง€ ๋…ผ์˜ํ•˜๊ณ  ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” Git Subtree์™€์˜ ์ฐจ์ด์ ๊ณผ ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ๊นŠ์ด ๋ถ„์„ํ•  ์˜ˆ์ •์ด๋‹ค. 

๋ฐ˜์‘ํ˜•

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Dev_TIMI

its_TIMI

ํ™œ๋™ํ•˜๊ธฐ