1. VCS(Version Control System)
- 소프트웨어 개발에서 소스 코드, 문서, 설정 파일 등의 변경 이력을 관리하는 시스템입니다.
- VCS는 파일의 변경 내용을 추적하고, 다양한 버전의 파일을 저장하며, 여러 개발자 간의 협업을 가능하게 합니다.
- 소프트웨어 개발, 문서 관리, 설정 파일 관리에 주로 이용된다.
- 주요 기능
- 분경 이력 관리
- 분산 및 협업
- 백업 및 복구
- 분기 및 병합
- 태그 : 특정 시점의 버전을 태그로 관리하여 쉽게 찾기 가능
- VCS의 종류
- 로컬 버전 관리 시스템
- 로컬 DB에서 관리
- 협업이 어렵고, 장애 시 데이터 손실의 위험이 있음
- 예시 : RCS
- 중앙 집중식 버전 관리 시스템
- 특징: 중앙 서버에 모든 버전 정보를 저장하고, 클라이언트가 서버에 접속하여 작업을 수행합니다.
- 장점: 협업이 용이하며, 중앙에서 모든 버전 관리가 이루어집니다.
- 단점: 서버 장애 시 전체 시스템에 영향을 미칩니다.
- 예시: CVS, Subversion (SVN)
- 분산 버전 관리 시스템
- 특징: 각 개발자가 전체 저장소의 복사본을 로컬에 가지고 있으며, 로컬에서 작업하고, 필요 시 다른 저장소와 동기화합니다.
- 장점: 서버에 의존하지 않고, 로컬에서 작업이 가능하며, 협업 및 백업이 용이합니다.
- 단점: 복잡한 설정이 필요할 수 있습니다.
- 예시: Git, Mercurial, Bazaar
- 로컬 버전 관리 시스템
- VCS의 주요 툴
- GIT
- 특징: 분산 버전 관리 시스템으로, 성능이 뛰어나고, 비공식적인 프로젝트에서도 널리 사용됩니다.
- 장점: 빠른 속도, 브랜칭 및 병합 기능, 분산형 작업 환경.
- 도구: GitHub, GitLab, Bitbucket 등
- SVN(subversion)
- 특징: 중앙 집중식 버전 관리 시스템으로, 기존 CVS의 단점을 보완한 시스템입니다.
- 장점: 간단한 사용법, 강력한 커밋 기능, 디렉터리의 버전 관리.
- 도구: Apache Subversion
- Mercurial
- 특징: 분산 버전 관리 시스템으로, Git과 유사하지만, 사용이 더 간단합니다.
- 장점: 쉬운 사용법, 빠른 처리 속도, 대규모 프로젝트에 적합.
- 도구: Bitbucket (과거에는 Mercurial을 지원했으나 현재는 Git으로 전환)
- GIT
2. Git Object
- Git은 소스 코드 버전 관리를 위해 여러 유형의 객체를 사용한다.
- 주로 네 가지로 구성되며, 각 객체는 고유의 SHA-1 해시를 통해 식별 된다.
- 객체 유형
- Blob(Binary Large Object)
- 역할: 파일의 내용을 저장하는 객체입니다.
- 특징: 파일의 메타데이터는 포함되지 않으며, 파일의 실제 내용만 저장됩니다. 파일이 변경될 때마다 새로운 Blob 객체가 생성됩니다.
- 사용 예시: 소스 코드 파일, 텍스트 파일 등.
- Tree
- 역할: 디렉토리 구조를 표현하는 객체입니다. 트리 객체는 Blob 객체와 다른 트리 객체를 포함할 수 있습니다.
- 특징: 파일의 이름, 권한, 그리고 Blob 객체의 해시를 저장하여 디렉토리 구조를 재현합니다.
- 사용 예시: 프로젝트의 디렉토리 및 파일 구조.
- Commit
- 역할: 특정 시점의 스냅샷을 저장하는 객체입니다. Commit 객체는 트리 객체를 가리키고, 부모 커밋, 작성자 정보, 커밋 메시지를 포함합니다.
- 특징: 프로젝트의 상태를 저장하고, 변경 이력을 관리합니다. 각 커밋은 이전 커밋을 참조하여 연속적인 이력을 구성합니다.
- 사용 예시: 코드 변경의 기록, 버전 관리.
- Tag
- 역할: 특정 커밋을 가리키는 참조 객체입니다. 주로 릴리즈 버전 등 중요한 지점을 표시할 때 사용됩니다.
- 특징: 가벼운 태그와 주석이 포함된 태그가 있습니다. 주석이 포함된 태그는 작성자 정보, 태그 메시지 등을 추가로 저장합니다.
- 사용 예시: 릴리즈 버전 태그, 중요 지점 표시.
- Blob(Binary Large Object)
3. Git 명령어
- Git 기본 명령어
- git init
- 설명: 새로운 Git 저장소를 초기화합니다.
- 사용 예시: git init
- git clone
- 설명: 원격 저장소를 복제하여 로컬 저장소를 생성합니다.
- 사용 예시: git clone <repository_url>
- git status
- 설명: 현재 작업 디렉토리의 상태를 확인합니다.
- 사용 예시: git status
- git add
- 설명: 파일을 인덱스에 추가합니다.
- 사용 예시: git add <file>
- git commit
- 설명: 인덱스에 추가된 변경 사항을 커밋합니다.
- 사용 예시: git commit -m "Commit message"
- git log
- 설명: 커밋 히스토리를 확인합니다.
- 사용 예시: git log
- git diff
- 설명: 변경된 내용을 확인합니다.
- 사용 예시: git diff
- git branch
- 설명: 브랜치를 관리합니다.
- 사용 예시: git branch (브랜치 목록 보기), git branch <branch_name> (새 브랜치 생성)
- git checkout
- 설명: 브랜치를 전환하거나 파일을 체크아웃합니다.
- 사용 예시: git checkout <branch_name>
- git merge
- 설명: 다른 브랜치의 변경 사항을 현재 브랜치에 병합합니다.
- 사용 예시: git merge <branch_name>
- git init
- 원격 저장소 명령어
- git remote
- 설명: 원격 저장소를 관리합니다.
- 사용 예시: git remote -v (원격 저장소 보기), git remote add <name> <url> (원격 저장소 추가)
- git fetch
- 설명: 원격 저장소의 변경 사항을 가져옵니다.
- 사용 예시: git fetch
- git pull
- 설명: 원격 저장소의 변경 사항을 가져와서 병합합니다.
- 사용 예시: git pull
- git push
- 설명: 로컬 커밋을 원격 저장소에 푸시합니다.
- 사용 예시: git push <remote> <branch>
- git remote
- 고급 명령어
- git stash
- 설명: 작업 중인 변경 사항을 임시로 저장합니다.
- 사용 예시: git stash
- git rebase
- 설명: 하나의 브랜치에서 다른 브랜치의 커밋을 재적용합니다.
- 사용 예시: git rebase <branch>
- git reset
- 설명: 커밋을 초기화하거나 특정 상태로 되돌립니다.
- 사용 예시: git reset --hard <commit> (커밋 초기화)
- git revert
- 설명: 이전 커밋을 취소하는 새 커밋을 생성합니다.
- 사용 예시: git revert <commit>
- git tag
- 설명: 특정 커밋에 태그를 추가합니다.
- 사용 예시: git tag <tag_name>
- git cherry-pick
- 설명: 특정 커밋을 다른 브랜치에 적용합니다.
- 사용 예시: git cherry-pick <commit>
- git bisect
- 설명: 바이섹트 알고리즘을 사용하여 버그를 추적합니다.
- 사용 예시: git bisect start, git bisect good <commit>, git bisect bad <commit>
- git stash
- 기타 유용한 명령어
- git config
- 설명: Git의 설정을 관리합니다.
- 사용 예시: git config --global user.name "Your Name", git config --global user.email "you@example.com"
- git show
- 설명: 특정 커밋의 변경 내용을 보여줍니다.
- 사용 예시: git show <commit>
- git rm
- 설명: 파일을 Git의 관리에서 제거합니다.
- 사용 예시: git rm <file>
- git mv
- 설명: 파일을 이동하거나 이름을 변경합니다.
- 사용 예시: git mv <old_name> <new_name>
- git clean
- 설명: 작업 디렉토리에서 추적되지 않는 파일을 제거합니다.
- 사용 예시: git clean -f
- git config
4. GitHub와 Gist
- 소프트웨어 개발 프로젝트를 호스팅하고 버전 관리할 수 있는 웹 기반 플랫폼입니다.
- Gist는 GitHub의 한 서비스로, 간단하게 스니펫 코드, 메모, 단일 파일 등을 저장하고 공유할 수 있는 플랫폼
- gist는 말 그대로 좀더 간편한데 예를 들어 복잡한 디렉토리구조는 gist에 push 할 수 없다.
- 차이점
- 목적:
- GitHub는 주로 전체 프로젝트와 협업을 위한 플랫폼입니다.
- Gist는 작은 코드 스니펫이나 단일 파일을 공유하고 저장하는 데 중점을 둡니다.
- 기능:
- GitHub는 이슈 트래킹, 위키, 프로젝트 관리 등의 종합적인 협업 도구를 제공합니다.
- Gist는 간단한 코드 저장과 공유 기능에 중점을 둡니다.
- 규모:
- GitHub는 대규모 프로젝트와 팀 협업을 지원합니다.
- Gist는 소규모 코드 스니펫과 메모를 공유하는 데 적합합니다.
- 목적:
5. 로컬 Repository 와 원격 Repository
- 로컬 레포지토리
- 사용자의 컴퓨터에 저장된 Git 리포지토리입니다. 로컬 리포지토리는 프로젝트의 모든 파일, 변경 이력, 브랜치 등을 포함합니다.
- 개발자가 코드를 작성하고 수정할 때, 모든 작업은 먼저 로컬 리포지토리에서 이루어집니다.
- 원격 레포지토리
- 네트워크를 통해 접근할 수 있는 Git 리포지토리입니다.
- GitHub, GitLab, Bitbucket 등과 같은 호스팅 서비스에 저장됩니다.
- 원격 리포지토리는 팀 협업을 위해 사용되며, 모든 팀원이 변경 사항을 공유하고 동기화할 수 있습니다.
- 로컬 레포지토리에서 작업을 한 것을 원격 레포지토리에 반영하거나
- 원격 레포지토리에 적용된 사항을 로컬 레포지토리에 가져올 수 있다.
6. 파일 시스템과 디렉토리
- 컴퓨터의 운영 체제에서 데이터를 저장하고 조직하는 방법입니다.
- 파일 시스템은 파일과 디렉토리를 관리하여 데이터가 저장 장치에 효율적으로 저장되고, 쉽게 검색 및 액세스될 수 있도록 합니다.
- 주요 기능
- 파일 관리: 파일을 생성, 삭제, 읽기, 쓰기 등의 작업을 수행할 수 있습니다.
- 디렉토리 관리: 디렉토리를 생성, 삭제, 탐색할 수 있습니다.
- 저장 공간 관리: 저장 장치의 공간을 효율적으로 사용하도록 합니다.
- 보안 및 접근 제어: 파일과 디렉토리에 대한 접근 권한을 설정하고 관리할 수 있습니다.
- 주요 파일 시스템 종류:
- FAT (File Allocation Table): 오래된 파일 시스템으로 DOS와 초기 윈도우 시스템에서 사용되었습니다.
- NTFS (New Technology File System): Windows NT와 그 이후 버전에서 사용되는 파일 시스템으로, 보안, 압축, 암호화 기능을 제공합니다.
- EXT (Extended File System): 리눅스에서 사용되는 파일 시스템으로, ext2, ext3, ext4 등 다양한 버전이 있습니다.
- HFS+ (Hierarchical File System Plus): macOS에서 사용되는 파일 시스템입니다.
- APFS (Apple File System): 최신 macOS 및 iOS 장치에서 사용되는 파일 시스템입니다.
- 디렉토리란
- 파일 시스템에서 파일을 조직화하는 방법 중 하나로, 파일을 포함할 수 있는 컨테이너입니다.
- 디렉토리는 파일뿐만 아니라 다른 하위 디렉토리를 포함할 수도 있습니다.
- 이를 통해 계층적 구조를 형성하여 파일을 체계적으로 관리할 수 있습니다.
- 주요 기능:
- 조직화: 파일을 논리적으로 그룹화하여 쉽게 관리할 수 있습니다.
- 경로 (Path): 파일과 디렉토리의 위치를 지정하는 데 사용됩니다. 절대 경로와 상대 경로로 나눌 수 있습니다.
- 절대 경로: 루트 디렉토리부터 시작하는 전체 경로입니다. 예: /home/user/docs/file.txt
- 상대 경로: 현재 작업 디렉토리로부터의 경로입니다. 예: ../docs/file.txt
- 탐색: 디렉토리 구조를 통해 파일을 탐색하고 찾을 수 있습니다.
- 계층 구조: 루트 디렉토리에서 시작하여 여러 하위 디렉토리로 나뉘는 트리 구조를 형성합니다.
7. 암호화 방식 SHA
- 데이터를 해시값으로 변환하는 암호화 해시 함수 패밀리입니다.
- 해시 함수는 임의 크기의 입력 데이터를 고정된 크기의 해시값(디지털 지문)으로 변환합니다.
- SHA 알고리즘은 주로 데이터 무결성 검증, 디지털 서명, 암호화 시스템에서 사용됩니다.
- 주요 SHA 알고리즘
- SHA-1:
- 출력 크기: 160비트 (20바이트)
- 상세 정보: SHA-1은 초기의 SHA 알고리즘으로, 널리 사용되었지만 충돌 저항성에 문제가 발견되어 현재는 안전하지 않다고 간주됩니다. 주요 보안 애플리케이션에서는 더 이상 사용되지 않습니다.
- SHA-2:
- 출력 크기: SHA-2는 여러 버전으로 나뉘며, 각각 다른 출력 크기를 가집니다.
- SHA-224: 224비트 (28바이트)
- SHA-256: 256비트 (32바이트)
- SHA-384: 384비트 (48바이트)
- SHA-512: 512비트 (64바이트)
- 상세 정보: SHA-2는 SHA-1의 문제를 해결하기 위해 개발되었으며, 다양한 출력 크기를 제공하여 다양한 보안 요구 사항을 충족합니다. 현재 많은 보안 애플리케이션에서 널리 사용됩니다.
- 출력 크기: SHA-2는 여러 버전으로 나뉘며, 각각 다른 출력 크기를 가집니다.
- SHA-3:
- 출력 크기: SHA-3도 여러 버전으로 나뉩니다.
- SHA3-224: 224비트 (28바이트)
- SHA3-256: 256비트 (32바이트)
- SHA3-384: 384비트 (48바이트)
- SHA3-512: 512비트 (64바이트)
- 상세 정보: SHA-3는 Keccak 해시 함수에 기반하며, SHA-2와는 구조적으로 다릅니다. SHA-3는 SHA-2와 함께 사용하거나 대체할 수 있으며, 추가적인 보안성을 제공합니다.
- 출력 크기: SHA-3도 여러 버전으로 나뉩니다.
- SHA-1:
- SHA 알고리즘의 특징
- 고정된 출력 크기: SHA 알고리즘은 입력 데이터의 크기와 상관없이 고정된 크기의 해시값을 생성합니다.
- 단방향 함수: 해시값으로부터 원래 데이터를 복원하는 것은 불가능합니다.
- 충돌 저항성: 서로 다른 두 입력 데이터가 동일한 해시값을 생성하는 확률이 매우 낮습니다.
- 무결성 검증: 데이터가 변조되지 않았음을 확인할 수 있습니다. 데이터와 함께 해시값을 전송하면, 수신자는 해시값을 계산하여 데이터의 무결성을 확인할 수 있습니다.
- SHA 알고리즘의 활용
- 데이터 무결성 검증: 파일 전송, 데이터 저장 시 데이터의 무결성을 확인하기 위해 사용됩니다.
- 디지털 서명: 디지털 서명 생성과 검증 과정에서 SHA 알고리즘이 사용됩니다.
- 암호화 시스템: 패스워드 해시, 암호화 키 생성 등 다양한 암호화 시스템에서 SHA 알고리즘이 활용됩니다.
8. 얕은 복사와 깊은 복사
- 얕은 복사
- 객체의 최상위 수준만 복사
- 중첩된 객체나 배열은 원본 객체의 참조를 공유한다.
- 메모리 사용이 적고, 복사 속도가 빠름
- 중첩된 객체를 수정하면 원본 객체도 영향을 받음
- 깊은 복사
- 객체의 모든 수준을 재귀적으로 복사
- 객체나 배열도 복사본을 만든다.
- 메모리 사용이 많고 복사가 느림
- 중첩된 객체를 수정해도 원본 객체는 영향을 받지 않음