리소스를 제공하는 곳(서버)과 리소스를 사용하는 앱(클라이언트)을 분리시킨 것
기존 2티어 아키텍처에 데이터베이스가 추가된 형태
tistory - [Web] 웹 애플리케이션 아키텍처 개념 정리 및 구현, 기술
github - 신입 웹 개발자일 때 알았더라면 좋았을 기본 웹 아키텍처 개념
클라이언트와 서버가 서로 데이터를 주고받기 위해 HTTP라는 프로토콜을 사용
API: Application Programming Interface
서버는 클라이언트에게 리소스를 잘 활용할 수 있도록 인터페이를 제공해야 함
Rest API
scheme, hosts, url-path로 구분할 수 있다.
URL의 기본 요소인 scheme, hosts, url-path에 더해 query, fragment를 포함
URI는 URL을 포함하는 상위개념
역할이 지정된 포트
IPv6의 등장
개인 PC의 보급으로 전 세계의 누구나 PC를 이용해 인터넷에 접속하고, 각종 서비스를 위해 서버를 생산하면서 IPv4로 할당할 수 있는 PC가 한계를 넘어서게 되었고, IPv6는 표기법을 달리 책정하여 2^(128)개의 IP 주소를 표현
IP 주소가 가리키는 PC에 접속할 수 있는 통로(채널)를 의미
포트 번호는 0~ 65535까지 사용할 수 있으며, 그중에서 0 ~ 1024번까지의 포트 번호는 주요 통신을 위한 규약에 따라 이미 정해져 있음
웹 브라우저를 통해 특정 사이트에 진입을 할 때, IP 주소를 대신하여 사용하는 주소
참고) nslookup: 터미널에서 도메인 이름을 통해 IP 주소를 확인하는 명령어
DNS는 호스트의 도메인 이름을 IP 주소로 변환하거나 반대의 경우를 수행할 수 있도록 개발된 데이터베이스 시스템
요청(Requests), 응답(Responses)의 구조
HTTP의 큰 특징이며, HTTP로 클라이언트와 서버가 통신을 주고받는 과정에서, HTTP가 클라이언트나 서버의 상태를 확인하지 않는다는 의미
필요에 따라 다른 방법(쿠키-세션, API 등)을 통해 상태를 확인할 수 있다.
POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
CONNECT developer.mozilla.org:80 HTTP/1.1
OPTIONS * HTTP/1.1
요청의 본문은 HTTP messages 구조의 마지막에 위치
GET, HEAD, DELETE, OPTIONS처럼 서버에 리소스를 요청하는 경우에는 본문이 필요하지 않으며, POST나 PUT과 같은 일부 요청은 데이터를 업데이트하기 위해 사용
HTTP/1.1 404 Not Found
201, 204와 같은 상태 코드를 가지는 응답에는 본문이 필요하지 않으며, status와 서버에서 내려주는 데이터를 포함함
JavaScript, DOM, Fetch, XMLHttpRequest, HTML 등의 다양한 기술을 사용하는 웹 개발 기법
가장 큰 특징: 웹 페이지에 필요한 부분에 필요한 데이터만 비동기적으로 받아와 화면에 그려낼 수 있다는 것
JavaScript와 DOM, 그리고 Fetch
전통적인 웹 애플리케이션에서는 <form>
태그를 이용해 서버에 데이터를 전송하고 서버는 요청에 대한 응답으로 새로운 웹 페이지를 제공한다.
즉, 클라이언트에서 요청을 보내면 매번 새로운 페이지로 이동해야 한다는 것이다.
그러나 Fetch를 통해 페이지를 이동하지 않아도 서버로부터 필요한 데이터를 받아올 수 있다.
즉, 브라우저는 Fetch가 서버에 요청을 보내고 응답을 받을 때까지 모든 동작을 멈추는 것이 아니라 계속해서 페이지를 사용할 수 있게 하는 비동기적인 방식을 사용한다.
또한 JavaScript에서 DOM을 사용해 조작할 수 있기 때문에, Fetch를 통해 전체 페이지가 아닌 필요한 데이터만 가져와 DOM에 적용시켜 새로운 페이지로 이동하지 않고 기존 페이지에서 필요한 부분만 변경할 수 있다.
// XMLHttpRequest를 사용
var xhr = new XMLHttpRequest();
xhr.open('get', 'http://52.78.213.9:3000/messages');
xhr.onreadystatechange = function(){
if(xhr.readyState !== 4) return;
// readyState 4: 완료
if(xhr.status === 200) {
// status 200: 성공
console.log(xhr.responseText); // 서버로부터 온 응답
} else {
console.log('에러: ' + xhr.status); // 요청 도중 에러 발생
}
}
xhr.send(); // 요청 전송