23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
구조적이고 재사용 가능한 프로그램을 만들기 위해서 "공통으로 사용될 수 있는 코드는 모듈로 만들자" 는 소프트웨어 개발의 중요한 철학 중 하나입니다.
특히 MSA (Micro Service Architecture) 구조의 서비스 아키텍쳐를 채택할 경우,
각 micro service 에서 공통으로 사용하는 모듈 (ex. 외부 API 에 request 를 보내기 위한 client,
여러 서비스에서 공통으로 사용하는 cache 핸들링 등) 을 각각의 서비스에서 별도로 관리하다보면 코드 간 동기화가 깨지는 경우가 발생하기 마련이고 유지보수도 어렵게 됩니다.
이러한 문제를 해결하기 위해서, Git 의 Submodule 기능을 프로젝트에 도입하는 방법을 알아봅시다.
먼저 서브모듈에서 "모듈" 이란 무엇일까요? 모듈이란, 소프트웨어 설계에서 기능단위로 분해하고 추상화 되어 재사용 및 공유 가능한 수준으로 만들어진 단위입니다.
Git 에서의 서브 모듈은 "Git 저장소 (메인 저장소) 안에 다른 Git 저장소 (서브 저장소 - 재사용 및 공유 가능한 공통 "모듈"들을 주로 의미) 를 디렉토리로 분리해 넣는 것" 입니다.
이 때, 메인 저장소와 서브 저장소의 커밋들은 동기화되지 않으며, 별도로 관리하게 됩니다.
먼저, 서브 모듈을 사용하기 위해 메인 저장소와 서브 저장소를 각각 "main-repo" 와 "sub-repo" 의 이름으로 생성합니다.
서브모듈을 포함하고자 하는 메인 프로젝트를 다운 받아봅시다.
> git clone git@github.com:user/main-repo.git
Cloning into 'main-repo'...그리고, 메인 프로젝트에서 다음 명령어를 실행하여 submodule 을 추가합니다.
git submodule add [repo-url] [path]
여기서 repo-url 은 추가하고자 하는 서브모듈 저장소의 URL, path 는 submodule 을 포함시킬 하위 디렉토리의 path 를 의미합니다.
> git submodule add git@github.com:user/sub-repo.git sub
Cloning into '/Users/dev/main-repo/sub'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.git status 를 실행하여 현재 프로젝트에서 변경된 사항을 출력해봅시다.
> git status
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: .gitmodules
new file: sub.gitmodules 라는 파일과, sub 라는 디렉토리가 새로 생긴 것을 확인할 수 있습니다.
.gitmodules 는 다음과 같이, 서브 디렉토리와 하위 프로젝트 URL 의 매핑 정보를 담은 설정 파일입니다.
> vi gitmodules
[submodule "sub"]
path = sub
url = git@github.com:user/sub-repo.gitpath 에는 submodule 이 들어있는 경로가, url 에는 서브 저장소의 url 이 매핑되어 있습니다.
이제 서브 모듈을 추가한 내용을 다음과 같이 메인 저장소의 remote 로 push 합니다.
> git add .
> git commit -m "feat: add submodules"
[main (root-commit) 2f513f5] feat: add submodules
2 files changed, 4 insertions(+)
create mode 100644 .gitmodules
create mode 160000 sub
> git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 318 bytes | 318.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:user/main-repo.git
* [new branch] main -> main이러한 과정을 거치면, 메인 프로젝트에서 서브모듈을 시작할 준비는 완료됩니다!
서브모듈을 포함한 메인 프로젝트를 최초로 Clone 할 때에는 일반 프로젝트와 다르게 서브모듈에 대한 몇 가지 설정을 해주어야 합니다.
바로, 1) 서브모듈 초기화 2) 서브모듈 업데이트 (리모트 저장소로부터 pull 받아오기) 두 가지 과정입니다.
이 과정을 각각 수행하려면 다음과 같이 진행합니다.
먼저, 메인 레포지토리를 clone 받아옵니다.
> git clone git@github.com:user/main-repo.git
Cloning into 'main-repo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.다음으로 서브모듈을 초기화합니다. 서브 모듈 정보를 기반으로 로컬 환경설정 파일 준비하는 과정입니다.
> git submodule init
Submodule 'sub' (git@github.com:user/sub-repo.git) registered for path 'sub'마지막으로, 서브모듈을 업데이트 (리모트 저장소로부터 pull 받아오기) 합니다.
서브모듈 remote 저장소에서 데이터를 가져오고, 서브모듈을 포함한 프로젝트의 현재 스냅샷에서 Checkout 해야 할 커밋 정보를 가져와서 서브모듈 프로젝트에 대한 Checkout 하는 과정입니다.
> git submodule update
Cloning into '/Users/user/dev/main-repo/sub'...
Submodule path 'sub': checked out '7e39f89295c7886ce1c60aa67a205063fe52e146'이러한 과정을 clone 하면서 한번에 수행하고 싶다! 라고 하면, 다음과 같이 진행해주시면 됩니다.
> git clone --recurse-submodules git@github.com:user/main-repo.git
Cloning into 'main-repo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
Submodule 'sub' (git@github.com:user/sub-repo.git) registered for path 'sub'
Cloning into '/Users/dev/main-repo/sub'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.
Submodule path 'sub': checked out '7e39f89295c7886ce1c60aa67a205063fe52e146'과정을 살펴보면,
먼저 main-repo 의 데이터를 clone 받아오고,
서브 모듈을 초기화 (지정된 path 에 module 을 등록)
서브모듈을 업데이트 (리모트 저장소로부터 pull 받아오기) 하는 순서로 진행된 것을 확인할 수 있습니다.
프로젝트를 진행하다보면, 서브 모듈 레포지토리에 변경 사항이 발생할 때가 있을 것입니다. 앞서 말씀드린 것처럼,
메인 프로젝트의 커밋과 서브모듈의 커밋은 독립적으로 동작하기 때문에,
서브 모듈의 변경사항이 발생할 때 해당 사항이 메인 프로젝트에 자동으로 반영되지 않습니다. 이 부분이 서브 모듈 사용 시에 주의해야 할 포인트입니다.
메인 프로젝트에서 사용 중인 서브 모듈이 이전 버전을 반영하고 있을 수 있는 것이죠. 이를 방지하기 위해 다음과 같이 서브 모듈의 상태를 주기적으로 확인하고, 변경 사항이 있을 시 적용해주는 것이 중요합니다.
서브모듈의 상태를 확인하기 위해서는 다음의 커멘드를 실행합니다.
> git submodule status
07b6383bae047572b5c4c7b8e41b5cdd7935c9c8 sub (heads/main)head 가 메인에 있으며, commit ID 를 확인해보니 최신 commit 을 가리키고 있는 것으로 보입니다.
서브 모듈에 약간의 변경 사항을 적용하여 push 해보겠습니다.
> git add test.py
> git commit -m "fix: add submodule"
[main 7e39f89] fix: test.py
1 file changed, 1 insertion(+), 1 deletion(-)
> git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 267 bytes | 267.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:user/sub-repo.git
07b6383..7e39f89 main -> main서브 모듈에 의 새로운 커밋을 push 하였습니다.
다시 서브모듈의 상태를 확인하기 위해 다음의 커멘드를 실행합니다.
> git submodule status
07b6383bae047572b5c4c7b8e41b5cdd7935c9c8 sub (heads/main)head 가 메인에 있으며, commit ID 를 확인해보니 여전히 이전 commit 을 가리키고 있는 것으로 보입니다.
서브 모듈의 최신 상태를 업데이트하기 위해 다음의 커멘드를 실행합니다.
> git submodule update —remote
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 247 bytes | 49.00 KiB/s, done.
From github.com:user/sub-repo
07b6383..7e39f89 main -> origin/main
Submodule path 'sub': checked out '7e39f89295c7886ce1c60aa67a205063fe52e146'다시 서브 모듈의 상태를 확인해봅시다.
> git submodule status
+7e39f89295c7886ce1c60aa67a205063fe52e146 sub (remotes/origin/HEAD)서브 모듈의 두 번째 commit ID 7e39f89295c7886ce1c60aa67a205063fe52e146 가 보여지고 있네요.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.