Tech Insight/소프트웨어 엔지니어링 SE

개발 생산성을 높이는 원자적 커밋 (Atomic Commit)

ain.y 2023. 3. 17. 18:38

개발자로서 일하는 방식 그리고 생산성을 높일 수 있는 개발 방법론과 관련해 해외 아티클 'How atomic Git commits dramatically increased my productivity - and will increase yours too'을 소개하고자 합니다.

 

본문은 원자적 커밋(Atomic commit)이 무엇인지, 원자적 커밋을 작성해야 하는 이유에 대해 설명합니다. 영문으로 되어 있는 글이라 중요한 부분들을 위주로 번역하여 정리해 보았습니다.

 

⚛️ 원자적 커밋이란?

원자적 커밋(또는 Atomic git commit)은 커밋의 크기가 가능한 한 작다는 것을 의미합니다. 각 커밋은 간단한 문장으로 요약할 수 있는 단 하나의 간단한 작업을 수행합니다.

 

이때, 변경된 코드의 양은 중요하지 않습니다. 한 글자일 수도 있고, 십만 줄이 될 수도 있지만, 변경 내역이 짧고 간단한 하나의 문장으로 설명될 수 있어야 합니다.

 

이상적으로는, 커밋을 할 때 테스트 스위트(Test Suite, 테스트 케이스들을 하나로 묶은 단위)가 '녹색'인 상태가 되는 것입니다. 즉, 원자적 커밋은 변경점은 가능한 작은 크기에서 (테스트를 통과한) 완전한 커밋을 지향한다고 볼 수 있습니다.

 

💡원자적 커밋을 작성해야 하는 이유

원자적 커밋을 실행하면 몇 가지 큰 이점이 있습니다. 하지만 가장 강조하고 싶은 부분은 마지막 이유인데요. 원자적 커밋을 통해 작업에 대한 접근 방식이 완전히 달라질 수 있고, 생산성이 크게 향상되며, 작업이 훨씬 즐거워질 수 있기 때문입니다.

 

이유 1. 원자적 변경은 가역적 변경이 가능함

많은 개발자들이 알다시피, 소프트웨어의 요구사항은 항상 변화합니다. 원자적 커밋을 작성함으로써, 우리는 모든 변경사항을 간단하게 되돌릴 수 있습니다. (역자 의견: 작은 단위의 커밋일수록 되돌리기에 더 수월하다는 점을 이야기하는 것 같습니다.)

 

이유 2. 명료한 git 히스토리

문제가 발생했을 때, 명료한 git 기록은 마치 불이 나기 전 집의 보험을 드는 것과 같은 의미를 갖습니다.

 

이유 3. Pull Request 검토에 용이함

필자가 생각하는 원자적 커밋을 해야 하는 가장 중요한 이유이기도 한데요. 문제 해결에 접근하는 방식이 완전히 바뀔 수 있다는 점입니다.

 

기능 개발을 할 때, '그저 그렇게' 하려다 보면 결국 누락되거나 예상보다 훨씬 더 많은 변경 사항이 발생하기도 합니다. 이는 일을 하는 잘못된 방법이기도 한데요. 실은 우리 모두 올바른 방법에 대해 알고 있습니다.

 

크고 복잡한 작업을 완료하기 위해 잘 알려진 방법은 더 작고 관리하고 쉬운 단계로 줄이는 것입니다. 각 단계는 해결해야 하는 해결해야 할 문제입니다. 어쩌면 이미 많이 들어봤을 법한 조언이지만 실제로 업무에서 제대로 실천하고 있는지는 스스로 돌아봐야 할 부분입니다.

 

그리고 필자는 이를 실천하기 좋은 방법이 바로 원자적 커밋을 작성하는 것이라고 합니다.

 

원자적 커밋에서 더 작은 단계로 단순화하여, 올바른 방식으로 작업에 접근해야 합니다. 결국 복잡성을 단순화하는 것이 핵심입니다.

 

그렇다면 왜 우리는 항상 의식적으로 그렇게 하지 못하는 것일까요? 뻔한 조언이 될 수도 있지만, 분명한 것은 그렇게 하기 위해 반복하면서 많은 연습이 필요하다는 것입니다.

 

작업을 더 간단히, 더 관리하기 쉽게, 그리고 가장 중요한 '더 쉽게' 만드세요. 스몰 스텝 하세요. 작은 커밋을 작성하세요. 그렇게 일상의 원자적 커밋을 실천해 보길 바랍니다.

 

 

How atomic Git commits dramatically increased my productivity - and will increase yours too

Atomic: of or forming a single irreducible unit or component in a larger system. Also available on...

dev.to