리소스가 존재하는 곳과 리소스를 사용하는 앱을 분리시킨 것을 2티어 아키텍처, 또는 클라이언트-서버 아키텍처
목표하는 대상에 대하여 그 구성과 동작 원리, 구성 요소 간의 관계 및 시스템 외부 환경과의 관계 등을 설명하는 설계도 혹은 청사진
웹 어플리케이션에서는 클라이언트와 서버가 HTTP라는 프로토콜로 대화를 하는데 이 때 주고 받는 메시지를 HTTP 메시지 라고 한다.
- HTTP 프로토콜 : 웹에서 HTML, JSON등의 정보를 주고받는 프로토콜
- HTTPS 프로토콜 : HTTP에서 보안이 강화된 프로토콜
이밖에도 더 많은 주요 프로토콜이 있지만 나중에 다루자.
HTTP API 디자인
인터넷에서 데이터를 요청 시 보통 HTTP 프로토콜을 사용하며 주소(URL, URI)를 통해 해당 API에 접근할 수 있다.
HTTP CRUD 요청 메서드
요청 메서드 조회 (Read) GET 추가 (Create) POST 갱신 (Update) PUT / PATCH 삭제 (Delete) DELETE
URL은 Uniform Resource Locator의 줄임말로, 네트워크 상에서 웹 페이지, 이미지, 동영상 등의 파일이 위치한 정보를 나타낸다.
scheme, hosts, url-path 로 구분한다.
URI는 Uniform Resource Identifier의 줄임말로, 일반적으로 URL의 기본 요소인 scheme, hosts, url-path에 더해 query, fragment를 포함한다
부분 | 명칭 | 설명 |
---|---|---|
file://, http://, https:// | scheme | 통신 프로토콜 |
127.0.0.1, www.google.com | hosts | 웹 페이지, 이미지, 동영상 등의 파일이 위치한 웹 서버, 도메인 또는 IP |
:80, :443, :3000 | port | 웹 서버에 접속하기 위한 통로 |
/search, /Users/username/Desktop | url-path | 웹 서버의 루트 디렉토리로부터 웹 페이지, 이미지, 동영상 등의 파일이 위치까지의 경로 |
q=JavaScript | query | 웹 서버에 전달하는 추가 질문 |
참고로 127.0.0.1 은 로컬 PC를 나타낸다.
IP는 Internet Protocol의 줄임말로, 인터넷상에서 사용하는 주소체계를 의미.
네트워크에 연결된 특정 PC의 주소를 나타내는 체계를 IP 주소라고 한다.
IPv4
4덩어리로 구성되어있다. 예시168.126.63.8
IPv4는 각 덩어리마다 0부터 255까지 나타낼 수 있으며 2^(32)인 약 43억 개의 IP 주소를 표현할 수 있다. 그중에서 몇 가지는 이미 용도가 정해져 있다.
- localhost, 127.0.0.1 : 현재 사용 중인 로컬 PC를 지칭.
- 0.0.0.0, 255.255.255.255 : broadcast address로 로컬 네트워크에 접속된 모든 장치와 소통하는 주소다. 서버에서 접근 가능 IP 주소를 broadcast address 로 지정하면, 모든 기기에서 서버에 접근할 수 있다.
개인 PC의 보급으로 전 세계의 누구나 PC를 이용해 인터넷에 접속하고, 각종 서비스를 위해 서버를 생산하면서 IPv4로 할당할 수 있는 PC가 한계를 넘어서게 되어서 IPv6가 나왔으며 2^(128)개의 IP 주소를 표현할 수 있게 되었다.
리액트를 실행했을 때에는 로컬 PC의 IP 주소로 접근하여, 3000번의 통로를 통해 리액트를 실행한다.
localhost:3000
이와 같은 형태일 텐데 만약 3000번 포트가 사용 중이라면 중복 사용이 안되므로 다른 포트로 열릴 것이다.
웹 브라우저를 통해 특정 사이트에 진입을 할 때, IP 주소를 대신하여 사용하는 주소
예) naver.com
을 입력하면 네이버의 IP 주소를 대신한다.
네트워크 상에 존재하는 모든 PC는 IP 주소가 있다.
DNS는 호스트의 도메인 이름을 IP 주소로 변환하거나 반대의 경우를 수행할 수 있도록 개발된 데이터베이스 시스템이다다.
만약 브라우저의 검색창에 naver.com을 입력한다면, 이 요청은 DNS에서 IP 주소(ex.125.209.222.142)를 찾습니다. 그리고 이 IP 주소에 해당하는 웹 서버로 요청을 전달하여 클라이언트와 서버가 통신할 수 있도록 한다.
요청(Requests), 응답(Responses) 두 종류가 있다.
구조
이 중 start line과 HTTP headers를 묶어 헤드(head)라고 하고,
payload는 body라고 이야기한다.
참고로 HTTP는 통신 규약일 뿐이므로, 상태를 저장하지 않는다.
HTTP로 클라이언트와 서버가 통신을 주고받는 과정에서, HTTP가 클라이언트나 서버의 상태를 확인하지 않는다.
즉, 상태를 가지지 않으며 Stateless(무상태성)는 HTTP의 특징이다.
AJAX는 Asynchronous JavaScript And XMLHttpRequest의 약자로, JavaScript, DOM, Fetch, XMLHttpRequest, HTML 등의 다양한 기술을 사용하는 웹 개발 기법이다.
특징은 웹 페이지에 필요한 부분에 필요한 데이터만 비동기적으로 받아와 화면에 그려낼 수 있다는 것이다. SPA가 가능하게 해주는 기술이다!
이전 웹 애플리케이션에서는 <form>
태그를 이용해 서버에 데이터를 전송하고
서버는 요청에 대한 응답으로 새로운 웹 페이지를 제공해 주었다.
즉, 클라이언트에서 요청을 보내면 매번 새로운 페이지로 이동해야 했다.
Fetch를 사용하면, 페이지를 이동하지 않아도 서버로부터 필요한 데이터를 받아올 수 있다.
Fetch는 사용자가 현재 페이지에서 작업을 하는 동안 서버와 통신할 수 있게 한다.
즉, 브라우저는 Fetch가 서버에 요청을 보내고 응답을 받을 때까지 모든 동작을 멈추는 것이 아니라 계속해서 페이지를 사용할 수 있게 하는 비동기적인 방식을 사용한다.
또한 JavaScript에서 DOM을 사용해 조작할 수 있기 때문에, Fetch를 통해 전체 페이지가 아닌 필요한 데이터만 가져와 DOM에 적용시켜 새로운 페이지로 이동하지 않고 기존 페이지에서 필요한 부분만 변경할 수 있다.
fetch('http://52.78.213.9:3000/messages')
.then (function(response) {
return response.json();
})
.then(function (json) {
...
});
서버에서 HTML을 완성하여 보내주지 않아도 웹페이지를 만들 수 있다.
표준화된 방법
유저 중심 애플리케이션 개발
더 작은 대역폭
Search Engine Optimization(SEO)에 불리
뒤로가기 버튼 문제
들어가기전 참고하세요. 내용 이해를 위한 포스트 입니다.
SSR은 Server Side Rendering의 줄임말로 웹 페이지를 서버에서 렌더링한다.
브라우저가 서버의 URI로 GET 요청을 보내면, 서버는 정해진 웹 페이지 파일을 브라우저로 전송하고 브라우저에 도착하면 완전히 렌더링이 된다.
웹 페이지의 내용에 데이터베이스의 데이터가 필요한 경우, 서버는 데이터베이스의 데이터를 불러온 다음, 웹 페이지를 완전히 렌더링 된 페이지로 변환한 후에 브라우저에 응답으로 보낸다.
브라우저가 다른 경로로 이동할 때마다 서버는 같은 작업을 다시 수행하게 된다.
즉, 일단 HTML 파일을 서버가 클라이언트에 주므로 빠른 화면의 렌더링이 가능하나,
Javascript 파일을 다운 받기 전까지 화면에 보이는 것을 조작 할 수 없을 수 있다.
CSR (Client Side Rendering)은 클라이언트에서 페이지를 렌더링한다.
브라우저의 요청을 서버로 보내면 서버는 웹 페이지를 렌더링하는 대신, 웹 페이지의 골격이 될 단일 페이지(Single Page)를 클라이언트에 보낸다.
이때 서버는 웹 페이지와 함께 JavaScript 파일을 보내는데 클라이언트가 웹 페이지를 받으면, 웹 페이지와 함께 전달된 JavaScript 파일은 브라우저의 웹 페이지를 완전히 렌더링 된 페이지로 바꾼다.
웹 페이지에 필요한 내용이 데이터베이스에 저장된 데이터인 경우
브라우저는 데이터베이스에 저장된 데이터를 가져와서 웹 페이지에 렌더링을 해야하는데 이때 Fetch와 같은 API가 사용된다.
마지막으로, 브라우저가 다른 경로로 이동하면 CSR에서는 SSR과 다르게, 서버가 웹 페이지를 다시 보내지 않는다.
브라우저는 브라우저가 요청한 경로에 따라 페이지를 다시 렌더링한다. 이때 보이는 웹 페이지의 파일은 맨 처음 서버로부터 전달받은 웹 페이지 파일과 동일한 파일이다.
즉, HTML과 Javascript 파일이 한번에 브라우저로 넘어오고 첫 로딩 속도가 느리다.