[N311] TIL 및 회고

Sea Panda·2022년 12월 9일
0

부트캠프 TIL

목록 보기
25/46

0. 학습목표

  • 터미널 등 CLI(Command-line interface,명령 줄 인터페이스)를 접근하고 활용하여 아래의 작업들을 수행할 수 있다.

    • 간단한 터미널 명령어를 이해하고 활용할 수 있다.
    • 파이썬 가상환경을 만들고 사용할 수 있다.
    • Git을 사용해 프로젝트 관리를 할 수 있다.
  • 파이썬 가상환경이 왜 필요한지 설명할 수 있다.

  • Git에 대한 설명을 할 수 있다.

  • Github과 같은 사이트를 통해 Git repo 관리를 할 수 있다.

  • local 작업환경과 원격 작업환경에 대해 이해하고 Git을 활용하여 작업할 수 있다.

1. 주요개념

1. CLI (Command-line interface)

CLI 또는 명령어 인터페이스는 text terminal을 통해서 사용자와 컴퓨터가 상호 작용하는 방식을 뜻한다.

거의 모든 운영체제에서 GUL(Graphic User Interface)를 지원하면서, 흔히 말하는 윈도우 창을 보면서 대부분의 컴퓨터 작업을 진행한다. 하지만 여전히 개발자, 엔지니어, 유닉스 계열 사용자 등은 CLI를 많이 사용하게 된다.

CLI는 크게 입력출력으로 구성되어 있다고 할 수 있는 상호작용 방식이다. 그리고 이런 상호작용을 가능하게 해주는 Software나 Hardware를 Termianl이라고 한다. 또한 사용자가 입력한 명령어를 해석해 주는 Software를 Shell이라고 한다.

정리하자면 CLI방식으로 상호작용하는 Software가 터미널이고, 이 터미널은 Shell을 실행하고 명령을 입력할 수 있게 해주는 포장 프로그램이다. 따라서 Terminal"입력"의 형식으로 명령어가 입력되면 Shell이 이를 해석하여 결과를 도출하면 다시 Terminal을 통하여 "출력"된다.

2. 가상환경

파이썬을 사용하면서 pip install이라는 명령어는 한 번쯤 써봤을 것이다. 이를 통해 설치된 패키지들은 기본적으로 파이썬 설치 폴더의 Lib/site-packages안에 저장된다.(Local 환경에서)그래서 pip으로 설치한 패키지는 모든 파이썬 스크립트에서 사용할 수 있게 된다. 평소에는 이런 방식이 문제가 없지만 프로젝트를 여러 개개발할 때 버전의 문제가 발생한다.

위와 같은 상황을 상상해보자, 파이썬 어플리케이션1과 어플리케이션2는 파이썬이라는 동일한 프로그래밍 언어를 사용하지만 그 안에 사용하는 패키지들의 버전이 다르다. 만일 이를 하나의 동일한 환경에서 두 어플리케이션을 실행한다면 하나는 반드시 문제를 일으킬 것이다.

그 어떤 라이브러리, 패키지도 두 가지의 버전을 하나의 환경에서 동시에 사용할 수 없다. 이렇게 두 어플리케이션에서 호환되는 패키지들의 버전이 달라 어플리케이션들이 정상적으로 작동하지 않을 때 충돌(Conflict)이 일어났다고 한다. 더 나아가서는 사용할 패키지를 개발한 패키지 간에서도 발생한다. 이를 의존성 충돌이라고 한다.

이러한 충돌의 문제를 독립적인 환경을 구성하므로 해결할 수 있다. 두 개의 어플리케이션을 독립적인 환경에서 개발한다면 패키지들 간의 충돌을 미연에 방지할 수 있다. 사막여우는 따듯한 사육장에서 북극여우는 추운 사육장에서 키우는 것과 비슷하다. 서로에게 맞는 환경을 독립적으로 구성하여 주는 것이다.

바로 이 독립적인 환경!!을 만들어주는 기능이 가상 환경이고, 가상환경을 사용하는 이유 그 자체가 된다.

Section에서는 가상환경 생성을 위해서 Conda를 사용한다. 하지만 이것이 유일한 방법은 아니고, pipenv,virtualenv 등 파이썬에서 가상환경을 만들어주는 것들은 다양하다.

💡 참고 레퍼런스
1. pipenv
2. virtualenv

3. Git과 Github

Git은 VCS(Version-Control-System,버전 관리 시스템)이다. 그 중에서도 DVCS라는 Distributed Version Control System이라는 분산형 버전 관리 시스템에 속한다.(CVCS라는 중앙 집중식 버전 관리시스템도 존재한다.)

DVCS는 원격 저장소(서버,e.g Github)와 클라이언트들의 각 로컬 컴퓨터에 분산되어 저장된다.

우선, 클라이언트들의 로컬 컴퓨터에서 파일들을 1차적으로 저장하고, Github와 같은 원격 저장소에도 저장할 수 있다. 그림처럼 모든 파일들이 분산되어 저장되기 때문에 파일들이 삭제되는 일이 발생하더라도 다른 쪽에서 가져올 수 있기 때문에 쉽게 복구가 가능하다. 그리고 각각의 클라이언트들마다 전체 파일들을 가지고 있기 때문에 다양한 방법으로 협업을 시도할 수 있다.

분산형 버전 관리 시스템은 서버가 죽거나 오프라인 상태에서도 버전 관리를 할 수 있고, 대부분의 버전 관리가 로컬에서 이루어지므로 속도도 빠르다. 그리고 수정과정에 실수를 하여도 원격 저장소에 업로드 하기 전이라면 다른 클라이언트들에게 영향을 주지 않는다. 심지어 Git은 버전을 돌릴 수 있는 기능이 존재하기 때문에 원격 저장소에 실수로 업로드하여도 복구가 가능하다.

하지만, 사용하기 조금 복잡하고 동기화 관련하여 이슈가 있다는 단점이 존재한다.

간단하게 정리하면 Git은 각 Local에서 실행되고 이를 저장하는 DVCS의 한 부분이고, Github는 DVCS에서 원격 저장소 역할을 수행하는 것이다.

2. Git을 활용한 Push

명령어가 생각나지 않으면 아래의 명령어Chapter를 활용하자.

이번 N311에서 가장 힘들었던 점이 바로 Git을 활용하여 Branch를 활용하고 Push를 하는 부분이었다. 처음하는 일이다보니까 헷갈리기도 하고, 이게 맞는지 뭔지 Repo만 한 4번은 지웠다가 다시 받아서 과제를 한 것 같다.

다음 번에 보다 편하게 Git을 활용한 Push를 수행하기 위해서 간단한 흐름도를 작성하고 각 과정에서 사용되는 명령어를 정리하였다.

Step 1) Github repository 불러오기

# 온라인에서 로컬로 불러오기
git clone https://github.com/{유저 이름}/{레포 이름}

# 로컬에서 작업 중인 git과 온라인 레포지토리 주소를 추가
git remote add {리모트 명: 사용자 지정} https://github.com/{유저 이름}/{레포 이름}

사용할 Github의 respository를 불러온다. 위의 사진처럼 나타난 주소를 복사하여 터미널에 붙여 넣으면 된다.

git-test라는 git_test파일이 생성된 것을 확인할 수 있다.

Step 2) 원하는 작업 실행

말 그대로 원하는 작업을 수행하면 된다. .py파일을 만들어서 디렉토리에 추가한다거나, 기존 repo의 code를 수정하는 등 변경을 수행하면 된다.

원하는 작업을 모두 수행하고 git status라는 실행어를 입력하게 되면 다음과 같이 출력된다.

Step 3) Staging area에 변경 내용 추가하기

Step 2)에서 원하는 만큼 작업을 수행했다면 이를 Staging area에 기록하여 Commit을 기록하기 전까지 모아두어야 한다. 이를 수행하는 명령어가 바로 git add {파일명}이다. 만일 전체 변경 사항을 저장하고 싶다면 git add ./를 사용한다.

명령어를 실행하게 되면 다음과 같이 출력된다. 위의 step 2)와 차이점을 중점적으로 보아야 한다.

Step 4) commit 작성하기

git add는 말 그래도 stagin area에 모아두는 역할만을 수행한다. 따라서 아무리 명령어를 많이 실행해도 Git의 local repository에 어떠한 영향도 끼치지 못한다.

모아둔 변경사항을 local repository에 저장하기 위해서는 git commit명령어를 실행해주어야 한다.

git commit -m "commit message를 입력하세요"

Step 5) Git에서 Github로 Push

이제 변경된 Local repository내용을 git push명령어를 이용하여 원격 repository(github)로 Push해준다.

git push {리모트 명} {branch 명}
# 리모트 명:clone으로 불러올시 기본은 origin

위의 사진 같이 그냥 git push를 하면 기본 origin의 main branch에 Push되는 것 같다. 이건 어디까지나 뇌피셜이니까 나중에 직접 실험해보자..(다시 보겠지?)

Exception Steps) branch의 생성, pull, merge

사실 이 부분은 아직까지도 명확하지는 않다. 이번 Section의 일반과제와 도전과제에서 나름 중요하게 다뤄졌다. 이것 때문에 내가 repo만 몇 번을 삭제했다가 다시 받아오고 또 터미널로 하다가 실패해서 지우고 다시하고...그 짓만 한 4번 한 거 같다.

여러가지 실험을 해봤고, 대충 내 실험 결과를 토대로 정리하는거니까 나중에 보다가 틀린 점 있으면 알아서 고치자.

1. branch의 생성

기본적으로 repo를 생성할 때 ReadMe.md파일을 같이 생성하게 되면 main baranch가 만들어지게 되고, 이를 Git에 clone해올 때도 마찬가지다. 만일 아무것도 없다면 branch가 없다고 뜨는데 그냥 할 거 하고 push하면 알아서 main branch가 생성된다.

그리고 원하는 이름의 branch를 생성하고 싶다면 다음과 같이 입력하고 실행하면 된다.

git branch {branch명}

2. bracnch의 이동

git checkout {branch명}

위와 같은 명령어로 이동한다. 이거 왜 적다보니까 명령어 정리같냐?그리고 해당 branch는 기본적으로 main branch의 내용을 그대로 가져온다.

3. branch 덮어쓰기

사실 이렇게 표현하는게 맞는지는 모르겠다. repo를 보면 branch가 여러 개인 경우가 있는데 이때 다른 이름의 branch를 만든 다음에 원하는 branch를 가져와서 작업하고 싶으면 다음과 같은 명령어를 실행하면 된다.

git pull {remote명} {remote의 branch명}

앞에도 말했지만 remote명은 remote를 이용해서 로컬과 원격repo를 연결할 때 지정할 수 있고, clone으로 가져오면 origin이다.

4. branch push

해당 branch로 설정되어 있는 상태에서 git push {remote명} {branch명}이라고 입력 후 명령어를 실행하면 해당 repo에 {branch명}이라는 branch가 새로 생성되어 있다.

5. branch merge

branch merge {branch명}으로 실행한다. 이때 {branch명}의 brabch에서가 아닌 해당 branch를 병합하여 사용할 branch에서 실행한다.

# git-branch라는 branch를 생성했고 이를 main에 합쳐서 새로운 branch를
# repo에 생성하지 않고 push하고 싶을 때
git checkout main
git merge git-branch

3. 명령어

기본적으로 터미널에서 실행한다고 가정한다.

1. Top 5 기본 명령어

  • pwd: 현재 경로를 나타낸다.
  • mkdir {폴더명}: 폴더(디렉토리) 생성
  • cd {폴더명}: 폴더에 들어가는 명령어
  • ls: 현재 디렉토리 안의 파일 및 폴더 목록을 출력
    • ls -l: 상세 정보 출력
    • ls -a: 숨긴 파일까지 표시
    • ls -al: 숨긴 파일까지 상세정보를 포함하여 출력
      자그만한 Tip: Mac OS에서 GUI로 숨긴 파일을 보려면 shift+cmd+.키를
      해당 파일에서 동시에 누르면 된다. 한 번 더 반복하면 원래대로 안보이게 된다.
  • cat {파일명}: 파일을 터미널에 출력

Top5명령어는 간단하게만 나태낸 것이므로 상세한 내용은 점차 공부하자

💡 cat예시 Blog
cat에 사용할 수 있는 옵션과 cat에 대해서 잘 정리한 Blog
사이트 주소:https://recipes4dev.tistory.com/177


2. Conda 관련 명령어

2-1. Version출력

conda --version

2-2. 가상환경 저장위치 및 목록 확인

conda env list

2-3. 가상환경 생성

conda create --name '{가상환경명}' python={설치 할 파이썬 버전}

2-4. 가상환경 활성화 및 비활성화

conda activate '{가상환경명}' #가상환경 활성화
conda deactivate #가상환경 비활성화

2-5. 가상환경 제거

conda env remove --name {가상환경명}



3. git관련 명령어

3-1. 온라인에서 로컬로 repo불러오기

git clone https://github.com/{유저 이름}/{레포 이름}

3-2. 로컬에서 작업 중인 git을 온라인 레포지토리와 연결

git remote add {리모트 명: 사용자 지정} https://github.com/{유저 이름}/{레포 이름}

오늘 토의 시간에 어느 조원 분이 clonegit remote와의 차이를 물어보셨고, 나는 아마...여러개 쓸 때 인덱스 지정할 수 있으니까 그럴 때 편하게 쓸려고 그러는거 아닐까요? 했는데 어림 없었다. 아니였다!

git remote add의 경우 로컬에서 기존에 작업하고 있던 깃과 깃헙의 레포를 연결한다. 그런 다음 push등을 사용하여 github repo에 업로드할 수 있다.

git clonegit remote add를 수행하고 그에 더해서 git pull(or fetch)까지 실행하여 그 repo에 있는 모든 소스를 가져온다.

물론 remote를 여러개 불러놓고 쓸 수 있기 때문에 아예 틀린말은 아닌거 같지만 이거 빨리 다음 시간에 정정해야할 것 같다. cloneremote add를 수행한 다음에 pull까지 하는 것이고, remote addgit pull은 하지 않기 때문에 그저 repo와 연결 그 자체를 수행하는 것이라고..

3-3. Local Repo의 Git 폴더 지우기

rm -rf .git

rm -rf를 사용하게 되면 CLI로 폴더와 파일들을 삭ㅈ하게 된다. 이때 파일 탐색기에서 삭제하는 것과 다르게 따로 휴지통에 들어가는 것이 아니라 그냥 삭제된다. 따라서 사용할 때 주의가 필요하며, 웬만해서는 GUI를 이용해서 지우는걸 추천한다고 한다.

3-4. Git 저장소 생성하기

git init

git저장소로 만들고 싶은 디렉토리로 이동한 다음에 위 명령어를 실행하게 되면 git파일이 생성되면서 git 저장소의 역할을 수행할 수 있게 된다.

3-5. Staging area 상태확인

git status

어떤 파일이 수정되어 현재 Staging area에 반영되었는지 아닌지 확인할 수 있다.

3-6. Staging area에 수정파일 추가하기

git add ./      # 수정된 모든 파일 추가
git add {파일명} # 단일 파일 추가

3-7. local repo에 commit하기

git commit -m '{commit message}'

3-8. 연결되어 있는 원격 Repo(=remote) 확인하기

git remote -v

git remote는 원격 Repo와 관련있는 명령어이다. 앞의 git remote add는 원격 Repo를 추가하는 것인것 처럼 git remote 뒤에 오는 명령어를 이용하여 원격 Repo와 관련된 다양한 일을 수행할 수 있다.

3-9. 연결되어 있는 원격 Repo(=remote) 삭제하기

git remote remove {remote명}

3-10. 변경사항 가져오기(fetch), 병합하기(merge), 가져와서 병합하기(pull)

git fetch {remote 명} {branch명}

git feach는 특정 주소에서 변경된 사항을 가져온다. 어떤 branch에서 변경사항이 발생하였을 때 그 내용을 Local로 가져오고 싶을 경우 사용한다. 이때 관심있게 봐야하는 keyword는 가져오기만 한다는 것이다.

git merge {branch 명}

앞서 git feach로 가져온 내용은 따로 저장되는 것이 아니라 임시 Branch로 가져와 진다. 이 임시 branch를 작업하고 있는 branch와 합쳐서 변경사항을 branhc에 가져오고 싶으면 git merge를 사용하여야 한다.

git pull {remote 명} {branch명}

위의 두 과정을 한 번에 수행하여 주는 명령어가 바로 git pull이다. 변경사항을 가져와서 병합까지 해주는 것이다.

3-11. 작업기록 확인

git lot

4. 회고


Section3가 시작됐다. Section3는 전반적인 데이터 엔지니어링과 개발환경에 대해서 학습한다고 하는데, 어우 첫 단추부터 머리가 터지는 줄 알았다. Mac OS와 Window OS 모두 사용하고 있어서 두 환경 모두에서 git이랑 이것저것 다 깔아보려했는데, Window에서 git bash가 문제가 생겨서 이리저리 만져보다가 결국 포기하고 Mac OS로 갈아탔다. 진짜 Window 답이 없다... 확실히 왜 개발하는데 Mac OS가 편하다는지 새삼 알 수 있었다.

이번 Sprint의 첫날 공부를 하면서 사실 모든 것이 낯설었다. 그래서 처음에는 어렵게 느껴졌는데, 지금은 그래도 흐름 정도는 이해하면서 어려운거보다는 낯설었던게 컸다는걸 알았다. 그렇다고 어렵지 않다는 건 아닌데, 여하튼 많이 만져보고 들여다봐야하는 것 같다. 결국 프로그래밍 언어도 언어인지 안보고 안쓰면 까먹는건 똑같은거 같다.

그리고 기존에 명령어를 정리하는 방식에서 문제가 있는 거 같아서 바꿔보았다. 명령어를 그 자체로 정리하다 보니까 어떤 기능을 하는지 그 명령어에 대해서 읽어봐야하는 번거로움이 있어서 어떤 기능을 수행하는지를 적고 그에 대한 명령어를 작성하는 형태로 바꿔보았다. 그리고 설명도 최대한 줄여버렸다. 너무 이 블로그 정리하는데 시간이 많이 들어가는 거 같아서 점점 짧고 최대한 요약해서 쓰는 습관을 들여야겠다.




참고자료
1. VCS, CVCS, DVCS
2. branch와 Merge
3. 누구나 쉽게 이해할 수 있는 Git입문
4. git add 기본 개념/사용법
5. 가상환경_코딩도장
6. CLI 기본 개념 및 사용법
7. 터미널과 CLI
8. clone과 remote

0개의 댓글