[DEV] Git/Github 익히기
1. 소프트웨어 개발 Plan
- 요구조건은 계속해서 변화함
- 디자인 시 모든 문제를 미리 알 수 없음
- water-fall 모델은 소프트웨어 개발에 부적합
- 속도에 더 치중하는 것이 일반적
애자일 개발 방법론 (Agile Development)
- 짧게 자주 반복해서 계산해 나가자!
- 아는 만큼, 보이는 만큼 만들어가자
- 개발 단위가 짧은 사이클이 됨 =
스프린트 (Sprint)
- 보통 2주
매 사이클마다 다음 작업 반복
- 작업 별로 우선순위 결정 (Backlog Prioritization)
- 보통 PM들이 수행
- Grooming이라고도 부름
- 각 작업별로 중요도와 복잡도 결정 (Point)
- 미리 우선순위를 만들어놓아야 함 - 그렇지 않을 경우 Planning이 길어짐
- 이번 사이클에 일할 작업 결정 (Planning)
- 매인 Standup 미팅 (5분-10분)
- 상황 빠르게 공유 & 문제 상황 공유
- 마지막 날 Retrospective & Demo 미팅
- 잘 된 부분, 아쉬운 부분, 개선할 점 등 회고
- 이번 스프린트에 무엇을 했는지 시각화하여 공유
스프린트 카드 예제
- 타이틀
- 작업 타이틀
- 세부설명
- 포인트 (숫자)
- 중요도와 복잡도
- 성공의 정의
- Definition of Done
- 체크리스트
- 이 작업이 성공적으로 끝나는데 필요한 세부 작업들
- software
- JIRA
- Trello
플래닝 포커 (Planning Poker)
- 작업별 일정 산정 기법
- 작업별로 포인트를 산정
- 포인트의 정의는 회사마다 다름
- ex) 1 포인트는 1 full day for a developer
- 개발자들이 모여 다 같이 작업별로 들어가는 일정을 산정하는 방법
- 일정의 투표
- 너무 다른 의견들이 존재할 경우 약간의 토론을 거쳐 어느 정도 수렴할 때까지 진행
일일 스탠드업
- 매일 모든 팀원들이 10-15분씩 모여서 각자 상황 공유 : 빠르게 !!
- 공유 내용
- 마지막 스탠드업 이후로 한 작업들
- 오늘 하려고 하는 일이나 진행 중인 일
- 일을 함에 있어 문제가 있거나 도움이 필요하면 언급
- 논의가 필요한 일들은 스탠드업에서 다루는 것이 아니라, 따로 모여서 회의를 진행해야 함
2. 개발 시작 / tracking
흔히 사용되는 툴
- JIRA
- 프로젝트 관리를 위한 전반적인 기능을 제공하는 툴
- Agile Scrum 관리 툴, SVN, Wiki 등
- 많은 수의 회사들이 프로젝트 관리를 위해 사용
- 프로젝트 관리를 위한 전반적인 기능을 제공하는 툴
- Trello
- Agile Scrum 관리를 위한 툴
- JIRA에 비해 훨씬 더 직관적인 단순한 인터페이스 제공
- JIRA가 최근 인수해서 결국 같은 회사가 됨
3. 소스 버전 컨트롤
-
개발자들이 자신이 개발하는 소프트웨어의 소스 코드에 발생하는 변경사항들을 관리할 수 있도록 해주는 시스템
- 코드에 생기는 변경사항을 쉽게 추적할 수 있음
- ex) 에러 발생 시 이전 버전으로 Rollback
- 두 사람 이상이 공동 개발 시 코드의 공유와 변경이 용이
- 최근 시스템들은 코드리뷰도 지원
- 코드 백업의 역할 수행
소프트웨어
- CVS (Concurrent Version System)
- SVN (SubVersionN)
- Git/Github
- 가장 인기있는 버전 컨트롤 소프트웨어
- 웬만한 오픈소스 소프트웨어들은 Github 상에 존재
- GitHub == Git + Bug Tracking (Issue) + Wiki on Cloud
코드 리뷰
- 주니어 개발자나 새로 온 개발자들을 트레이닝 시키는 최선의 방법
- 단점은 리뷰를 해야 하는 사람들이 이미 바쁘다는 것!
- 스프린트 플래닝시 이를 고려하여 태스크 할당해야 함
- 좋은 코드 리뷰 방법
- 요청하는 이
- 되도록 조금씩 자주 요청, Unit test와 같이 요청하면 최상
- 주석을 최대한 추가하고, 무슨 이유에서 무엇을 하려고 하는 것인지 설명
- 리뷰하는 이
- 코딩 스타일에 대한 것보다는 코드 자체에 대해 이야기
- 충분히 시간을 들여 도움이 되는 리뷰 제공
- 코드 리뷰에 편리한 툴 사용
- 요청하는 이
- Github
- 이전 코드와 새로 들어간 코드를 highlighting 하여 보여줌
4. Test
- 테스트가 기본 ! !
- 개발 시 테스트를 어떻게 할 것인지부터 생각
- 테스트 코드부터 작성
- 코드 구성 자체가 테스트에 편리하게 되는 효과
- 자신이 만드려는 기능에 대해 더 생각하게 됨
- 코드 자체가 잘 구성되어 있지 않으면 테스트가 불가능
테스트 종류
- Unit Test
- 모듈의 특정 기능 (함수) 테스트
- 보통 테스트라고 하면 유닛 테스트를 말함
- Integration Test
- 여러 모듈을 통합하여 하는 한 차원 위의 테스트
- Acceptance Test
- 트래픽이 몰릴 때 견딜 수 있는지 테스트
- UI Test
- 요즘은 Selenium 등의 툴을 이용해서 웹페이지 자체의 기능을 테스트하는 것이 대세
테스트의 중요성
- 많은 회사들이 코드 변경의 일부로 Unit Test를 의무적으로 요구
- 테스트가 없으면 아예 코드 체크인이 실패
- 테스트가 많을수록 이점이 증대
- 시스템 안정성 증대
- Refactoring 할 경우, 혹은 신입 엔지니어가 코드를 수정할 때 편리
- 테스트를 작성하기가 너무 힘든 경우에는 스프린트 플래닝 때 시간을 넉넉히 배당
5. Build
- 자신(팀)이 개발한 소프트웨어를 최종적으로 출시하기 위한 형태로 만드는 것
- 테스트가 빌드의 중요한 일부로 포함
- 개발이 끝나기 전부터 빌드를 하면 소프트웨어의 안정성 증대
- Continuous Integration!
Continuous Integration (CI)
-
코드 변경시마다 테스트를 다 돌리는 것
- 코드 Repo는 하나만 유지 (Master)
- 코드 변경을 최대한 자주 반영
- 테스트를 최대한 추가
- Test Coverage
- 빌드를 계속적으로 수행 (자동화)
- Commit Build vs. Nightly Build
- 성공한 빌드의 프로덕션 릴리스 (자동화)
빌드 실패
- 많은 회사들이 빌드 실패시 빌드가 다시 성공할 때까지 코드 변경 금지 -> 모든 사람들을 잡아두게 됨
- 어느정도 조직이 커지면 빌드만 전담하는 엔지니어가 생김
- 빌드 실패시 가벼운 형태로 패널티를 부여하기도 함 :)
Jenkins
- 오픈소스 CI 빌드 소프트웨어
- CI와 관련한 모든 기능 지원
- 플러그인의 형태로 지원
- CI와 관련한 모든 기능 지원
- 빌드된 소프트웨어의 배포 (릴리스)를 위해서도 사용 가능
Github과 연동되는 CI 서비스
- Github Actions
- Travis CI
- Circle CI
- …
6. Git
- 분산 환경을 지원하는 소스 버전 컨트롤 시스템
- branch (원본의 copy본)를 만들어 거기에 작업을 함
- 분산 환경 : copy본이 내 local에 존재하여 local에서 작업 가능 -> 서버로 업로드 -> merge
- 서버에 연결이 되지 않아도 작업 가능
-
CVS, SVN은 항상 서버에 연결되어 있다는 전제 하에 사용 가능했음
- 다수의 개발자가 공동 개발
- 코드 리뷰 가능
- 코드 백업
-
과거의 코드로 롤백 가능
- 팀원들과 같이 코딩 가능, 코드 충돌이 생기면 해결 가능
- 코드 변경을 주기적으로 저장하면서 리뷰를 받을 수 있음
- 모든 코드 변경 기록됨
- 지금 코드의 스냅샷(버전)을 잡아 나중에 필요시 버전 간 이동 가능
-
꼭 코드 뿐만 아니라 모든 텍스트 파일에 사용 가능
- 기본 기능 : clone, init, add, commit, push, pull, merge, branch, checkout
- 고급 기능 : rebase, cherry-pick.reset, revert, git-flow
7. Git 관련 용어
- Repo
- Repository
- Git으로 관리되는 소프트웨어 프로젝트
- Master/Main
- 한 Repo에서 기본이 되는 메인 코드
- Source of Truth
- Branch
- 자신의 Repo에서 새로운 기능 개발 등을 위해 Master 혹은 다른 Branch로부터 만든 코드 작업본
- 작업 후 나중에 원본 Branch와 다시 병합하려는 목적으로 만들어짐
- Clone
- 다른 계정에 존재하는 Repo로부터 새로운 Local Repository를 만드는 것
- Commit (Check-in)
- 내가 만든 코드 변경을 Branch의 Local Repository에 반영하는 것
-
작업은 항상 내 컴퓨터에 있는 Local Repository에서 일어나며 Pull, Push를 통해 Git 서버 상의 Remote Repository와 연결됨
- Pull
- Master와 같은 Remote Repository로부터 마지막 Pull 이후 변경된 것을 다시 가져오는 작업
- Master (혹은 Branch)와 동기화하는 것
- 출근해서 가장 먼저 하는 일 : Git Pull !!
- Remote -> Local
- Push
- 본인이 작업 중인 로컬 복사본 (Local Repository)에서 서버 (Remote Repository)로 변경사항들을 복사하는 것
- Local -> Remote
- Merge
- Pull이나 Push 했을 경우 두 Branch (대부분 이 둘 중 하나는 Master) 간의 충돌(Conflict)을 해결하는 과정
- 많은 경우 이는 자동으로 해결되나, 몇몇 경우에는 직접 손으로 충돌을 해결해야 함
- 전체 플로우
- master/main -> Remote Branch 브랜치 생성
- Remote Branch -> Local Branch :
pull
- Local Working Copy -> Local Branch :
commit
- Local Branch -> Remote Branch :
push
- Remote Branch -> master/main :
merge
8. 시나리오
- Branch 생성
git checkout -b 브랜치이름
,git branch 브랜치이름
- 새로운 repo를 만드는 경우에는
git init
부터 사용
- 새로운 repo를 만드는 경우에는
- 새 Branch로 작업 공간 이동
git checkout 브랜치이름
- 해당 Branch에서 코드 변경 후 커밋
git commit -m "메세지" 파일이름
- 해당 Branch에서의 변경을 서버로 반영
git push -u origin 브랜치이름
- 해당 Branch와 Master의 Merge를 위한 리뷰 요청 (Pull Request)
- github.com에서 UI를 이용하여 요청 !
git request-pull
- 다른 개발자가 코드 리뷰 후, 직접 Merge 하든지 Merge 해도 좋다고 응답
- 문제가 있을 경우 그 내용을 답변으로 보냄 (Request changes / Comment)
Pull Request
- 보통 자신의 branch를 master에 merge하고 싶을 때 다른 이들에게 코드 리뷰를 요청하는 용도로 사용
- Pull Resquest에는 일련 번호가 붙으며, 쉽게 revert 가능
- 즉, 이전 상태로 돌아가는 것이 쉬움
9. Github
- Git repo 호스팅/클라우드 서비스
- 문서화를 위한 Wikis와 버그리포트와 트랙킹을 위한 Issues 제공
- 자신이 만든 repo들이 public일 경우 무료
- private repo 수에 따라 가격대가 결정됨