1. 학습 관점과 학습 목표

더보기

1) 학습 관점

  • 소프트웨어 개발이란, "컴퓨터의 동작 순서를 문서화 하는 과정"입니다.
  • 소프트웨어 기술들은 이러한 문서화 과정에서 발생한 문제들을 개선하며 발전해왔습니다.
  • Git 또한, "컴퓨터의 동작 순서 문서화 중 발생한 문제 해결 기술" 중 하나입니다.
  • 너무 어렵게 생각하지 않습니다. Git의 사용 목적만 이해한다면, Git 은 쉽습니다.
  •  

 

2. "문서 & 소스코드" 관리의 문제점

더보기

1. 문서 저장 방식과 그 한계

 

Git으로 해결해야 할 소프트웨어 개발 프로세스의 문제를 파악하기 전에,
우선 우리에게 익숙한 문서 작업에서 발생하는 문제를 살펴봅니다.

 

문서 내용 일부가 다른 경우 & 문서 파일 자체가 다른 경우

문서 작업을 할 때,

  • 내용 일부가 달라진 경우
  • 파일 자체가 달라진 경우

작업 중인 문서를 저장할 때마다 새로운 파일을 생성해 따로 보관합니다.
필요할 경우, 과거에 저장해둔 문서를 다시 불러와 이어서 작업할 수 있습니다.

하지만 이런 방식에는 몇 가지 불편함이 있습니다.

 

[문제]

  1. 저장할 때마다 문서 파일이 계속 쌓이기 때문에 파일 관리가 점점 어려워집니다.
  2. 과거 문서를 불러와 일부만 수정하더라도, 그 이후에 작성했던 모든 변경 사항을 다시 작성해야 하는 불편함이 있습니다.

 

 

2.문서 저장 방식의 한계와 소스코드의 본질

 

과거에는 소스코드를 문서와 동일한 방식으로 관리하던 시절이 있었습니다.
그렇다면 소스코드를 문서처럼 관리했을 때 어떤 문제가 발생하는지 살펴보겠습니다.

 

  • 소스코드란, 명령어 문장을 프로그래밍 언어의 문법에 맞게 작성한 문서입니다.
  • 즉, 소스코드를 작성하는 행위는 메모장에 한글이나 영어 문장을 입력하는 것과 본질적으로 동일합니다.
    • 직접 소스코드 파일(.py, .c, .cpp, .java)을 메모장으로 열어보면,
      소스코드가 단순한 텍스트 문서와 완전히 동일하다는 사실을 확인할 수 있습니다.
    • 따라서 소스코드를 단순 문서처럼 관리한다면,
      문서 관리에서 발생하는 문제와 동일한 문제가 그대로 발생합니다.


[문제]

  1. 저장할 때마다 소스코드 파일이 계속 쌓여 관리가 복잡해집니다.
  2. 과거 소스코드를 불러와 수정하면, 그 이후에 작성했던 모든 내용을 다시 작성해야 하는 불편함이 생깁니다.

 

3. Git, GitHub 핵심 기능과 학습 목표

더보기

1. <Git> 되돌리기 (Undo / Checkout / Reset)

  • 게임 예시:
    보스 전에 세이브 → 전투에서 패배 → 세이브 지점으로 다시 돌아가 재도전 가능
  • 개발 예시:
    코드를 고치다가 프로그램이 실행되지 않음 → Git에서 이전 커밋으로 되돌려 안정된 상태 복구 가능
  • 문서 저장과 달리 Git 은
    “보스전 전에 세이브 → 실패하면 다시 시도”처럼, 실패하기 전 상태로 언제든 되돌아갈 수 있음

 

 

2. <Git> 분기와 병합 (Branch & Merge)

  • 게임 예시
    • (공통) 친구들이 같은 체크포인트에서 각자 다른 선택지로 진행
    • (분기) 여러 명이 동시에 플레이
    • (병합) 장점만 조합 → 여러명의 최적 시점 조합하여, 세이브부터 이어서 플레이
  • 개발 예시:
    • (공통) 프로젝트 main 브랜치는 안정된 버전 유지
    • (분기) feature/login 브랜치를 따로 만들어 로그인, 회원가입, ID, PW 찾기 기능 각각개발
    • (병합) 기능이 완성되면 main에 병합
    • 서로 같은 부분을 동시에 수정했다면 → Git에서 충돌(Conflict) 발생 → 합의 후 해결

 

 

3. <GitHub> 협업

  • 게임 예시:
    • 조립
  • 개발 예시:
    • 개발자1: "ABC" 코드에서 "D" 추가
    • 개발자2: "ABC" 코드에서 "1" 추가
    • 개발자3: "ABC" 코드에서 "2" 추가
    • Git의 병합 기능을 사용하면 최종 결과물은 "ABC12D" 로 안전하게 합쳐짐

문서처럼 단순히 덮어쓰기 하는 방식이 아니라, 각자의 작업 내역을 안전하게 병합(Merge)


 

소프트웨어 개발

더보기

4.1 소프트웨어 개발은 한 번에 가능한가?

소프트웨어 개발 프로세스

 

일반적인 회의록, 기획서, 회의 개요 문서조차도 한 번에 완성되는 경우는 거의 없습니다.
여러 차례 수정과 보완을 거쳐야 최종 문서가 완성됩니다.

 

소프트웨어 개발도 마찬가지입니다.
단순히 한두 번의 분석·설계·구현만으로 프로그램이 완성되는 일은 없습니다.


프로젝트가 완료된 이후에도 지속적인 고도화 작업이 필요하고,
사용자의 새로운 요구사항이 발생할 때마다 프로그램을 계속 수정해야 합니다.

 

 

4.2 저장 문제

 

미니 프로젝트 예시 - 전제, 일정표파일 관리

수십 단계를 저장하여 관리해야 한다면, 과연 관리가 가능할까?

 

소스코드를 단순히 문서처럼 백업 파일로만 관리한다면, 개발자는 매 버전마다 프로그램을 직접 압축해 저장해야 합니다.
그리고 문제가 생기면 해당 시점을 찾아 일일이 수정해야 하죠.

 

이 방식은 모든 버전을 개발자가 수동으로 관리해야 하므로 매우 비효율적입니다.
또한 프로젝트가 진행될수록 백업 파일의 용량은 계속 늘어나고 관리도 복잡해집니다.

 

 

4.3 수정 문제

그리고 과거 특정 시점의 문제만 수정하여야 한다면, 모든 버전의 수정사항을 전부 확인해야 할 수도 있습니다.

기존 프로젝트에서 새로운 기능을 테스트하고 싶다면, 새로운 복사본을 만들어 새로운 백업 파일로 관리해야 합니다.

 

 

4.4 협업과 통합 문제

통합 문제

 

문서처럼 덮어쓰거나 단순 백업만 하는 방식이라면,
누가 어떤 부분을 수정했는지 관리하기 어렵고,
여러 작업 내용을 정상적으로 병합(Merge) 하는 것도 힘들어집니다.

 

예시 상황

  • 개발자1 : main에서 "ABC" 작업 후 → dev1에 반영, "ABC" 예상
  • 개발자2 : main에 +"1" 추가 작업 → dev1 업데이트, "ABC1" 예상
  • 개발자3 : main에 +"2" 추가 작업 → dev1 업데이트, "ABC2" 예상
  • 개발자1 : main에 +"D" 추가 작업 → dev1 반영, "ABCD" 예상

 

협엽 결과:  "ABC12D"

  • 개발자2와 개발자3의 작업(+1, +2)이 덮어씌워지거나 누락될 수 있고,
  • 최종적으로는 "ABCD" 나 "ABC1", "ABC2" 중 일부만 반영되는 문제가 생깁니다

 

형상관리 시스템

더보기

5.1 문서 관리의 한계점과 해결책

 

프로그램의 규모가 크지 않았고, 소수의 숙련된 개발자만 참여했기 때문에 협업 과정에서 큰 문제가 드러나지 않았습니다.

 

그러나 소프트웨어가 점점 대형화되고 다양한 수준의 개발자가 함께 참여하게 되면서, 소스코드 관리의 어려움은 심각해졌습니다.


누가 무엇을 수정했는지 알기 어렵고, 동시에 수정하면 서로의 작업이 덮어써지며, 문제가 생겼을 때 과거 버전으로 되돌리기도 힘들어졌습니다.

 

이러한 문제를 해결하기 위해 형상관리시스템(VCS, Version Control System)이 등장했습니다.
그중 Git은 분산형 버전 관리 시스템(DVCS)의 대표적인 예로, 개발자들이 각자 독립적으로 작업한 뒤 안전하게 합쳐 최종 결과를 만들 수 있도록 도와줍니다.

 

따라서 Git을 배울 때는 ‘형상관리시스템’이라는 어려운 용어에 집중하기보다, 과거에 소스코드를 문서처럼 관리했을 때 어떤 문제가 생겼는지 이해하고, Git이 그 문제를 어떻게 해결하는지를 살펴보는 것이 가장 효과적인 학습 방법입니다.

 

참고) 47. GIT | 만화로 나누는 자유/오픈소스 소프트웨어 이야기 (joone.net)

 

47. GIT

리누스 토발즈는 리눅스 커널 개발을 시작하고 거의 10년 동안 CVS나 서브버전(SVN)과 같은 소스 관리 소프트웨어를 사용하지 않았다. 여러가지 불편함에도 불구하고 수많은 컨트리뷰터가 오픈소

joone.net

 

 

5.2 버전

Git 은, VCS(Version Control System, 버전 관리 시스템)의 한 종류입니다.

버전은 프로그램의 일부 내용이 변경되거나 새로운 기능이 추가되는 등 어떤 유의미한 변화가 결과물로 나오는 것을 말합니다.

 

버전이라는 단어가 낯설겠지만, 사실 우리는 컴퓨터를 사용하면서 이미 버전 관리를 해본 경험이 있습니다.

 

  • 문서를 작성할 때를 떠올려 보세요. 문서 작업하는 도중에 다른 일을 처리하기 위해 문서를 저장하고 다른 작업을 할 수 있습니다. 그리고 다시 저장된 문서를 불러와서 작업을 진행 할 수 있습니다.
  • 게임도 마찬가지입니다. 게임이 진행된 상태를 저장하고, 저장된 게임을 불러와 이어서 진행 할 수 있습니다.
  • 그림판이나 포토샵으로 이미지를 작업할 때 ctrl+z 단축키를 누르면 한 단계씩 뒤로 갈 수 있게 해 주는 것도 하나의 버전 관리 입니다.

 

Git 은, 소프트웨어 개발에서 프로젝트 단위의 소스코드를 <저장>하고, <이름>으로 식별하고, <불러오기> 하는 편리한 기술일 뿐입니다.

 

ctrl+z 단축키를 눌러 한 단계씩 되돌리는 것처럼, 내가 원하는 시점마다 소스코드를 저장하고 되돌리는 것을 가능하게 해주는 소스 코드 버전 관리 시스템이 git 입니다.


 

GitHub

더보기

Git 으로 관리하는 프로젝트를, 클라우드로 공유한다면

팀 단위로 여러명과 동시에 프로젝트를 진행 할 수 있습니다.

 

Git 으로 관리하는 프로젝트를 드롭박스, 구글 드라이브처럼 클라우딩 서비스 하는 Git 호스팅 사이트 중 하나가 GitHub 입니다.