Git, Github

협업과 코드관리

  • 프로젝트를 혼자 진행하는 경우는 많지 않다
  • 각자 다른 영역을 개발하더라도 코드 베이스는 함께 사용
  • 동일한 파일을 수정하는 경우는 물론이고, 각기 다른 파일을 수정하더라도 코드를 통합하는 과정이 필요
  • 이때 이용하는 도구를 형상관리 도구, 버전 관리 시스템(Version Control System)이라고 부름

Git

  • 대표적인 버전 관리 시스템
  • 리눅스 창시자 리누스 토발즈가 리눅스 코드 관리를 위해 개발
  • 이 외엔 SVN, Mercurial, CVS 등이 있음
  • 여러 VCS 들을 제치고 점유율 1위
  • 네이버 기술 블로그 D2
  • command 를 이용해 사용하기도 하고, source tree 와 같은 GUI 툴을 이용하기도 함, intellij 와 같은 IDE 에도 내장되어 있음

Git

  • 변경 이력들을 1차적으로 로컬에 저장함
  • 이로인해 오프라인 환경에서도 형상관리 기능을 이용할 수 있음(이전 버전으로 돌아가기)
  • 로컬에서 1차적인 형상관리를 진행한 후 원격 저장소에 통합을 진행함
  • 이때 원격 저장소에 저장된 내용과 충돌이 발생하면 충돌 해결을 진행
  • 브랜치를 이용해 각 개발자 별로 독립된 공간에서 작업 가능
  • 브랜치 관리에는 특별한 규칙이 없지만 정형화된 규칙을 제안하는 기법들이 있음(git flow, github flow 등)

Git

Github

  • git 을 이용해 구현한 서비스
  • 무료로 git server 를 제공하고, 웹상에서 코드리뷰를 진행할 수 있는 서비스 등을 제공
  • git 없이 github 이 있을 수는 없지만 github 없이 git 을 이용할 수는 있음(비공개 사내 git 서버 구축 등)
  • github 내에서도 비공개 리파지토리를 제공하고 있지만 기업 환경에서는 github enterprise 등을 이용하여 github 을 이용하는 경우가 많음
  • git 호스팅 외 이슈관리, 위키 등 부가서비스들도 제공
  • 개발자라면 일단 코드 관리소에 접속할 수 밖에 없으므로 github 의 다양한 기능을 이용하는 편

Github

  • 비슷한 서비스들이 여럿 있지만 이쪽 분야로는 github 이 압도적
  • 신규 기능에 대한 개발이 완료되면 github pull request 를 통해 코드리뷰를 진행하고, github 내에서 브랜치 머지를 진행함

코드리뷰

  • 개발자간에 개발 내용을 메인 브랜치에 통합하기 전에 검토하는 것
  • 개발자가 작성한 코드의 의도를 전달할 수 있고, 개발 담당자가 놓친 부분에 대한 피드백, 더 나은 코드에 대한 피드백을 받을 수 있음
  • 보통은 github 내 pull request 기능을 이용하여 온라인 코드리뷰를 진행하고, 코멘트로 의견을 나눈뒤 협업자들의 승인을 받으면 브랜치 머지를 진행
  • 온라인 상으로 진행하기에 양이 많거나 구두 설명이 필요한 경우에는 오프라인 리뷰를 진행하기도 함

코드리뷰

  • 코드리뷰를 요청한 개발자가 미처 발견하지 못한 버그가 숨어있는 경우는 분쟁의 소지가 없음
  • 더 좋은 코드에 대해 논의할 때는 조심스러운 상황이 발생하기도 함
  • "더 좋은 코드" 가 개발자간에 다를 수 있기 때문

코드리뷰

  • kernel 1기 코드리뷰와 오픈소스 컨트리뷰트시 코드리뷰

코드리뷰

  • 코드로 대화하기 위해 PR 을 생성하기도 함

좋은 코드리뷰를 위해

  • 코드리뷰 요청자는 작업 내용을 최대한 작게 가져간다
  • 코드를 검토해주는 협업자는 본인의 시간을 할애해 상대의 코드를 검토해주는 것, 작업 내용이 많아지면 내용을 파악하기도 어렵고 시간도 많이 소요됨
  • 코드에 대한 의견을 얘기하기도 쉽지 않음
  • 코드 스타일에 대해서는 상호 존중의 자세로 임한다
  • 상대의 영역에서는 상대의 의견을 존중한다
  • 의견을 제시할 수는 있지만 그걸 받아들이고 말고는 상대의 결정
  • 같은 기능 구현에 다양한 방법이 있을 수 있고, 사람마다 다를 수 있음을 상기하자

좋은 코드리뷰를 위해

  • 변경을 작게 가져가기 위해 노력한다고 하더라도 커질 수 있는 상황이 있음(패키지 변경, 클래스 변경 등)
  • 양적 변경이 많은 PR 에는 기능 변경 등 질적 변경을 포함 하지 않는게 좋음(질적 변경이 양적 변경에 묻히는 현상 발생, 잠수함 패치와 같이)

좋은 코드리뷰를 위해

  • Comment: 버그가 있는 코드는 아니지만 가급적 수정해줬으면 좋겠다는 의도 전달
  • Approve: 코멘트는 전달하지만 문제가 있는 코드는 아니므로 수용 여부는 개발자가 결정
  • Request Changes: 반드시 수정해야하는 코멘트를 전달(버그를 유발하는 코드)

좋은 코드리뷰를 위해

  • 뱅크 샐러드 기술블로그 코드 리뷰 Pn 규칙
  • https://blog.banksalad.com/tech/banksalad-code-review-culture/

브랜치 관리 전략

  • git 에서 브랜치는 개발자간의 독립적인 공간을 제공해줌
  • 브랜치를 생성하는 것에 규칙을 만들어 협업자들 간에 통일된 경험을 제공
  • 브랜치 명만 보고도 해당 작업이 어떤 작업인지 유추할 수 있음
  • git flow 가 대표적이며, github flow 도 많이 사용함

Git flow

  • feature: 기능개발을 위해 develop 으로부터 생성하는 브랜치
  • develop: 완료된 feature 브랜치들이 머지되는 브랜치, 배포 간격 사이에 추가 기능들이 머지되어 있음
  • hotfix: 이미 배포되어 있는 상태에서 급히 수정이 필요한 버그가 있는 경우 main 로부터 생성되는 브랜치, 수정 이후 main 과 develop 으로 머지
  • release: 배포 시점이 다가오면 develop 으로부터 생성되며 배포 완료 이후 main, develop 으로 머지
  • main(master): 현시점 기준 프로덕션에 배포되어 있는 무결한 브랜치
  • 정기배포가 있는 환경에 적합하며 수시배포 환경에선 사용되는 브랜치가 많음

Gitflow

실무에서 개발시 작업 흐름

  • 새로운 기능의 추가 혹은 기존 기능의 버그가 발견됨
  • 이슈관리도구(jira)에 티켓 생성
  • 개발 담당자는 develop 브랜치에서 feature 브랜치 생성
  • feature 브랜치에서 개발하며 커밋 발생
  • 개발 완료 후 github 을 통해 코드리뷰 진행
  • 이때 리뷰어들은 팀내 개발자
  • 각 조직별로 최소 승인 갯수가 필요하며, 해당 승인을 받으면 develop 브랜치에 머지
  • 머지된 기능은 테스트서버에 배포되어 테스트 진행
  • 테스트 완료 후 프로덕션 수준까지 배포가 되면 이슈관리도구의 티켓 종료

feature 브랜치

  • 브랜치 생성시 가장 고민되는 부분
  • 현업에서는 크게 두가지 방식을 사용
  • 해당 작업을 나타내는 간결한 문장을 쓰는 경우
  • feature/configure-json
  • jira 와 같은 이슈관리도구의 id 를 쓰는 경우
  • feature/ISSUE-001
  • 브랜치 이름보다는 커밋메시지가 중요

commit 메시지와 merge 전략

  • 시간이 지난후 해당 코드변경이 왜 발생했는지를 나타내는 중요한 메시지
  • 어떻게, 무엇에 대한 커밋인지보다는 왜 발생한 커밋인지를 적는게 중요
  • "로그추가, A 클래스 변경" 같은 메시지는 코드를 보면 누구나 알 수 있는 정보
  • 자세한 내용은 이슈관리도구를 이용하기위해 커밋메시지에 포함하는 경우도 있음
  • "[ISSUE-001] 송금 유효성체크 로직 개발"
  • 매 커밋마다 id 를 넣거나 변경근거를 넣는건 실무에서도 쉽지 않음

commit 메시지와 merge 전략

  • 작업이 완료된 이후 브랜치를 머지할때 3가지 방식 존재
  • Merge: feature 브랜치에서 작업한 커밋 히스토리가 그대로 main 브랜치에 포함됨

commit 메시지와 merge 전략

commit 메시지와 merge 전략

  • Squash Merge: feature 브랜치에서 작업한 내용을 하나의 커밋으로 합침. feature 브랜치에서 100개의 커밋이 있었어도 하나로 합침

commit 메시지와 merge 전략

  • Rebase Merge: main 브랜치에 머지시 각 커밋들이 재배치됨

commit 메시지와 merge 전략

  • feature 브랜치를 머지할때 Squash Merge 를 이용하면 feature 개발시 커밋 메시지를 비교적 가볍게 작성해도 괜찮음
  • 마지막에 squash 시 한방에 커밋메시지 정리 가능
  • 브랜치와 작업단위를 작게 나눌 수 있어야 함
  • 브랜치 이미지 출처(NHN 기술블로그)

Github flow

  • git flow 에서 브랜치 수를 대폭 줄임
  • git flow 보다 수시배포에 적합함
  • git flow 에서 신규 기능은 지속적으로 develop 에 머지되고, 배포가 진행되기까지 대기됨
  • 이 때문에 배포되지 않은 기능들이 모여있는 develop 과 가장 최신 배포 코드로 남아있는 main 이 모두 필요
  • github flow 에서는 신규 기능은 머지 후 바로 배포되므로 develop 과main 이 모두 있을 필요가 없음
  • hotfix 의 경우도 수정 후 바로 머지, 배포되므로 feature 와 구분해서 관리할 필요가 사라짐

Github flow

Github flow

  • 이상적으론 그렇지만 코드 통합 이후 테스트를 진행하는 git flow 에서 release 에 해당하는 브랜치가 존재하지 않음
  • 작은 기능들은 괜찮지만 큰 기능은 바로main 에 머지하기 부담스러움
  • 이때문에main 에 머지되기 이전 테스트를 위한 test 브랜치를 별도로 운영중

Git, Github

By changyong

Git, Github

  • 134