- Overview

 웹 서비스의 성장은 무서울 기세로 상승 중입니다. Client의 Local 에서 저장하던 Data들은 점점 서버로 올라오면서 자연스레 Web 서버와 교류가 많아지고 있습니다. 예를 들면 저희가 자주 사용하는 Naver App, You tube 등의 앱들은 Web app으로 전부 웹서비스 기반의 어플리케이션입니다. 또한 동영상들과 같은 Contents들도 Web Service로 User들과 많은 교류를 하고 있는 추세입니다. 

 웹서비스에 접근할 수 있는 Device들은 스마트폰, 데스크탑, 노트북, 타블렛, 2 in 1 notebook 등 수많은 Device들이 있습니다. 이러한 Device들의 웹 접근을 과거에는 중앙 Server 하나가 전부 전담하였습니다. 하지만 점점 Main Server의 부하가 오게 되었고 많은 기업들은 공통된 Solution을 찾게되었는데요. 그것이 바로 프록시서버를 이용한 웹 캐싱 서비스입니다. 그러면 웹 캐싱 서비스를 알아보기 앞서 프록시 서버에 대해서 알아보도록 하겠습니다.



이미 프록시서버를 알고 계신다면 내려가셔서 웹 캐싱 서비스 부분부터 보셔도 무관합니다.


 - 프록시 서버?

요약하면 다음과 같습니다.

1. PC와 외부인터넷 사이의 중개자 역할을 합니다.

2. 외부 인터넷의 내부침입을 막는 방화벽역할도합니다.

3. 프록시 서버는 캐시 기능을 가지고있습니다. 그래서 웹 캐싱서비스에서 프록시서버가 자주언급되고있습니다.



이번 포스팅에서 볼 웹 캐싱서비스에 쓰이는 프록시 서버 역할에대해 간단히 살펴보면 다음과 같습니다.

=> 프록시 서버는 클라이언트가 앞서 요청했던 웹페이지를 다시한번 요청하면, 프록시 서버는  캐싱 되었던 페이지를 즉각적으로 클라이언트에게 주기때문에 빠른 반응성을 가지게 됩니다. 

 프록시 서버는 대개 조직(회사) 네트워크에 사용됩니다. 집에서 인터넷을 사용할때는 프록시서버를 사용하지않습니다. 



프록시 서버의 종류

1 Caching Proxy Server

클라이언트의 요청 내용과 응답 컨텐츠를 저장해 두었다가 동일한 요청이 들어오면 저장된 컨텐츠를 전송합니다.


2 Web Proxy

WWW 트래픽에 초점이 맞춰진 프록시 서버입니다. 웹 프록시의 가장 일반적 형태는 웹 캐시입니다.


3 Forward Proxy

일반적으로 사용하는 프록시입니다. 클라이언트와 웹서버 사이에 위치하여 클라이언트가 타켓인 서버에 서비스 요청을하면,

프록시 서버로 요청이 갑니다. 그러면 프록시 서버가 해당 서비스 서버 타켓으로 요청을 중계합니다.


.



점점 웹서버가 Clients에게 제공하는 Data가 기하급수적으로 커지고있습니다. 이는 웹서버의 부담을 의미하게됩니다. 결국 다양한 접근성으로 인해 웹서버는 부하가 가게 되고 client에게 제공하는 속도가 느려지는 등 퀄리티가 낮아지게되는 문제가 생기게 됩니다. 이럴 해결하고자 웹 캐싱 시스템을 구성하게 됩니다.


웹 캐싱 서비스란, 다양한 컨텐츠들을 별도로 다른 웹서버에 저장해두고있다가 사용자의 웹브라우저에 가장 가까운 웹서버에 해당 웹서비스의 컨텐츠를 사용할 수 있게 만드는 기술입니다. 

캐싱이라는 기술자체가 데이터를 임시로 저장해두고있다가 필요할때 갖다 쓰게 만드는 기술입니다. 컴퓨터 과학 알고리즘에서도 캐시 기법이 많이 나오기도 합니다.  어쨌든, 캐싱된 컨텐츠들을 사용자가 빠르게 쓸수있도록 제공하는 서비스이며, 메인 웹 서버의 접속 부하를 줄여주는 서비스여서 퀄리티를 높이는 방법입니다.



앞에 프록시 서버에 대해 제가 설명하였습니다. 이런 웹 캐싱 기술은 이미 프록시 시스템에서 적용되고 있습니다. 왜 웹 캐싱 시스템에 프록시 서버가 많이 사용되냐하면, 프록시 서버가 간단한 웹서버 기능을 갖추고 있기 때문입니다. 시스템 규모가 작고 커스터마이징이 용이하며 유지보수가 용이한 프록시 서버가 웹 캐싱 시스템에서 웹 캐싱 서버로 이용되고있습니다.


보통 웹 캐싱을 사용한다면, 웹서비스이 메인이 되는 프로그램은 메인 웹서버가 그대로 제공합니다. 용량이 큰 미디어 컨텐츠(음악, 영상등)들은 웹 캐싱 시스템을 이용해서 제공됩니다. 


변경이 자주 일어나는 텍스트 위주 컨텐츠는 메인 웹서버가 저장하고 제공합니다. 자주 변한다는것은 그만큼 유저에게 제공하는 기능도 다양해야할텐데 프록시서버는 그렇지는 못하기때문에 메인이 처리하기 적합한것입니다.

변경이 자주 읺어나지 않고 덩치가 큰 동영상, 사진, 음악, 그림 등의 미디어 파일들은 웹 캐싱 서버에 저장해서 제공합니다. 웹캐싱 서버들은 주기적으로 메인 웹 서버와 통신하고 저장된 내용들을 최신내용으로 갱신합니다. 그래야 사용자들이 정확한 웹서비스의 내용을 받아볼 수 있기 때문입니다.


심지어 프록시 서버는 구축이 용이하고 저렴하기 때문에 웹 캐싱 시스템에 많이 쓰이는 편입니다. 



정리

대규모의 웹서비스를 제공하는 업체들은 점점 웹 캐싱 서비스를 많이 사용하고 있는 추세입니다. 우리나라 네이버, 미국의 구글등이 그렇죠.

웹 캐싱서비스에 대한 수요가 증가하면서 자연스레 프록시 서버가 점점 진보적으로 발전하고있습니다. 이제는 프록시서버의 기술이 결코 과소평가 받지않게 되고있습니다. 

포스팅에 앞서.

드디어 Git을 로컬뿐만 아니라 원격에서 사용해야할 차례입니다. 원래 Local에서만 git을 이용한다면 의미가 반감되는 정도입니다. 그러니 원격 저장소를 사용할 수 있도록 해야합니다.  github에 계정을 만들고 사용하는 방법을 포스팅 하도록 하겠습니다.



OverView.

Github 이용 이점은 다음과 같습니다.

 - 전세계에서 진행되는 오픈 소스프로젝트가 많이 모여있어 이에 참여하고 기여할 수 있는 기회가 있습니다.

 - 개발자는 Github를 이용해 자신이 작성했던 코드 그자체를 즉시적으로 제공할 수 있습니다.

 - IT개발자 뿐만 아니라 디자이너, 기획자등 모두 협업할 수 있습니다.




GitHub 가입하기.

https://github.com

sign up for github 선택하여 회원가입합니다. 음 모두 free로 선택해서 가입하시면 되겠습니다.

모든 이메일 인증과 절차를 끝내고 sign in 한 화면입니다. 



원격 저장소 생성.

원격저장소는 외부에서 접속하여 저장하는 저장소입니다. 앞선 포스팅에서는 로컬에서 git으로 작업했다면 이제는 원격 저장소에도 저장하여 다수 개발자들과 협업을 해야합니다.



Github의 기능 소개입니다.

Fork: 다른 사람의 저장소를 복사하는 기능입니다.

Pull Request: 포크한 저장소를 수정해 다시 원본 저장소에 병합해달라는 요청을 보내 사용자 사이의 상호작요을 일으킬 수 있습니다.

Issues: 저장소 안에서 사용자들 사이의 문제를 논의하는 기능입니다. 

Wiki: 저장소와 관련된 체계적인 기록을 남기는 기능입니다.


사용자들끼리, 서로의 원격 저장소를 읽거나 쓸 수 있어서, 깃허브에서 오픈소스 프로젝트가 활발하게 이루어진답니다.



그러면 실습에 쓰이는 새로운 원격 저장소를 github에서 생성해보도록 하겠습니다.


[New repository]를 선택합니다.

Owner: 사용자 아이디가 표시됩니다.

Repository name: 저장소 이름입니다.

Description: 원격저장소 역할을 설명합니다.

public/private: 저장소 공개 비공개 설정입니다.

Add .gitignore: 프로젝트에 포함되지않을 파일목록을 만들 때 사용합니다.

Add a license: 어떤 라이센스에 속할지 선택합니다.


다음과 같이 설정하고 생성했습니다.




GitHub 원격 저장소의 구조.

오른쪽 상단의 메뉴들에 대한 설명입니다.


Watch: 원격저장ㅅ의 활동내역을 사용자에게 알려줍니다.

Star: 즐겨찾기 기능이라 생각하시면됩니다.

Fork: 해당 원격저장소를 fork 합니다. 얼마나 많은 사람들이 fork했는지 수가 나타납니다.




저장소 메뉴들을 살펴보겠습니다. 


Code: 해당 원격저장소의 루트 디렉토리로 이동합니다.

issues: 주요 이슈사항을 기재한후 관리합니다.

Pull Requests: 전체 목록을 모아서 보여줍니다. 목록마다 댓글 형태로 토론할 수 있습니다. 왼쪽에있는 숫자는 현재 요청이 온 리퀘스트를 받아들일것인지에 대한 논의가 몇개인지 알려주는것입니다.

Wiki: 공유할 정보나 개발문서, 참고자료등을 작성하기 위한 기능입니다. 

pulse: 해당 원격저장소의 최근 변경 내역을 확인할 수 있습니다. 

Graphs: 공헌자의 공헌내역, 커밋 반영 수 등 활동내역을 그래프화해서 확인할 수 있습니다.

Setting: 해당 저장소 관리자면, 각종 설정을 변경 할 수 있습니다.

HTTPS Clone URL: 원격 저장소를 clone할 때 사용하는 주소정보를 알려줍니다. 

Clone Desktop: 깃허브 전용 클라이엍느 프로그램을 사용할 때 클론할 떄 클릭하면 됩니다.

Download ZIP: 원격 저장소의 전체파일을 하나의 압축 파일형태로 다운로드 받을 수 있습니다.



GitHub 사용자 유형.


사용자 유형 

특징 

저장소 관리자 

 원격 저장소 읽기 및 쓰기 가능. 협업자 초대와 소유권 이전가능합니다.

협업자 

 원격 저장소 읽기 및 쓰기 기능을 할 수 있습니다.

일반 사용자 

 원격 저장소 읽기만 가능합니다. 쓰기 권한이 없으므로 포크를 하여 작업 해야합니다.


다음 포스팅엔 직접 원격 저장소에 접근하여 올려보고 수정해보록 하는 실습을 가지도록 하겠습니다. 

감사합니다.

로컬환경에서 혼자 Git을 사용한다는 가정아래 git의 명령어를 보도록 하겠습니다. 일단 로컬에서 기초를 먼저 다지시면 원격저장소에 저장하는것은 크게 어렵지않게 느끼시게 될것입니다. 기본을 다지다 생각하시고 해당 포스팅 보시면 되겠습니다.


하기와 같은 시나리오 대로 진해앱도록 하겠습니다.

- 로컬 저장소 생성

- 저장소에 파일 생성 및 추가

- 추가된 파일의 수정

- 기본 브랜치에 영향을 끼치지않는 브랜치 생성

- 브랜치 병합

- 충돌 해결

- 저장소 기록 보기


시나리오를 살펴보니, 브랜치간의 병합하고 충돌과정을 해결하는게 딱봐도 어려워 보이네요. 차근차근 풀어가보도록 하겠습니다.


용어정리를 먼저하겟습니다.


Checkout: 현재 작업공간으로 해당 브랜치를 가져온다.

Commit: 프로젝트에서 의미가 있는 최소한의 단위입니다. 의미를 가질 수 있게되는 시기라면 커밋을 하는게 좋습니다.


앞서 포스팅했던, 글을 참고하여 git bash를 실행하도록 합니다.


1. git init 저장소 생성

Git저장소로 사용할 디렉터리를 만들어봅니다.


> mkdir my_work   //디렉토리를 새로 생성합니다.

> cd my_work        // 디렉토리 이동을 합니다.

> git init               //  저장소 초기화를 진행합니다.


현재 작업중인 브랜치가 master가 된것도 확인하실 수 잇습니다.



2. git add, git commit

파이썬 파일 Hello world를 출력하는 프로그램을 작성하도록 하겠습니다. 파이썬이 설치안되어있으시다면 일반 텍스트파일로 진행하셔도 무난합니다. 실전과 같은 느낌으로하려고 파이썬 을 선택했기 때문입니다. 정말 윈도우에서 파이썬을 설치하고싶으시다면, 해당링크 선택하여 설치하시고 오시면 되겠습니다. 


저는 hello.py 파일을 생성해서 print("hello world") 라고 코드를 작성하여 저장했습니다.


hello world가 출력되는것을 확인하실 수 있습니다.

자 이제 저장소 상태를 확인해봅시다.


> git stauts

아래과 같은 메세지가 출력됩니다.

추적하지 않은 파일이 저장소에 있다고 알려줍니다. 이를 추적하려면 git add를 사용하며 된다고 하네요. 소원대로 사용해줍시다.


> git add hello.py


그이후에 다시 쳐봅니다.

> git status


새로운 파일 hello.py가 추가되었다고 뜨는것을 확인하실 수 있습니다.

이제 commit을 해보겠습니다.


> git commit


앗 유져 이메일과 사용자이름을 먼저 설정하고 진행하라고 하는군요. 저처럼 설정안하신분은 설정하고 다시 진행하도록 합니다.


> git config --global user.email "이메일"

> git config --global user.name "이름"


다시 깃 커밋을 날려줍니다.

> git commit


커밋 메세지를 작성하는 화면이 나옵니다. 아마 VIM이 실행되었을 것입니다. I키를 눌러 첫번째 줄에 여러분들의 커맨트를 다시면 되겠습니다.

그이후 ESC를 누르고 :wq룰 입력후 enter를 쳐서 빠져나옵니다. 그러면 커밋이 완료된것입니다.

화면을 빠져나오면, 마스터 브랜치에 어떠한 변화가 생겼는지 출력되는 커멘트들을 확인하실 수 있습니다.


.


3. git branch, git checkout

현재 작업하고있는 브랜치를 확인하는 커맨드는 다음과 같습니다.

> git branch

master 브랜치를 확인하실 수 있습니다.


브랜치 생성은 다음과 같습니다.

> git branch myBranch 


>git branch

master 브랜치, myBranch 를 확인하실수있습니다. 또한 *글자가있는데, 이는 지금 작업중인 브랜치를 표시합니다.


이제 브랜치를 이동해보겠습니다.

>git checkout myBranch


> git branch


해당 브랜치에서 hello.py를 수정해보겠습니다.

>vim hello.py


printf("Hello world") 코드아래, print("Tell me hello") 코드 작성합니다. 저장후 나옵시다. 여기까지가, myBranch에서 hello.py파일을 수정한 상태입니다.



4. git commit -a

현재의 상태를 보겠습니다.

>git status

hello.py 가 수정되었다고 하네요.

이제는 git add 혹은 git commit -a 를 커멘드를 날려라고 하네요. -a옵션은 변경된 저장소 파일모두를 커밋하는 옵션입니다.


> git commit -a 

역시, vim 이뜨면서 커멘트를 달아라고합니다. 적당한 커멘트를 달고 나옵니다. 


그리고 다시 상태를 확인해봅니다.

> git status

myBranch 에 커밋할게 없다고 뜨는것을 확인하실 수 있습니다.


커밋할때 vim이 열려서 따로 추가하고 나오는게 번거로울 수 있는데 그럴때는 아래와 같이 명령어를 치면 되겠습니다.


> git commit -m "커밋할 메세지를 여기에 작성"


5. git merge: master 브랜치와 병합

그럼 이제 다시 master 브랜치로 체크아웃 하겠습니다.


> git checkout master

> python hello.py 

헬로 월드만 뜨는것을 확인하실 수 있습니다.


그리고 이제 브랜치 병합을 실시하겠습니다.


>git merge myBranch

myBranch에 추가한 print("Tell me hello")가 제대로 뜨는지 확인해보겠습니다.


>python hello.py

제대로 출력되는것을 확인하실 수 있습니다. 혹은, cat hello.py 를 입력하시면, myBranch에서 추가한 구문이 병합되어 master 브랜치의 hello.py에 반영된것을 확인하실 수 있습니다. 


6. 각 브랜치의 독립성 확인

병합전 독립성을 확인해보겠습니다.

현재 master 브랜치에서 hello.py마지막에 print("tell his world") 를 추가합니다.


그리고 커밋을 합니다.

>git commit -a    //a옵션은 수정된 파일 모두 커밋입니다.


마스터 브랜치에 커밋 완료했으면 다시 브랜치를 이동하겠습니다.


>git checkout myBranch

>vim hello.py

여기까지 실행했으면 hello.py에는 master 브랜치에서 반영했던 내용이 반영안된것을 확인하실 수 있습니다.

여기선 print("Tell Her world") 를 추가하고 저장하겠습니다.


그리고 해당 브랜치에서 커밋하겠습니다.

>git commit -a 


자 그럼 hello.py가 master 브랜치와 myBranch에서 독립적으로 작성된것을 확인하실 수 있습니다.



7. .gitignore 불필요한 파일 및 폴더 무시

보통 개발을할때 빌드파일 로그파일 기타 잡파일들이 프로젝트 폴더에 포함되는경우가 있습니다. 이런파일들을 commit하게되면 브랜치에는 쓸데없는 파일들이 차고 넘치겠지요. 이런것들을 방지하고자 commit할때 제외시켜주도록 도와주는 파일이 .gitignore파일이 되겠습니다.


>touch .gitignore

빈파일의 .gitignore 파일을 생성합니다.


직접 작성하기엔 저희에겐 시간이없습니다. 그래서 해당사이트에서 도움을 받도록 하겠습니다.

https://www.gitignore.io/

파이썬과 사용중인 운영체제 윈도우스를 선택했습니다. IDE도 입력하시면 됩니다. 아무튼 create하면 파일을 생성해주는데 이걸 .gitignore 파일에 넣으시면 되겠습니다. 저는 메모장으로 그냥 넣었어요.


그리고 다시 

> git status


항상 파일을 새로생성했으면add를 먼저 해주시고 그이후부터 commit을 해주셔야 합니다. add를 통해서 추적을 시작하겠다는것을 전달하는 것이지요.


>git add .gitignore

>git commit -m "added ignorefile"


이제 윈도우, 파이썬으로 작업하실때 불필요한 파일이 저장소에 커밋되는것을 방지하실 수 있습니다.


8. 충돌해결

마스터 브랜치로 이동하여 myBranch와 병합을 시도해보록 하겠습니다.


>git checkout master

>git merge myBranch

cat hello.py

해당 master 브랜치가 merging 이라고 표시가 나오네요. 또한, hello.py 파일을 보면 myBranch에서 작성했던 내용이랑 달랐기때문에 충돌이 되었고 해당파일에 충돌 표시가 보이는것을 확인하실 수 있습니다.


충돌이 났으니 개발자가 직접 풀어야겠죠? 해당 hello.py를 열어서 충돌난 부분을 수정해서 적절하게 합쳐줍시다.

그리고 커밋해봅시다. 

참고로, 이번엔 add로 추적할 대상을 선택안했기때문에 git commit 이 아닌 git commit -a 를 쓰면됩니다.


> git commit -a -m "conflict resolved!"


충돌을 해결하니 master 브랜치도 merging이없어진것을 확인하실 수 있습니다.

충돌을 해결하였습니다.



9. git log 기록보기

> git log --graph

SHA값, 커밋한 사용자, 시각, 메세지등을 확인하실 수 있습니다. 브랜치가 생성되고, 분기되고 merge까지 되는것을 시각적으로 보실 수 도 있습니다.



> git log --stat

각 커밋에서 수정된 파일의 통계정보를 보여줍니다.

+ Recent posts