branch

기본 브랜치로부터 파생한 독립적인 공간으로, 커밋을 가리키는 포인터를 나타내며 가볍고 생성/이동/병합이 쉬움(기본 master브랜치)

  • 개발 진행 중에 발생한 문제점을 해결하거나 개선하기 위해 사용
  • 오픈 소스 프로젝트인 tensorflow의 브랜치(1월19일 기준 45개의 브랜치)

  • 현재 작업 중인 브랜치: git branch

  • 브랜치 생성: git branch "생성 브랜치 명"
  • 특정 브랜치로 분기: git checkout "생성 브랜치 명"
  • 이전 브랜치로 분기: git checkout -
  • 브랜치 생성과 동시에 해당 브랜치로 분기: git checkout -b "생성 브랜치 명"
  • 실습
    • master브랜치에서 3번의 커밋, 그리고 branch_test브랜치에서 1번의 커밋한 상태

  • 로그 확인

head가 branch_test를 가리키고 있음.

  • master브랜치의 커밋로그
    •  당연히 branch_test에서 변경한 파일 기록이 보이지 않음

  • 새로운 issue_branch에서 test5메세지로 커밋, master브랜치에서 test6으로 커밋한 상황
    • issue_branch브랜치에서 branch_test브랜치에서 변경한 코드 이력이 보이지 않음

  • 전체 branch flow
    • 새로운 브랜치로 코드 이력을 수정함으로써 발생할 수 있는 개발 이슈 관리

  • 모든 커밋 기록 확인

     git log --all --graph

  또한 gitk 명령어로 브랜치와 커밋 이력을 관리할 수 있음

브랜치 병합과 conflict

새로운 브랜치를 생성하여 작업함으로써 코드 이슈를 해결 한 뒤 기준 브랜치로 이동하여 파일 내용 병합

현재 기준 브랜치: master

case) issue_branch를 master로 병합

conflit발생

→ 원인 파악을 위해 test.cpp파일 내용 확인

master브랜치 8번째 라인

→ "cout<<test6<<endl;"

issue_branch 브랜치의 8번째 라인

→ "cout<<issue_branch<<endl;"

즉, 병합을 해야하는데 각각의 브랜치의 같은 라인 번째 코드가 서로 달라서 conflict발생 → 직접 수정→ add/commit→ 병합 완료

** 병합 후  브랜치 상태

  • issue_branch

  • master branch

→ 브랜치의 위치만 최신 커밋으로 바꾸는 상태

 

전체 브랜치 상태

→ issue_branch에서 작업 후 master로 merge했기 때문에 issue_branch는 삭제해 줘야함.

 

git branch -d issue_branch

issue_branch만 삭제 되었을 뿐 여전히 master는 test6과 test5 커밋을 가리킴

방금 진행했던 병합은 master-issue_branch 간 병합

 

3 way merge

아래 3가지 정보를 이용하여 merge한다.

 1) master와 branch_tset의 공통 조상 커밋(→ test3)

 2) master 브랜치의 최신 커밋

 3) branch_tset의 최신 커밋

 

아래와 같은 파일 상태에서 merge.(같은 라인에 코드가 각각 다르므로 conflict발생)

파일 직접 수정 후 merge 완료한 상태(merge후 branch_test삭제)

최종 브랜치 상태

총 비교(최초, issue_branch 작업 후, branch_test 작업 후)

→ 2개의 issue브랜치 병합, branch_test 커밋으로 master 브랜치에 병합 됐음.

tag

  • 태그는 특정 시점의 소스 코드 정보를 기록
  • 프로젝트 진행 중 의미 있는 시점의 커밋을 태깅한 것

         *의미 있는 시점: 1차 목표 기능 개발 완료, 이슈 해결 완료, 개발 및 테스트까지 완료, 배포 시점 등등

          실습 예에서는 issue_branch와 branch_test로 이슈를 관리, 해결 후 병합했기 때문에 tag가 필요 있는 시점임.

  • Lightweight태그: 버전 명과 같은 태그 명만 남기는 태그
    • git tag "태그 명"
  • Annotated태그: 태그를 만든 사람의 이름, 메일, 태그 생성 날짜, 태그 메시지 등의 정보를 저장한 태그
    • git tag -a 태그명 -m "태그 메시지"
  • git을 이용한 태그 생성 시점과 규칙은 조직마다 다를 수 있으며 중요한 것은 소스 코드의 효율적 관리를 위해 일관성 있는 규칙을 정하여 준수하는 게 중요.

git show 태그 명

→ 태그 정보들이 출력됨

특정 시점 커밋 태그하기

  • 태깅하고자 하는 커밋 id 확인 
    • git log --oneline

  • 커밋id값을 인자로 사용하여 태깅하기
    • git tag -a 버전명 커밋ID -m "태그메시지"
    • 실습case에서는 branch_test를 병합하기 전에 병합했던 issue_branch커밋 기록을 v0.9로 생성함.

  • 태그 정보확인
    • git show v0.9

gitk 로 본 브랜치 상태

 

Git flow

아래 브랜치들을 활용하여 변경점을 관리하는 모델

  • master branch
    • 실제 고객에게 릴리즈되는 브랜치. 모든 변경사항은 결국 master로 최종 반영되어야 함.
  • develop branch
    • 실제 개발의 중심이 되는 브랜치. 기능추가/버그 수정 후 배포 가능한 수준이 되면 master에 최종 반영.
  • feature branch
    • 기능을 개발하기 위해 develop브랜치로부터 분기되어 사용됨. 분기 단위는 기능추가, 스프린트 주기 등이 있음. 기능 개발이 완료되거나 스프린트 주기가 종료되면 develop브랜치로 내용 merge후 브랜치 삭제.
  • release branch
    • 배포를 준비(검증, 이슈 수정 등)하는 브랜치. 배포 가능 상태가 되면 master브랜치로 병합하며 release브랜치에서 기능 점검 시 발견한 이슈 수정사항은 반드시 develop브랜치에 병합해야함. 배포 준비가 완료되면 최종 master로 병합하고 태깅해야함.
  • hotfix branch
    • 배포한 버전에서 발생한 장애 및 버그 발생 시 대응하는 브랜치. master로 부터 분기되며 이슈가 수정되면 수정사항은 master, develop브랜치에 최종 반영되어야 함.

Git flow는 고안된 하나의 모델일 뿐 git의 일반 명령어와 함께 사용할 수 있음(git flow 모델 managing을 위한 별개의 명령어x)

git flow 흐름 모델을 제거하는 코드

https://stackoverflow.com/questions/18480923/is-there-a-command-to-undo-git-flow-init

  • gitflow 브랜치 초기화
    • git flow init

gitflow 모델의 메인 브랜치인 master, develop 브랜치 생성 후 develop브랜치로 이동됨.

 

  • gitflow 기능 개발
    • git flow feature start "개발할 기능명"

코드 참고 >>

-> https://velog.io/@sorzzzzy/Code.presso-2%EC%A3%BC%EC%B0%A8-1.-%EC%8B%A4%EB%AC%B4%EC%9E%90%EA%B0%80-%EC%95%8C%EB%A0%A4%EC%A3%BC%EB%8A%94-Git-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B4%80%EB%A6%AC2

 

  • 기능 개발 완료 시?
    • git flow feature finish "개발한 기능명"
    • 순서: feature 브랜치→ develop브랜치로 merge→ feature브랜치 삭제→ develop브랜치로 이동
  • gitflow 기능 협업 개발
    • 다수의 개발자가 함께 기능 개발 시 원격 저장소에 기능 브랜치 게시후 개발
    • git flow publish finish 개발할 기능명
  • 원격 저장소의 feature 브랜치를 로컬로 pull
    • git flow feature pull origin 개발할 기능명
  • gitflow 릴리즈 
    • 시작: git flow release start "버전명"
    • 게시: git flow release publish "버전명"
    • 종료: git flow release finish "버전명"
  • gitflow 긴급 이슈 대처
    • hotfix 생성: git flow hotfix start "새 릴리즈 버전"
    • hotfix 완료
    • 순서:  hotfix브랜치가 master, develop에 merge됨→ hofix브랜치 삭제됨→ develop 브랜치로 이동

 

Reference

https://git-flow.readthedocs.io/en/latest/hotfix.html

https://k39335.tistory.com/82

Git 

소스코드를 효율적으로 관리하기 위한 형상 관리 도구

분산형 버전 관리 구조로서 서버에 접속하지 않아도 개인 레포를 통해 작업 가능

<git의 기본 작업 영역>

  • 작업 디렉토리: 현재 PC에서 작업을 진행중인 디렉토리
  • 스테이징 영역: 작업 내용이 저장되는 임시 공간. Git에 의해 추적 관리됨(add명령어)
  • 로컬 저장소: 커밋이 영구적으로 저장되는 영역. clone한 커밋들이 존재함

  • Git 기본 플로우: Remote 저장소를 로컬로 Clone → 작업(add, commit)→ 로컬에 저장 →  Remote 저장소로 push

Github

1. Git 프로젝트 원격저장소의 효율적인 관리를 지원하며 오픈 소스 프로젝트 생태계 확장에 기여하고 있는 웹 기반 플랫폼 서비스.

개인 Private저장소를 운영 하는 것 외에는 무료.

  • 저장소 관리
  • 코드 공유, 리뷰
  • 이슈 관리
  • 팀원 관리

 

Git기본 환경 설정

git 설치 후 git bash에서 사용자 이름, 메일 등록

git config --global user.name "name"

git config --global user.email "email address"

 

설정 정보 확인

git config --global --list

 

로컬 저장소 초기화 

git init

해당 명령어로 저장소가 초기화 되며 변경 파일들을 추적/관리할 수 있는 . git폴더가 생성됨

본인의 로컬 저장소를 원격 저장소와 연결(기본 브랜치 이름: master)

 

git status

현재 폴더 내 파일의 상태 확인

→ .git으로 모든 변경 내역을 추적하므로 .git 폴더가 있어야됨

 

git add

파일의 변경 내용을  스테이징 영역에 저장(Unstaged->staged)

 * 수정→ add → commit → push 순

 

git commit

스테이징 영역에 저장된 기록을 로컬 Repo에 영구적으로 저장.

커밋 시 커밋 메시지를 만들어야 함 

  • git commit → 상단에 메시지 등록→ wq! 
  • git commit -m "커밋 메시지" 
  • 가장 마지막 커밋의 커밋메시지를 변경하고 싶을 때, 마지막에 commit한 파일 내역을 수정하고 커밋 메시지를 변경 하고 싶을 때 → git commit --amend

 

원격저장소와 로컬 저장소 연결

github/bit bucket에서 새 Repo 생성 → git clone "Repo주소" 명령어로 로컬에 저장

  • git remote add "저장소 별칭" "저장소 주소"
  • git remote -v 명령어로 원격 저장소와 연결 여부 확인 → 본인의 로컬 repo가 원격 repo와 연결됨

* upstream: 임의로 지정한 별칭

 

git log 

커밋 히스토리 확인(2번의 커밋기록, 가장 최근 내역이 상단에 배치)

  •   commit: 커밋의 ID(SHA-1이라는 해쉬값)
  •   hello, test는 각 커밋의 커밋메세지
  •   Author: 커밋 한 유저
  •   Date: 커밋 반영 날짜와 시간

 

git log를 활용한 코드의 복귀

커밋 로그를 활용해 코드를 이전으로 복구 시킬 수 있음. reset, revert명령어가 자주 쓰임

reset: 커밋 기록을 아예 없애버리고 이전으로 복귀

원래 상태>

git reset --hard a0fvf8 명령어 입력 후

revert: 커밋 기록은 유지한 채(파일 변경 후 새로 커밋을 생성한 뒤 코드 복귀)

  • 실습: 기존 커밋 기록과 파일 상태(4번 라인 추가)

git revert  50a922dc89c83270d3eb4415403939c7b03a7409 명령어 입력

→ 기존의 커밋 기록은 남긴 채 새로운 revert커밋이 생성되었고, 파일이 이전 상태로 원상 복구됨

원래 상태>

명령어 입력 후>

git diff

작업 디렉토리에서  코드 변경 내역 확인

* hello.txt파일에서 직접 수정한 상태(add하기 전)

 

원격 저장소에 파일 푸쉬하기

  • 현재 로컬 저장소 상태: hello.txt파일이 존재( add/coomit까지 완료한 상태)
  • 현재 원격 저장소 상태: test라는 이름의 Repo만 생성해둔 상태
  • 현재 원격 Repo 연결상태: blank(어떠한 원격Repo와도 연결되지 않은 상태)

  • 순서: 로컬Repo↔원격Repo 연결 및 원격Repo에 Push
  • 연결할 원격 Repo의 주소와 사용자가 지정할 원격 Repo의 별칭 지정
    • git remote add "원격저장소 별칭" "원격Repo주소"
    • git remote add upstream "원격 레포 주소"

* 원격Repo를 Clone하면 로컬에서 저절로 origin이라는 이름으로 원격서버와 연결됨

  • 파일 내용 수정 후 commit(실습 차원)
    • hello.txt의 파일 내용을 수정 후 test라는 커밋메시지로 commit

  • 원격Repo로 Push 후 확인
    • git push "원격Repo 별칭" "로컬branch"
    • git push upstream master

 

→ 원격Repo에 master브랜치가 생성됨

 

원격레포에서 파일 수정 후 로컬과 동기화

순서: 원격Repo에서 파일 직접 수정→ 로컬과 동기화→ 로컬에서 파일 수정→ 원격push

  • 원격Repo에서 파일 수정(test1이라는 커밋 메시지로 푸시)

  • 로컬에서 동기화
    • git pull: 원격Repo의 커밋기록을 로컬로  fetch한 뒤 로컬 기록과 merge(동기화)
    • git pull "원격Repo 별칭" "로컬브랜치"
    • git pull upstream master
    • 로컬에서 clone한 상태라면 git pull만 입력해도 됨.

**협업 시에는 git pull을 통해 프로젝트의 최신 커밋들을 로컬로 가져와서 병합한 뒤 작업

HTTP1.1의 문제점

HTTP/1.1는 기본적으로 Connection당 하나의 요청을 처리하도록 설계되어있음

  • HOL(Head of Line) Blocking
    • HTTP1.1에서 Connection당 1개의 Request를 처리할 수 있는 비효율적인 통신 기법을 Pipelining기법으로 개선-> 서버에서 이전 Response가 완료되기 전 까지 나머지 작업들의 Latency발생
  • RTT(Round Trip Time) 증가
    • RTT: 클라이언트에서 서버로 Reqeust를 보내고 서버에서 처리 후 다시 돌아오기 까지의 시간(패킷 왕복 시간)
    • 일반적으로 하나의 Connection에 하나의 요청을 처리하므로 3 Way Handshake가 반복적으로 일어나므로 불필요한 RTT증가와 네트워크 지연 초래
  • Header 구조
    • Header에 많은 Meta정보가 저장되어 있는데, 사용자가 중복된 Header값을 갖는 Request를 여러번 전송하게 될 경우 전송 데이터보다 헤더 크기가 큰 경우가 발생

HTTP2.0의 핵심

HTTP프로토콜의 성능 향상에 초점을 둔 버전 

  • Frame&stream
    • HTTP1.0-1.1에서 전송 메시지를 Plain Text로 표현하고 헤더와 메시지를 개행으로 구별했지만, HTTP2.0에서는 바이너리 포맷으로 인코딩된 Message가 프레임에 담겨 전송됨.
  • message: Request/Response 메시지에 매핑되는 프레임의 전체 시퀀스
  • stream: 구성된 연결 내에서 전달되는 바이트의 양방향 흐름, 쌍방 통신이 가능
  • Freame: HTTP2.0에서 통신의 최소단위. Headers Frame, Data Frame으로 매핑.
    • 프레임에 담긴 요청/응답은 스트림을 통해 이동하며 하나의 커넥션위에 여러 개의 스트림이 동시에 만들어 질 수 있어 Multiple Request/Response가능

  • Multiplexed Streams
    • HTTP/1.1을 개선하여 하나의 커넥션에 여러 개의 스트림이 동시에 생성되어 다수의 요청/응답 처리 가능.
  • 하나의 Connection으로 동시에 여러 개의 메시지를 주고받을 수 있으며 Response는 순서에 상관없이 stream으로 주고받음
  • Stream Prioritization
    • Client의 Request대해 리소스의 우선순위를 설정해서 필요한 리소스부터 Response하여 렌더링 속도를 개선
  • Server Push
    • 클라이언트가 필요로 하는 리소스에 대해 서버에서 단일 HTTP 요청 응답으로 구성 파일들을 함께 packing 하여 전송하여 전송 속도를 개선→ 트랜잭션, RTT감소, 응답속도 개선

  • Header Compression
    • 별도의 압축이나 인코딩 과정없이 전송되는 헤더의 사이즈를 줄이기 위해 Header table과 Huffman 인코딩 기법(HPAC압축방식)을 이용함.

 

피드백 사항 정리

  1. RTT증가 이슈가 http1.0이 아닌 http1.1의 문제점인지?
    • http1.1은 keep-alive와 pipelining을 지원하는 버전인데,  지속적인 TCP세션이 유지된다고 해도 이전 response의 처리가 이루어지지 않으면 http1.0과 동일한 문제를 가짐. 네트워크 지연 발생률이 개선되지 못하기 때문에 RTT증가는 HTTP1.0과 1.1의 공통 문제점이라고 할 수 있음
  2. 웹 개발/ 디버깅 툴
    • js를 기준으로 ide인 webstorm과 editor인 vscode가 많이 쓰임. vscode가 확장 플러그인이 다양하고 가볍기 때문에 많이 쓰이고 두 sw모두 웹 개발 시 주로 chrome으로 디버깅 함. 크롬 개발자 도구로 http2.0 패킷을 모니터링 할 수 있고 server push에 관한 내용도 명시가 되어있음. 최근 웹 디버깅 도구인 Fiddler가 http2.0을 지원함
  3. get method에서 body를 갖는 경우? 보낼 수 있는지?
    • http1.1 프로토콜에 관해 정리 된 rfc 7231문서에서 request get method의 body는 정의 되지 않았고, body에 내용이 있을 시 요청이 거부될 수 있다고 표현됨. get메소드 uri에 명시한 자원정보가 길 때 json/xml 포맷으로 body에 표현할 수 있으나 어떤 웹 엔진이냐에 따라 요청 에러가 나거나 무시되거나, 아무런 response를 받지 못할 수도 있음
  4. http상위 버전과 하위 버전의 호환성&내용협상
    • 서버가 클라이언트의 버전 보다 낮을 때 내용 협상에 의해 클라이언트의 버전으로 맞춤. 캐시정책 및 서버 주도 협상에서 말했듯 accept헤더필드와 vary의 인자로 클라이언트에 맞는 버전으로 협상되어 response.

 

Reference

https://datatracker.ietf.org/doc/html/rfc7540#page-60

https://goodgid.github.io/HTTP-2.0/

HTTP 1.1

HTTP/1.0은 client, server가 1:1인 구조로, TCP Connection 과정에서 매번 하나의 요청/응답 후 마다 연결을 해야 하기 때문에 속도가 느리다.

이로 인해 많은 양의 리소스를 요구할 시  HTTP서버의 부하를 증가 시키고 인터넷 트래픽 혼잡을 유발한다.

클라이언트와 서버 간의 요청과 응답을 어떻게 하면 좀 더 빨리 할 수 있을지 연구했고  Persistent Connection(Keep-alive), Pipelining 기법이 등장했다.

이로 인해 서버는 Multiple Requests를 응답할 수 있게 되었고 클라이언트의 응답 속도가 개선되었다.

 

  • Persistent Connection
    • Psersistent Connection(Keep-alive)는 연결을 지속하며 클라이언트와 서버 통신이 이루어짐이를 지원하는 클라이언트는 서버에게 HTTP 요청 시, 요청 Message내 헤더에 다음 헤더를 추가→ connection: keep-alive 
    • HTTP 1.1에서는 모든 요청과 응답은 기본적으로 Persistent Connection을 지원하도록 되어 있어 TCP 연결을 끊어야 하는 경우 아래 헤더를 사용 → Connection: close
    • 서버에서는 클라이언트의 요청을 받아 HTTP 응답 이후 연결을 끊지 않기 위해 동일한 헤더를 HTTP 응답에 포함
    • Persistent Connection을 사용하면 서버의 단일 시간 내의 TCP 연결의 수를 그만큼 적게 함으로써 CPU나 메모리 자원을 절약할 수 있고, 네트워크 혼잡을 줄일 수 있음
    • Request 처리는 http 1.0과 동일하게 순차적으로 이루어지기 때문에 하나의 요청 처리에 응답이 없으면 다음 요청이 처리되지 못함→ Pipelining의 등장
  • HTTP Pipelining
    • 클라이언트는 각 요청에 대한 응답을 기다리지 않고, 여러 개의 HTTP Request를 하나의 TCP/IP Packet으로 연속적으로 Packing해서 요청을 보냄
    • → 커넥션 유지(Persistent Connection)과 달리 동시에 발생한 다수의 Requests를 순서에 상관없이 각각의 응답을 받아 처리한다. 
    • Pipelining이 적용되면 하나의 Connection으로 다수의 Request와 Response를 처리할 수 있게끔 Network Latency를 줄일 수 있음
  • Host Header
    • HTTP1.0 에서는 HTTP통신 시 host주소를 주고 받지 않았는데, 같은 호스트에 여러 서버를 두는 가상 호스팅의 경우 어떤 호스트로 접근하는지를 알 수 있는 방법이 없었다. 이를 해결하기 위해 http1.1 Request/Response 메시지는 host 헤더 필드를 지원하며, 요청 메시지에 host 헤더 필드가 없으면 오류 코드(400)를 전송한다. http1.1 규약부터는 host header가 반드시 지정되어있어야 한다.

 

  • Improved Authentication Procedure
    • HTTP1.0에서 서버에서 클라이언트의 인증을 요구하기 위해 www-authentication헤더가 지원되었으나 클라이언트와 서버 사이에 프록시가 위치하고 있는 경우 프록시가 사용자의 인증을 요구할 수 있는 방법이 없었다. 이를 위해 HTTP1.1에서 Proxy-authenticate, Proxy-authorization 2개의 헤더가 추가되었다. 

 

  • Caching
    • HTTP1.0은 Pragma, IF-Modified-Since헤더를 통해 단순한 캐싱을 지원했지만 HTTP1.1은 Etag를 지원하여 동일 태그값을 갖는 리소스에 대해 캐싱하여 네트워크 대역폭 면에서 효율적이다.
    • ETag: 고유한 16진수 해쉬값, Response로 전송되며 클라이언트에서 동일 자원 재 요청 시 캐싱(서버 자원 X)한다. 주로 IF-(Un)modified-Since, If-Match, If-Node-Match 등의 조건부 헤더를 통해 확장된 캐싱 기능을 제공한다.
  • Content Negotiation
    • 다수의 이용자가 동일한 자원에 대해 다른 응답(언어, 형식 등)방법을 사용할 수 있을 때 특정 응답에 대한 최상의 표현 방법을 선택하는 과정
    • 서버가 주도하는 협상
      • 클라이언트의 특정 HTTP헤더(Accept, Accept-Charset, Accept-Encoding, Accpet-Language....) 를 통해 클라이언트의 선호에 맞게 정보를 Response해줌.
      • 단점: 서버가 클라이언트의 상태를 정확히 알지 못함(Response 정보의 정확도), 사생활 침해, 알고리즘 복잡성, 캐시 기능 제한
    • 에이전트가 주도하는 협상
      • 서버가 애매한 요청을 맞닥뜨렸을 때 클라이언트에게 사용 가능한 대체 리소스들에 대한 링크를 포함하는 페이지(300상태코드)를 Response해줌.
      • 단점: 선택을 지원하는 페이지 형식의 메커니즘이 없음, 최적의 대체 표시 방법을 얻기 위한 추가적인 요구가 필요

 

HTTP1.1 Methods

HTTP/1.0 Method 종류에서 PUT, DELETE, TRACE, OPTIONS 메소드가 추가 되었다.

  • 추가된 Method
    • PUT: 요청 메세지를 통해 서벗에서 새로운 리소스를 생성하거나 대상 리소스를 대체한다.
    • DELETE: Request- URI가 식별하는 자원을 삭제하도록 요구할 수 있다. 단, 사용자의 개입에 의하여 무시될 수 있고, 안전상의 문제로 대부분 서버에서 비활성화 해 놓는다.
    • TRACE: Request 메시지가 거쳐가는 프록시나 게이트웨이의 중간 경로부터 최종 수신 서버까지의 경로를 알아낼 수 있다. 주로 루프백 검사용으로 쓰인다.
    • OPTIONS: 목표 리소스와의 통신 옵션이나 웹서버에서 지원되는 메소드의 종류를 확인할 때 사용한다.(Method, header, content type ..)

http1.1프로토콜 response확인

       *deflate: Huffman알고리즘 기반 압축 방식(Huffman:문자열에서 자주 등장하는 문자는 짧은 비트, 많이 등장하는 문자는 긴 비트로 표현하여 전체 비트 수를 줄임)

 

  • Method 특성

http 1.0 vs http 1.1

  •  http1.0: TCP Connection은 HTTP요청마다 3-way handshaking이 이루어짐
  •  http1.1(persistent connection): 한번의 3 way handshaking 이후 연결이 끊이지 않고 끝까지 지속됨
    • 하나의 Request에 대한 Response가 없을 시 다음 Request가 진행되지 않음
  •  http1.1(Pipelining): 각 HTTP 요청은 이전 응답이 돌아올 때 까지 기다리지 않고 즉시 수행될 수 있음
    • 하나의 TCP세션에 Multirequest가 가능하지만 순차적으로 응답해야 함.

HTTP1.1 Message Header

  • General Header

  • Entity Header

  • Request Header

  • Response Header

 

Reference

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

https://it-mesung.tistory.com/146

https://blog.daum.net/creazier/15310290

https://nitw.tistory.com/127

https://programmerall.com/article/6663649849/

http://coffeenix.net/doc/network/http_1_0_vs_1_1.html

Http 개요

 World Wide Web에서 사용하고 있는 TCP기반의 데이터 송수신 규약

  • 서버와 클라이언트가 인터넷 상에서 데이터를 주고받기 위한 프로토콜
  • 동영상, 오디오, 문서 등, 어떠한 형태의 데이터도 전송할 수 있도록 설계되어있음
  • TCP/IP를 이용하는 응용 프로토콜
  • 서버가 클라이언트로부터 받은 요청을 응답한 뒤 연결을 종료하는 비연결성 프로토콜 
  • 요청/응답 방식으로 이루어짐
  • Default Port 넘버는 80
  • HTTP/0.9
    • Request는 단일 라인으로 구성되며 사용 가능한 method는 GET밖에 없다. 헤더, 상태 코드가 없고 Response 또한 오로지 파일 내용 자체로만 구성된다.
  • HTTP/1.0 규약
    • 서버와 클라이언트는 각각 HTTP 0.9/1.0의  request line의 표현 형식을 인식하고 적절히 응답할 수 있어야 한다.(프로토콜 호환성)

     

관련 기초 용어 설명

 

HTTP통신 동작 방식

HTTP의 통신 방식은 서버 접속→ 클라이언트의 요청→ 서버의 응답→ 연결 종료 순으로 이어진다.

  1. 사용자가 브라우저에 URI주소 입력
  2. DNS 서버에 웹 서버의 호스트 이름을 IP주소로 변경 요청
  3. 웹 서버와 TCP 연결(3 Way handshaking)
  4. 클라이언트가 서버에 요청
    • HTTP Request Message= Request Header + 빈 줄(Empty Line) + Request Body
    • Request Header= 요청 메소드+ 요청 URI+ HTTP 프로토콜 버전
    • 빈 줄: 요청에 대한 모든 메타 정보가 전송되었음을 안내
    • Request Body: 데이터 업데이트 요청과 관련된 내용(HTML 폼 양식 등..)
  5. 서버의 응답
    • HTTP Response Message= Response Hedaer+ 빈 줄+ Response Body
    • Response Header= HTTP프로토콜 버전+ 응답 코드+ 응답 메시지
    • Response Body: 응답 리소스 데이터
  6. 연결 종료

 

HTTP1.0 Message 헤더 필드

 서버와 클라이언트가 HTTP통신을 할 때 주고받는 메시지를 나타낸다.

  • 클라이언트가 서버에게 자료를 요청하는 메시지: Request Message
  • 서버가 클라이언트에게 응답하는 메시지: Response Message
  • Request/ Response 메시지 헤더 구성

  • Request-Line: 요구메시지의 첫 번 째 줄에 등장하며 자원의 이용 방법(Method), 자원 위치(URI), 규약 버전, 그리고 마지막에 공백(CRLF)으로 표시된다. 
  • Message Header: 요청에 대한 상세 설명이 표시된다.
  • Blank: 요청에 대한 모든 메타 정보가 전송되었음을 알리는 빈 줄이 삽입된다.
  • Message Body: 요청과 관련된 내용(HTML 폼 콘텐츠 등)이나 응답과 관련된 문서가 들어간다. 

HTTP/1.0 버전은 더 다양한 기능을 제공하며 다음과 같은 메시지 형식을 갖는다.

  • 메시지 형식

  • 상세

Http1.0 메소드

브라우저가 서버로 데이터를 전달하는 방법으로,  http/1.0은 GET, HEAD, POST 메소드만 존재(다른 이름의 Method 정의 불가)

  • GET: Request-URI에서 지정한 리소스를 요청한다.
  • HEAD: Request 요청에 대한 응답으로 헤더만 전달하는 것 외에 동일하다. 주로 서버의 정보, 컨텐츠의 크기, 날짜 등의 정보를 얻기 위함(트래픽 절감)
  • POST: 메시지의 Entity body에 포함된 자원을 서버에 요청할 때 사용한다. 요청 자원이 서버에서 생성되는 경우 201 응답이 되어야 하고 상태 정보나 새 자원 정보를 알려주는 Entity가 포함되어야 한다.
    • HTTP/1.0의 모든 POST Request메시지에는 Content-Length가 반드시 있어야 하며, 에러 상황 시 400 메시지를 응답해야한다. 

Http 상태 코드

클라이언트가 보낸 HTTP요청에 대한 서버의 응답 코드로, 요청의 성공/실패 여부를 판단한다.

  • 1xx(Informational): 임시적인 응답. 요구가 수신 되어 계속 처리
  • 2xx(Successful): 클라이언트의 요구를 성공적으로 수신
  • 3xx(Redirection): 요구에 대한 처리를 완료하기 위한 추가 조치
  • 4xx(Client Error): 클라이언트 요청 메시지가 잘못된 형식으로 되어있거나 제대로 처리할 수 없는 경우
  • 5xx(Server Error):  요구 메시지를 서버가 처리할 수 없는 경우

  * http/1.0에서 1xx코드는 예약되었을 뿐 실제로 사용되지 않음. http의 general한 상태 코드 list임 

 

Reference

https://luavis.me/http/http-summary-2

https://www.w3.org/Protocols/HTTP/1.0/spec.html

https://datatracker.ietf.org/doc/html/rfc1945

https://gmlwjd9405.github.io/2019/01/28/http-header-types.html

 

 

너무 바빠서 업로드를 못하고 있는데

아마도

 

RFC문서 기반의

1. http1.0 개념

2. http1.0 vs 1.1 차이

3. http1.1vs 2.0 차이

 

4. REST 개념

5. AWS Cloudwatch(대쉬보드&모니터링 시스템) 개념

6. AWS cloudwatch 사용법 (세부): 4개정도 업로드하지 않을까..

 

+

추후 예정

 

vue js 개발 언어 study 기록.

 

ps) 내일 수습 발표..

 

 

 

 

12월말부터 출근 시작하면서 업로드를 너무 못하고 있네요.. 많이 나태해진것 같습니다.

AWS cloudwatch라는 기술을 배우고 실무에 적용하는 중인데 나중에 이 부분을 업로드 하지 않을 까 싶습니다.

 

다름이 아니라 벌써 올해 상반기 취준 기간이 시작되었더라구요.

 

저는 2021년 하반기 취준 하면서 30개 가까운 기업에 지원했는데 

면접전형까지 진행했던 기업들 중 혹시 올해 상반기 지원을 앞두고 있는 분이 계시면

면접 때 어떤 질문들이 들어왔고, 저는 어떻게 답변했는지 댓글달아주시면 답변드리겠습니다.!

 

 

1. 코오롱 인더스트리

2. 한화 정밀기계

3. 한솔 인티큐브

4. 경동나비엔

5. 현대 오토에버

 

 

+++

서류를 어떤식으로 작성했는지도 여쭤보시면 제가 어떤 흐름으로 자소서를 작성했는지 알려드릴게요!

 

댓글이나 메일 주세용 

블로그는 매일 방문하고 있어요!

 

 

 

9월부터 이어진 3개월 간의 취준도 모두 끝이났습니다.

매일 자소서 쓰고.. 탈락하고.. 혼자 끙끙 앓고.. 밤새고.. 고통받던 시간이 드디어 끝났습니다.

 

한 군데 최종합격했고 아직 전형 진행 중인 기업이 있지만 여러가지 조건을 고려해서 최종 결정을 내리게 되었습니다.

 

제가 최종합격한 기업은 "경동 나비엔" 입니다.

 

보일러 업계1위? 정도로만 알고 있었는데 입사를 준비하며 기존 사업 호황, 그리고 홈 IoT시장을 적극적으로 개척하려는 움직임을 보면서 느낀게 많습니다. 뉴스를 보니 올해 첫 매출1조를 달성할 것으로 보이네요. 

 

오늘 2곳의 기업 발표가 났습니다.

코오롱 인더스트리 IT기획 직무는 최종 탈락 했습니다.. 자소설닷컴에서만 200명 넘게 지원한 것으로 보아 제 생각에는 500명 가까이 지원한 것 같은데 결과적으로 뽑힌 사람은 단 1명 이네요.. 이거 실화냐?? 진짜?????아직도 화나네;;

 

한솔 인티큐브도 결과가 나왔는데요. 예비합격입니다. 아마 합격한 지원자 중에 다른 기업으로 Run하시는 분들 생기면 제가 그 자리로 충원되는 것 같아요. (탈락을 곱게 포장한..) 갈 생각은 없습니다. 면접에서 지원자들을 대하는 태도를 보면서 많이 불쾌하기도 했고 제가 왜 이자리에 있는지 잘 모르겠더라구요..

 

제가지원한 직무는 디지털 컨텍트 센터 기술 개발(쉽게 말해 콜센터 기술)입니다. 같은 계열사 중에 한솔PNS가 있는데 IT업체 거든요. 최근 스마트팩토리 시장에 진출했습니다. 제가 주로 IoT쪽으로 관심갖고 교육활동, 프로젝트 등에 참여했다보니 나중에 이 곳으로 지원할 걸 사아알짝 후회하고있습니다.. 실제로 면접관님이 "PNS가 어울리시는데 잘못 지원하신거 아니에요?" 라고 말씀하실 정도였으니까요.. 

 

하.. 근데 참 코오롱은 정말 가고 싶었던 기업이었는데.. 집 앞 10분거리이기도 하고 아무래도 대기업이고 제조업에서 IT인력이 대단히 중요하기 때문에 꼭 가고싶었는데.. 솔직히 아직 실감은 안납니다. 단 한명만 뽑았기 때문이죠. 완전 선넘음...

면접 때는 묻지도 따지지도 않고 바로 상황면접부터 들어가고.. 면접관님들이 신입 공채를 경력직 선발로 잘못 알고 계신게 아닐까 싶을 정도로 면접의 성격이 매우 심오했습니다.

 

하긴 근데 제가 IT기획직무에 대해 잘 몰랐고 자소서에도 개발 경험위주로 작성했는데 최종 면접 4인에 선정된것만 해도 어떻게 보면 참 영광스러운 일이죠. 좋게 생각하려고 하고있습니다..

 

현재 전형진행 중인 기업 중 삼성선물은 GSAT전형을 포기했고 한화 정밀 기계의 최종면접만 남은 상황인데..한화는 아무래도 거리도 멀고 통근버스를 별도로 지원을 안해준다고 했습니다. 당연히 그에따라 자취비용도 많이 발생하겠죠... 경동나비엔보다 연봉이 조금 더 높긴한데 그런거 생각하면 엄청난 손해인것 같아서 많이 고민되는데.... 아마도 경동나비엔에 갈것같아요.

 

이로써 저의 취준은 끝났고... 이제 경동나비엔과 함께 하게되었습니다. 블라인드나 잡플래닛 보면 되게 악평이 많고 야근 지옥이라는 말도 많은데,, 사실 경험해 보지 않으면 아무도 모르는거잖아요? 입사하기도 전에 이런 생각하는 것도 참 웃기고요.. 고학력자분들 거르고 나를 선택해준 거 생각하면 감사한 마음이 더 큽니다...

 

올해 정말 망했다 싶었는데 취준에 성공해서 후련한 마음에 글 쓰다보니 글이 길어졌네요.. 그래도 취업에 성공해서 너무 기쁘고 이제 놀 생각만 하려구요. 오큘러스 퀘스트 게임도 샀고 롤도 설치했습니다. 학교 기말고사가 남았는데 대충 찍고 공학인증 보고서만 제출하고 졸업할 생각입니다 ㅎㅎ

 

이글을 보시는 모든 분들은 정말 본인이 목표했던 기업에 취업하시길 진심으로 응원합니다. 정말 너무 힘들었는데 그래도 어찌저찌 취업에 성공했네요. 여러분도 모두 화이팅 하셨으면 좋겠습니다. 진심으로!

블로그는 매일 관리하니 혹시라도 궁금한게 있으시다면.. 답글 남겨주세요. 뭐라도 도움이 되고싶습니당

 

 

 

+ Recent posts