---
# System prepended metadata

title: Day01 - 학습정리
tags: [2020 Boostcamp]

---

###### tags: `2020 Boostcamp`
# Day01 - 학습정리



## 스스로 확인할 사항

- **코딩 테스트와 다르게 개선된 부분이 있는가 설명해본다.**
  1. keyboard 배열에서 해당 문자 찾을 때 완전 탐색 -> Dictionary로 초기화 후 사전 탐색
     * keyboard가 얼마나 크게 들어올 지는 모르지만 탐색시간을 O(n^2)에서 O(logN) 으로 줄임
  2. 함수 분할
     * 더 작은 단위로 함수를 쪼개어 가독성을 높힘
  3. 변수명에 주의
     * 한번에 알아들을 수 있는 변수명을 고심하고 사용함
  4. 주석 추가
     * 세세한 주석을 추가하여 다른 사람이 내 코드를 봤을 때 충분히 이해가 가도록 작성함
- **함수를 여러 개로 분리해서 만들면서 어떤 기준으로 함수를 분리했는가 설명한다.**
  - 같은 논리 흐름을 가지는 최소 단위로 분리함
  - 같은 로직이지만 방향성이 다르다면 분리함
- **git의 branch에 대해서 이해를 하고 있는가 본인이 이해한 데로 설명해본다.**
  - 어떤 일을 독립적으로 작업하기 위한 개념으로 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에 여러 작업을 여러사람이 같이 할 수 있다는 것이 핵심이다. *Divide and Conquer* 의 진가를 보여주는 기능이 아닌가 싶은데, 작은 단위로 부터 그 크기를 키워나가며 큰 작업을 할 수 있고, 문제가 발생했을 때 원인을 찾기 쉽다는 장점이 있다.



## 다같이 확인할 사항

- **원본 저장소를 fork해서, PR을 보낼 때까지 흐름에 대해서 각자 이해한 내용과 차이점이 있는지 비교한다.**

  1. 원본 저장소에서 내 저장소로 fork
     * 다른 사람의 저장소에서 내가 어떤 부분을 수정하거나 추가 기능을 넣고 싶을 때
     * 원본의 내용이 변하면 fetch나 rebase의 과정을 거쳐 내 저장소에 반영이 가능하다
  2. 작업 후 PR
     * pull request를 보내기 전까지는 내 저장소에만 변경 사항이 반영되어 있다
     * pr을 보내면 원본 저장소의 관리자가 적절성을 따져 승인 여부를 결정하게 된다
     * 승인이 되면 나의 작업물이 원본 저장소에 commit, merge 되어 반영된다

- **git add와 commit을 할때 git 내부에서는 어떤 동작이 일어나는 것인지 자료를 찾아서 학습하고 이를 비교해서 정리한다.**

  * Object

    Git을 구성하는 데이터파일. Working directory의 파일 정보를 object형식으로 변환하여 Object database에 저장

    각각의 Object 파일은 Zlib을 이용하여 압축되며, 파일의 내용과 헤더를 40자의 SHA-1 헤시값으로 저장한다

  * Index

    object 파일 링크의 list를 가지고 있다

  * git add

    object 파일이 생성되고, blob, object 링크, 파일이름 을 담고 있는 index 파일이 변경된다

  * git commit

    git에 변경된 파일이 있음을 명시하는 동작이다. 따라서 commit을 하면, 그 전까지 add한 파일들이 해당 commit에 기록된다

    먼저 index 파일을 변경하고, 변경된 파일 정보들을 가지고 있는 object를 생성한다. 그 후 commit의 전체 정보가 담긴 파일을 생성하고 마지막으로 commit을 가르키는 HEAD등 그와 관련된 파일들이 변경된다

- **여러 명이 협업을 하며 프로젝트를 개발할때는 다양한 branch전략을 세워서 한다.**
  **실무에서 사용하는 워크플로우 (예 - gitflow, git workflow, gitlab workflow 등)에 대해서 찾아보고, 왜 그런 전략이 필요한지 고민한 후 비교한다.**

  - gitflow - master와 develop 브랜치를 항상 유지하고 보조 브랜치를 일정기간 유지한다.
    - master : 제품으로 출시될 수 있는 브랜치
    - develop : 다음 출시 버전을 개발하는 브랜치
    - feature : 기능을 개발하는 브랜치
    - release : 이번 출시 버전을 준비하는 브랜치
    - hotfix : 출시 버전에서 발생한 버그를 수정 하는 브랜치
  - github flow - master 브랜치에 대한 role만 정확하다면 나머지 브랜치들에는 관여하지 않는다. PR 권장
    - 릴리즈 라는 개념이 없다
    - 브랜치 전략 단순
    - CI가 필수적이며, 배포는 자동으로 진행할 수 있다
  - gitlab flow - github flow의 진화버전, production 브랜치가 존재하여 커밋한 내용들을 일방적으로 디플로이 하는 형태
    - master와 production 사이에 pre-production을 두어 개발 내용을 시간을 두고 반영한다.
    - PR하여 merge 한다

  코드 품질 향상, 코드 가독성 향상이 주 목적이라 생각된다. 또한 버그가 발생하였을 때 해당 버전의 코드로 디버깅해서 원인을 찾고 상황 재현, 수정, 검증, 재배포의 단계를 체계적이고 안정적으로 처리할 수 있어야 한다. 그러기 위해 branch 전략을 세우는 것은 필수적이다. 