# 5/12 면접 스터디 ## 임태현 ### Cors https://hackmd.io/5wMLQhV7Q-WmK1k59NgsBA ### Redis --- ## 최지수 ### 해시 Hash 해시 함수란 데이터의 효율적 관리를 목적으로 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. 매핑 전 데이터 값을 key, 매핑 후 데이터 값을 hash value라 하고, 매핑하는 과정을 해싱이라고 한다. ### 해시 테이블 key에 결과 값 value를 저장하는 자료구조이다. 적은 리소스로 많은 데이터를 효율적으로 관리하기 위해 사용한다. index에 해시값(key)을 사용하면서 삽입, 삭제, 탐색을 O(1) 시간 복잡도에 완료할 수 있다. 또한 다양한 길이의 key 값을 일정한 길이를 가지는 해시 값으로 변경하여 저장소를 효율적으로 운영할 수 있다. **단점** - 순서가 있는 배열에는 어울리지 않는다. - 데이터가 저장되기 전에 미리 저장공간을 확보해야 한다. ### 충돌 같은 hash(key)값을 가지게 되면 충돌이 발생한다. 1. Chaining 동일한 hash값을 가지는 value를 연결리스트를 이용해 체인처럼 엮는 방법이다. **시간 복잡도** 같은 해시 값에 저장된 자료의 개수(a)의 시간 복잡도를 가진다. O(a) 최악의 경우는 하나의 해시에 모든 자료가 연결되어 있는 경우로 O(N)의 시간 복잡도를 가진다. **장점** 한정된 저장소를 효율적으로 사용할 수 있다. 미리 공간을 잡아 놓을 필요가 없다. **단점** 한 hash에 자료들이 계속 연결되면 검색 효율이 떨어진다. 외부 저장 공간을 사용해야 한다. 2. Open Addressing 개방주소법 비어있는 버킷에 데이터를 저장하는 방법이다. 저장소가 어느정도 채워졌을 때, 저장소의 사이즈를 늘려주면서 비어있는 공간을 확보하는 것이 중요하다. **시간 복잡도** 저장 공간에 데이터가 어느정도 들어있는지에 따라 달라진다. 최선의 경우 O(1), 최악의 경우 O(N)이다. **장점** 또 다른 저장공간 없이 해시테이블 내에서 처리가 가능하다. **단점** 비어있는 공간을 확보해 놔야 한다. 비어있는 공간을 찾는 알고리즘 성능에 따라 해시테이블 성능이 바뀐다. ### 이진트리 자식 노드가 최대 2개인 트리 **순회 방법** - preorder : 루트 - 왼쪽 - 오른쪽 - inorder : 왼쪽 - 루트 - 오른쪽 - postorder : 왼쪽 - 오른쪽 - 루트 배열로 구현 한다면 자식의 인덱스는 /2, 부모의 인덱스는 *2 이다. **어디에서 사용될까?** 1. 효율적인 검색과 정렬을 위해 사용된다. 이진 탐색 트리와 이진 힙 구현에 사용한다. 이진 탐색 트리에서 탐색의 시간 복잡도는 logN이다. 2. 데이터를 분기 구조로 표현할 때 사용한다. ### 해시트리(머클트리) 데이터의 간편하고 확실한 인증을 위해 사용한다. 아래의 노드들을 해싱하면서 합쳐서 부모 노드를 만들어 가면서 루트 노드인 하나의 데이터로 만들어 주는 것이다. 루트 노드의 해시 값을 알면 데이터가 바꼈는지 검증할 수 있다. 여러 블록으로 나뉜 데이터를 전송할 때 데이터가 변조되지 않았음을 보장하는 용도로 사용된다. 블록체인에서 주로 사용 --- ## 문예지 ### Stateful vs Stateless > 내가 생각하고 있던 stateful 과 stateless > - stateful: client의 상태를 서버가 저장 - stateless: client 상태를 서버가 저장하지않음 - 이렇게 생각하면서 헷갈렸던 점 TCP는 stateful한 protocol이라 하는데 TCP가..저장..뭐를..? 이란 생각 + stateful한 tcp 위에서 동작하는 http도 그럼 stateful한 거 아냐?? 왜 http는 stateless야?? > 왜 TCP는 Stateful? > Stateful '구조'는 Server와 Client간 세션의 '상태'에 기반하여 Client에 response를 보냄 이를 위해 세션 '상태'를 포함한 Client와의 세션 정보를 server에 저장 - TCP는 세션 '상태'에 따라 Server의 응답이 달라지는 Stateful 프로토콜 - 3-way handshaking 과정 - Server와 Client는 3-way handshaking 과정에서 SYN과 SYN/ACK을 주고 받음 - 양단간 세션 '상태'를 established한 '상태'로 - 세션 '상태'가 established가 되면 client와 server는 데이터를 주고 받을 수 있음 - TCP의 데이터 전송과정 - 서버는 window-size, sequence number 등을 저장 - 해당 크기의 데이터가 모두 수신 될 때까지 client와의 세션을 유지 > 정리 > stateful한 서비스의 특징: 1. 세션 정보를 server에 저장 2. 세션 'State(상태)'에 따른 응답 TCP는 client와의 세션 정보를 server에 저장하고, 세션 상태에 기반한 server의 응답이 달라진다는 점에서 stateful </br> > 왜 HTTP는 Stateless? > Stateless '구조'는 server의 응답이 client와의 세션 '상태'와 독립적이고 server는 단순히 요청이 오면 응답을 보내는 역할만 수행하며, 세션 관리 책임은 client에게 client와의 세션 정보를 기억할 필요가 없음 :arrow_right: 서버에 저장하지 않음 :arrow_right: 필요에 따라 외부 DB에 저장 > 정리 > Http는 각 통신이 독립적(전에 전송한 내용에 대해 알 수 없음)이므로 stateless 모든 통신에 대해 클라이언트 측에서 충분한 정보를 제공해줘야함 > 최근 웹서비스들이 stateless 구조인 이유? > Scaling이 자유로움 if. 트래픽의 급증으로 서버가 scale out **Stateful** client의 세션 정보가 새로 scale out된 서버에 저장 안됌 :arrow_right: 세션 정보를 옮겨주는 등의 부수적인 관리가 요구 **Stateless** server는 client 세션 관리를 하지 않음!! *내가 생각한 장점..여러분의 생각은??* ### REST > What is REST? > HTTP URI를 통해 자원(Resource)을 명시하고, HTTP Method를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것 > REST 특징 > 1. Self-descriptive: 메세지만 보고 해석할 수 있어야한다 2. HATEOAS: 하이퍼링크를 통한 상태 이동(전이)이 일어나야한다 ![](https://i.imgur.com/UNyuzs8.png) 3. Uniform Interface: HTTP 표준만 따른다면 어떤 언어 혹은 어떤 플랫폼에서 사용하여도 사용이 가능한 인터페이스 스타일 4. Stateless 5. Cacheable: HTTP의 기존 웹 표준을 그대로 사용하기 때문에 HTTP가 가진 캐싱 기능 적용 가능 6. Client-Server: Rest 서버는 API 제공을 하고 클라이언트는 사용자 인증에 관련된 일들을 직접 관리 7. Layered System : 클라이언트는 서버에 직접 연결되었는지 미들웨어에 연결되었는지 알 필요가 없음 > 내가 만든 REST API는 진짜 REST 한가?? > ``` GET /todos HTTP/1.1 Host: example.org HTTP/1.1 200 OK Content-Type: application/json [ {"id": 1, "title": "회사 가기"}, {"id": 2, "title": "집에 가기"} ] ``` 1. self-descriptive: 문서가 없으면 id가 무슨 의미인지 title이 무슨 의미인지 알 수 없음 :arrow_right: api 문서가 작성되는 이유 2. HATEOAS: 다음 상태로 전이할 링크가 없음 내가 만든건 저 두가지가 문제 > 문제 해결하기 > 해더랑 data 활용 ``` GET /todos HTTP/1.1 Host: example.org HTTP/1.1 200 OK Content-Type: application/json Link: <https://example.org/docs/todos>; rel="profile", </todos/>; rel="collection" Location: /todos/1 { "links": { "todo": "https://example.org/todos/{id}" }, "data": [{ "id": 1, "title": "회사 가기" }, { "id": 2, "title": "집에 가기" }] ] ```