API (Application Programming Interface)
-> 프로그래밍 되어 있는 서버 애플리케이션과 의사소통 가능한 매개체
UI (User Interface)
-> 유저가 웹서비스를 사용하게 끔 의사소통 가능한 매개체
Interface
-> 사물 간 또는 사물과 인간간의 의사소통이 가능 하도록 만들어진 물리적, 가상적 매개체(접점)를 의미한다.
클라이언트는 서버에 http를 활용해서 리소스 요청과 응답
클라이언트 서버 프로토콜(웹브라우저)
서버는 Db에 리소스 저장 또는 클라이언트에 응답
브라우저의 기본 구조 :
사용자 인터페이스 : 주소 표시줄, 이전-다음 버튼, 북마크 메뉴 등. 요청한 페이지를 보여주는 창을 제외한 나머지 모든 부분
브라우저 엔진 : 사용자 인터페이스와 렌더링 엔진 사이의 동작을 제어
렌더링 엔진 : 요청한 콘텐츠를 표시. HTML을 요청하면 HTML과 CSS를 파싱하여 화면에 표시
통신 : HTTP 요청과 같은 네트워크 호출에 사용됨 (플랫폼 독립적 인터페이스)
UI 백엔드 : 콤보 박스와 창 같은 기본적인 장치를 그림.(OS사용자 인터페이스)
자바스크립트 해석기 : 자바스크립트 코드를 해석하고 실행
자료 저장소 : 자료를 저장하는 계층. 모든 종류의 자원을 하드 디스크에 저장.
- 서버는 일반적으로 클라이언트라고 불리는 사용자에게 서비스를 제공하는 소프트웨어 또는 하드웨어.
클라이언트의 요청을 받으면 리소스를 바탕으로 응답한다.
하드웨어 측면에서 보면, 웹 서버는 웹 서버 소프트웨어 및 웹 사이트 구성 요소 파일(HTML 문서, 이미지, CSS & Javascript 파일)을 저장하는 컴퓨터이다. 인터넷에 연결되어 있으며 웹에 연결된 다른 장치와의 물리적 데이터 교환을 지원한다.
소프트웨어 측면에서 보면, 웹 사용자가 최소한 HTTP 서버로 호스팅 된 파일에 액세스 하는 방법을 제어하는 여러 부분이 포함 되어 있다. HTTP 서버는 URL 및 HTTP를 이해하는 소프트웨어이다. 웹사이트 주소를 입력해서 접속하면 웹사이트의 데이터를 전달해준다.
Application Programming Interface
- 프로그래밍 되어 있는 소프트 웨어 프로그램(서버 애플리케이션)과 의사소통 가능한 매개체. 서버 자원을 잘 가져다 쓸 수 있게 만들어 놓은 Interface. 서버가 API를 제공해줘야 클라이언트가 데이터베이스에 있는 자료를 알게 되고 활용 할 수 있다.
예를 들어 :
Twitter API는 가장 최근 트윗을 웹페이지에서 보여주는 등, 사용자의 트위터 계정에서 정보를 반환하는데 씀
Web Animations API는 이미지를 여기저기 움직이거나 회전 시키는 등, 웹페이지의 일부를 움직이도록 하는데 씀
HyperText Transfer Protocol
- 클라이언트와 서버가 통신하기 위해 HTTP라는 규약 또는 규칙을 지켜서 통신을 한다.
1. 작동 방식 : 항상 요청과 응답으로 이루어 진다. 클라이언트가 메세지를 달라고 요청을 하면 서버가 메시지를 전달해준다. 없으면 없다고 응답을 준다.
서버가 요청에 대한 응답을 안주면 오류가 난다.
2. 구성 : HTTP 요청은 HEADER와 BODY로 나뉘어 진다.
Header는 어디서 보내는 요청인가(origin), 컨텐츠 타입은 무엇인가(content-type), 어떤 클라이언트를 이용해 보냈는가(user-agent)
헤더의 프로퍼티는 이름-값(Name-value) 쌍으로 설정되며 콜론으로 구분된텍스트다.
Body는 서버의 데이터를 보내기 위한 공간으로 활용. 각 method가 body를 가질 수도 안가질 수도 있다.
단일-리소스 본문(single-resource bodies): 헤더 두 개(Content-Type와 Content-Length)로 정의된 단일 파일로 구성된다.
다중-리소스 본문(multiple-resource bodies): 멀티파트 본문으로 구성되는 다중 리소스 본문에서는 파트마다 다른 정보를 지니게 된다. 보통 HTML 폼과 관련이 있다.
HTTP 응답도 HEADER와 BODY로 나뉘어 진다.
3. 속성 :
예를 들어: 클라이언트가 서버에게 '커피를 달라'고 해서 커피를 받았는데, 이후에 '어떻게 마셔야되?' 라는 다른 요청을 하면 서버는 무엇을 마시는 방법을 알고 싶은건지 요청에 명시가 안되어 있어서 뭔지 모른다.
stateless : 무상태성. HTTP의 각 요청은 모두 독립적이다. state라는 것이 없다. 서버는 클라이언트의 상태를 기억 못한다.
connectionless : 무연결성. HTTP는 한번의 요청에는 한번의 응답을 한다.
응답 이후에는 연결이 끊기기 때문에, 더이상 응답을 할 수 없다.
4. 상태 코드 :
Asynchronous Javascript And XML(EXtensible Markup Language)
- AJAX는 전체 페이지가 다시 로드 되지 않고 일부분만 업데이트하는 좀 더 복잡한 웹페이지를 만들 수 있게 해준다.
또한 AJAX를 사용하면 웹페이지 일부가 리로드 되는 동안에도 코드가 계속 실행되어 비동기식으로 작업할 수 있다.
단순한 웹페이지가 아닌 웹 어플이 등장(Javascript와 DOM 이용)
서버와 자유롭게 통신할 수 있고, 페이지 깜빡임 없이 seamless 하게 작동하는 (XMLHttpRequest(XHR) API 등장)
가독성이 떨어지고 복잡한 XMLHttpRequest API 를 보다 쓰기 쉽게하기 위해 JQuery가 나왔고 또 다시 쉽게 쓰기 위해 표준 API로 현재 fetch 라는 API가 등장.
- fetch function을 get 서버에서 자원을 가져오기 위해 쓴다.
비동기 네트워크 통신을 알기 쉽게 기술 할 수 있다.
fetch()로 부터 반환되는 Promise 객체는 HTTP error 상태를 reject하지 않는다. 대신 ok 상태가 false인 resolve가 반환되며, 네트워크 장애나 요청이 완료되지 못한 상태에는 reject가 반환된다.
기본적인 fetch 구문
fetch('http://example.com/movies.json')
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(JSON.stringify(myJson));
});
네트워크에서 JSON 파일을 가져와 콘솔에 인쇄. 간단한 fetch() 사용 흐름은 인수 한개(가져올 자원의 경로)를 가져오고 응답을 포함하는 약속(response 개체)를 반환 하는것.
response 객체로부터 자료를 가져오기 위해서는 json() 메서드를 사용해야 한다.
Cross Origin Resource Sharing, cross origin에서 리소스(서버자원)을 요청하여 사용한다.
same origin이 아니라 cross origin을 요청해야한다.
원래는 브라우저에서 크로스 도메인 요청은 기본적으로 제한 되어있다(보안상의 이유). 개발자들이 웹 애플리케이션 고도화를 위해 개선 요청. 결국엔 서버가 Allow한 범위 내에서 cross origin 요청 허용.
-> 모든 도메인(*)을 허용한다
-> 메소드는 GET, POST, PUT, DELETE, OPTIONS만 허용한다.
-> 헤더에는 content-type과 accept만 쓸 수 있다.
-> preflight request는 10초까지 허용 된다.
const defaultCorsHeaders = {
'access-control-allow-origin' : '*',
'access-control-allow-methods' : 'GET, POST, PUT, DELETE, OPTIONS',
'access-control-allow-headers' : 'content-type, accept',
'access-control-allow-max-age' : 10
};
Client가 POST 요청하기전 OPTIONS 메소드를 통해 서버에 물어본다.
서버에서 Allow하는 조건들을 다 맞추고 있는가?
(사전에 서버에 확인 하는 요청)
REpresentational State Transfer (표현 상태 전달)
웹 서비스를 만드는데 사용되는 제약(constraint) 모음
- 어떤 조건을 따르면서 API를 만들어보자는 전제
- (HTTP)Client-Server : 서버와 무관하게 클라이언트가 작성되어야 한다
- (HTTP)Stateless : 하나의 요청에 모든 정보를 다 알려줘야 한다 (ex. 서버는 앞뒤 문맥을 기억하지 못함)
- (HTTP)Cacheable : 특정 정보들을 미리 서버에 저장할 수 있게 해야 된다
- Uniform interface : 같은 스타일의 API 동일한 인터페이스로 만들어져
있어서 쉽게 알 수 있어야 한다- (HTTP)Layered system : 서버가 어떤 방식으로 구성되어 있고 어떤 방식으로 돌아가는지 클라이언트는 몰라도 된다
- (JavaScript)Code on demand : 자바스크립트 같은 코드를 내려줄 수 있어야 한다
유니폼 인터페이스 조건:
Identification of resources : 리소스를 식별할 수 있어야 한다
manipulation of resources through representation : 리소스를 표현에 의해서 조작할 수 있어야 한다
self-descriptive messages : 어떤 정보를 조작을 하기 위해 보내는 메세지에는 거기에 필요한 모든 정보가 들어 있어야 한다
HATEOAS: 링크가 있어야 한다
Express . 미들웨어 작성 필요