Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[8주차] 한승규 학습 PR 제출합니다. #37

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions week08/한승규.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Week8

작업자: 승규 한
상태: 시작 전
요약: Week1
마감일: 2024년 5월 12일

## 인터넷과 네트워크

네트워크는 컴퓨터뿐만 아니라 여러 가지 장치들이 서로 연결되어 정보를 공유하고 소통하는 구조를 말한다. 네트워크는 크게 두 가지로 나눌 수 있다. 첫번째는 국소적인 범위 안에서 사용되는 로컬 네트워크(LAN)이고, 다른 하나는 더 넓은 범위를 아우를 수 있는 와이드 네트워크(WAN)다.

인터넷은 와이드 네트워크의 하나다. 인터넷은 수많은 로컬 네트워크들이 상호 연결되어 만들어진 광범위한 네트워크다. 우리가 일상에서 웹사이트를 방문하거나 이메일을 보내는 행위 모두가 이 인터넷을 통해 이루어진다.

## http란

http는 HyperText Transfer Protocol의 약자로 클라이언트와 서버가 데이터를 주고 받게 해주는 통신규칙이라고 할 수 있다.
여기서 말하는 데이터에는 이미지, 음성, JSON, html 등 다양한 형태가 될 수 있다. 단순히 클라이언트와 서버간의 통신뿐만 아니라 서버와 서버의 통신간에도 http가 사용된다.
이러한 http는 0.9, 1.0, 1.1, 2, 3으로 다양한 버전이 존재하지만 가장 우리가 많이 사용하는건 1.1버전이다. 2버전은 단순 성능을 개선한 버전이고 3버전은 기존의 TCP대신 UDP를 사용한 버전이다.
http는 상태를 유지하지 않는다는(stateless) 특징이 있다. stateless는 서버가 클라리언트의 상태를 보존하지 않아 서버의 확장성이 높다는 장점이 있다.

## http메서드

- **GET**: 서버에서 리소스를 조회할 때 사용된다. 이 메소드는 서버에 데이터를 변경하지 않으므로 안전하다. 전달하고 싶은 데이터는 URL의 쿼리 스트링을 통해 서버에 전달된다. 예를 들어, 특정 사용자의 정보를 얻기 위해 사용될 수 있다.
- **POST**: 데이터를 서버에 전송하여 새로운 리소스를 생성하거나 기존 리소스를 처리할 때 사용된다. 메시지 바디를 통해 데이터를 전송하며, 다양한 유형의 데이터를 처리할 수 있다. 특히, 다른 메소드로 처리하기 어려운 경우에도 POST를 사용하여 요청을 처리할 수 있다. 예를 들어, 새로운 게시물을 생성하거나, 복잡한 데이터를 처리하는 데 사용된다.
- **PUT**: 지정된 URI에 리소스가 없으면 새로운 리소스를 생성하고, 이미 리소스가 있다면 그것을 완전히 대체한다. 이는 기존의 데이터를 완전히 덮어쓰는 기능을 가진다. 클라이언트가 리소스의 위치를 정확히 알고 있어야 하며, URI를 통해 리소스를 식별한다.
- **PATCH**: 기존 리소스의 일부만을 수정할 때 사용된다. PUT과 달리 리소스의 전체를 대체하지 않고, 변경하고 싶은 부분만을 업데이트한다. 예를 들어, 사용자 프로필의 특정 정보만을 변경하는 데 사용될 수 있다.
- **DELETE**: 지정된 URI의 리소스를 제거한다. 이 메소드를 사용하여 데이터베이스에서 특정 항목을 삭제하거나, 파일 시스템에서 파일을 삭제하는 등의 작업을 수행할 수 있다.

이 외에도 HEAD, OPTIONS, CONNECT, TRACW와 같은 메서드가 존재한다.

## http 상태코드

- **1xx (정보 응답)**: 이 범위의 상태 코드는 요청이 수신되어 처리 중임을 나타낸다. 서버는 클라이언트에게 요청이 정상적으로 받아들여져 처리되고 있다는 신호를 보내는데 사용한다. 예를 들어, **`100 Continue`**는 클라이언트가 요청의 나머지 부분을 계속 보낼 수 있음을 알린다.
- **2xx (성공)**: 요청이 성공적으로 수신, 이해 및 수락되었음을 나타낸다. 예를 들어, **`200 OK`**는 요청이 성공적으로 처리되었음을, **`201 Created`**는 새 리소스가 성공적으로 생성되었음을 의미한다.
- **3xx (리다이렉션)**: 이 상태 코드는 요청을 완료하기 위해 추가적인 조치가 필요함을 나타낸다. 클라이언트는 일반적으로 이 응답을 받으면 지정된 다른 위치로 자동으로 요청을 보낸다. 예를 들어, **`301 Moved Permanently`**는 리소스가 영구적으로 새 위치로 이동했음을, **`302 Found`**는 임시 리다이렉션을 나타낸다.
- **4xx (클라이언트 오류)**: 이 상태 코드는 클라이언트의 요청에 오류가 있어 서버가 요청을 처리할 수 없음을 나타낸다. 예를 들어, **`400 Bad Request`**는 서버가 요청을 이해할 수 없음을, **`404 Not Found`**는 요청한 리소스를 찾을 수 없음을 의미한다.
- **5xx (서버 오류)**: 이 상태 코드는 서버가 유효한 요청을 처리하는 데 실패했음을 나타낸다. 클라이언트는 올바른 요청을 했지만 서버 측의 문제로 인해 처리할 수 없다. 예를 들어, **`500 Internal Server Error`**는 서버 내부 오류가 발생했음을, **`503 Service Unavailable`**는 서비스가 일시적으로 사용 불가능함을 나타낸다.

## http 헤더

HTTP 헤더는 클라이언트와 서버 사이의 웹 통신에서 중요한 역할을 한다. 헤더는 요청과 응답 메시지에 포함되어 추가적인 정보들을 제공해준다. 각각의 헤더는 키-값 쌍으로 이루어져 있고, 사용 목적에 따라 다양하게 분류된다.

일반 헤더는 요청과 응답 양쪽에서 사용되며, 전체 메시지의 특성을 정의한다. 예를 들어, **`Cache-Control`**은 캐싱 정책을 설정하고, **`Connection`**은 연결 관리를 담당한다.

요청 헤더는 클라이언트가 서버로 보내는 요청의 세부 사항을 설명하며, 클라이언트의 선호, 클라이언트 정보 등을 서버에 전달한다. **`User-Agent`**, **`Accept`**, **`Host`** 같은 헤더가 여기에 속한다.

응답 헤더는 서버가 클라이언트로 보내는 응답의 세부 사항을 담당하며, 서버 정보나 리소스의 특성을 클라이언트에게 알린다. **`Server`**, **`Set-Cookie`**, **`Content-Type`** 등이 이에 해당한다.

엔터티 헤더는 과거에 요청이나 응답의 본문에 관한 정보를 제공했으나, HTTP/2 이후로 표현 헤더로 변경되었다. 이는 리소스의 상태를 나타내는 형식으로 사용되며, MIME 타입, 언어, 인코딩 정보를 포함할 수 있다.

이러한 헤더들은 통신의 효율성을 높이고, 적절한 콘텐츠 협상, 캐싱, 보안 등을 수행하는 데 중요한 역할을 한다. 각 헤더는 필요한 정보를 전달하는 데 초점을 맞추며, 전체 HTTP 통신을 효과적으로 관리한다.

## Rest Api

Rest api는 웹의 독립된 진화를 위해 개발된 Rest 아키텍쳐 스타일을 따르는 api다. Rest 아키텍쳐 스타일은 앞에서도 말했듯 웹의 독립된 진화를 위해 개발된 것으로 핵심 원칙에는 리소스를 URI로 식별하고 http메서드를 이용하여 리소스를 조작한다는 원칙이 있다. 이러한 아키텍쳐는 Client-Server, 무상태성, 캐싱, 계층화 시스템, 선택적 코드 on-demand 등의 스타일로 구성된다.

Rest Api의 의미는 위의 스타일을 모두 지키는 Api를 말하지만 오늘날 대부분의 Api가 Rest의 자기 기술적 메시지와 HATEOAS원칙을 잘 지키지 않는다. 이는 웹 페이지와 달리 웹 API는 종종 HTML대신 JSON을 사용하고 JSON은 자동으로 내부구조를 이해시키는데 한계가 있기 때문이다. 자동으로 내부 구조를 이해시킨다는 것은 아래와 같은 경우를 말한다.

```json
{
"id": 1,
"name": "KIM"
}
```

id와 name이 정확히 무엇인지 내부구조를 이해시킬 수 없다.(가능은 하지만 그 과정이 상당히 번거롭다.)

따라서 이러한 Rest의 제약조건을 완벽하게 준수하지 않더라도 각 리소스가 고유한 URI로 식별되고 클라이언트가 HTTP메서드와 메시지 본문을 통해 리소스를 CRUD할 수 있다는 조건만 준수한다면 일반적으로 Rest Api라고 칭한다.

결국 우리가 Rest Api에 대해서 알아야 할 부분은 일반적으로 불리는 Rest Api는 Rest를 완벽히 준수하는 것은 아니라는 사실과 Rest Api가 인터넷을 통해 데이터를 교환하기 위해 사용되는 것이고 이를 통해 웹 서비스를 개발할 때 효율적이고 유연하게 해준다는 것이다.