API : 프로그램들이 서로 소통하는 방식. api에는 다양한 종류가 있고, 그것을 이용해 클라이언트도 서버와 소통하게 되는 것이다.
HTTP : 이때, 프로그램들이 소통할 때 지켜줘야 할 약속이다. ex) 상황근무 서면서 전화받을 때 '통신보안!'을 일단 박고 본다.
이때 이 약속들의 종류 중 하나가 HTTP이고, HTTPS, FTP, SMTP 등등 다양한 종류들이 있다.
HTTP API의 디자인을 우리가 직접 해 줄 수 있으며, 그것을 위해 사용하는 주요 메서드들이 있다.
GET : 조회(Read)
POST : 추가(Create)
PUT 혹은, PATCH : 갱신(Update)
DELETE : 삭제(Delete)
HTTP는 무상 태성으로 작동한다. 즉, 상태를 저장하지 않는다. 만약 저장하고 싶으면 쿠키 등을 통해 하게 된다.
응답이 오면 HTTP 응답 상태 코드를 보여준다. 이것이 위의 고양이 그림이 된다. 주로 우리가 볼 수 있는 코드는 위의 4장의 고양이들이 알려줄 것이다.
200 : OK. 완료됐다. 다행이다.
403 : 서버에 요청은 했으나 권한이 없어 거절당했다. 고양이는 모레에서 볼일을 보는 것이 옳다.
404 : 서버가 요청받은 리소스를 찾을 수 가 없다. 고양이는 자기가 안 보이면 아무도 못 찾는 줄 안다. 귀엽다.
500 : 서버가 뭔가 예상하지 못 한 상황이다. 저 다급한 손가락을 보라.
2. HTTP messages
클라이먼트와 서버는 HTTP messages의 양식에 맞게 알아서 소통하게 된다.
HTTP messages는 이렇게 생겼다. 요청할때와 응답할 때 거의 같은 구조이다.
start line : 첫번째 줄이다. 요청하는 상태를 보여준다. 응답 시에는 status line이라고 한다. 주소창에서 보면 '?' 뒤에 문자열 즉, 경로가 붙는다.
HTTP headers : 요청을 지정하거나 본문 내용의 설명이 적혀있다.
empty line : 그냥 빈 줄이다. 구분선으로 생각하면 된다.
body : 내용이다. 요청과 응답에 따라 알아서 사용한다.
3. AJAX
Asynchronous Javascript And XML을 줄여 놓은 것이다.
과거에 사용하던 방식은 서버에 배포되어 있던 HTML 문서를 클라이언트가 받아와서 사용했다. 그래서 무언가 바뀔 때마다, 다시 모든 HTML 문서를 다시 받아와야 했다. 그러한 끊김은 사용자로 하여금 좋은 경험이 될 리가 없다. (the very frist web page를 생각해 보자)
그래서, 이제 서버에서 필요한 데이터만 가져오기로 했다. 이 기술을 'XMLHttpRequest'라고 하며(fetch라고도 할 수 있다), 작동 방식은 JSON과 같은 포맷으로 필요한 데이터를 자바스크립트를 이용해, 동적으로 HTML 문서로 바꿔 사용하게 되었다.
이것이 공식적으로 'AJAX'라는 이름으로 사용하게 된 것이다!
이것은 SPA(Single Page Application)의 기초가 되었다는 것이다!
4. IP 주소
IP주소 : 컴퓨터가 가지고 있는 주소이다. 주소라고 부르는 이유도 진짜 '주소'이기 때문이다.
훈련병 때 자주 썼던 편지를 생각해 보자. 군대에 가기 전에 훈련소 주소와 교번이 나오면 우리의 주소를 정확이 페이스북, 인스타에 공지하고, 받을 사람 주소도 정확하게 적어서 일단 입대한다. 그래야 편지를 주고받을 수 있다.
이처럼 나의 ip주소, 통신할 대상의 ip주소를 알아야 통신을 하게 되는 것이다.
5. IP주소는 어디서 오나요?
우리가 네트워크에 접속될 때, 그때 AP(Access Point)가 컴퓨터에게 IP주소를 할당해 준다.
그러므로, 연결된 네트워크가 많으면? IP주소도 많아진다. 물론, 정상적인 상황에는 네트워크를 두 개씩 연결할 일이 없다.
하지만 항상 정해저 있는 IP주소도 있다.
127.0.0.1 : 지금 사용 중인 로컬 PC
0.0.0.0 혹은, 255.255.255.255 : 지금 로컬 네트워크에 접속된 모든 장치와 소통할 수 있는 주소
6. PORT
통신하고 싶은 컴퓨터의 IP주소로 찾아가면, 포트 번호를 통해 그 찾아온 주소의 컴퓨터에 돌아가고 있는 서비스에 접근할 수 있도록 할당해 준다.
이미 사용 중인 포트는 중복으로 사용할 수 없다. 서비스 종류에 따라 포트를 나눠줘야 하기 때문이다.
통신 규약에 따라 정해진 포트 번호들이 있고 우리가 주로 사용하는 포트 번호만 따로 알고 있으면 된다.
22 : SSH
80 : HTTP
443 : HTTPS
3000 : 임시 포트
7. URL & URI
URL
Uniform Resource Locator을 줄여놓은 것이다.
이는 네트워크에서 저장된 이미지나, 동영상 등이 존재하는 파일의 경로의 위치를 말한다.
scheme://host [port][/path]의 형태로 만들어져 있다.
scheme : 프로토콜을 적어 주면 된다. (http, https 같은 거)
host [:port] : ip주소를 호스트에 적게 될 것이다. 하지만 DNS 서버가 자동으로 도메인으로 ip주소를 바꿔준다. 그래서 우리는 ip주소를 따로 입력하지 않고, naver.com 같은 것만 적어도 알아서 접속이 되는 것이다. 마찬가지로, port번호도 알아서 생략해서 생각한다. 물론, 적어줘도 똑같이 접속된다.
[/path] : 파일의 경로가 된다. ex) /dataninfo/hero/detail.php처럼 적혀있다. 이때, 'dataninfo폴더 안에, hero폴더 안에, detail.php라는 파일이 있을 것이다'라는 추측이 가능하다.
URI
Uniform Resource Identifier을 줄여놓은 것이다.
서버가 주는 환경에서 파일을 나타내는 주소가 된다.
우리가 보고 있는 그 위에 그 주소가 맞다.
URL보다 조금 더 나아간 형태이다. 추가적으로 전달해 주는 데이터가 더 적혀 있다.
scheme://host [port][/path][? query]의 형태로 만들어져 있다.
[? query] : 내가 전달하는 데이터. 대부분 숫자 같은 형태로 되어 있다. 사용자로부터 어떠한 정보를 전달받아 앞에서 보았던 포트를 통해 전달되어 우리는 서비스를 사용할 수 있다.
8. CSR & SSR
CSR(Client Side Rendering)
클라이언트가 모든 일을 맡아서 한다.
어떠한 주소에 접속할 때, 서버에서 HTML 파일을 받아오게 된다.
이때, 이 HTML 파일은 내용은 텅 비어 있고, 애플리케이션의 구동에 필요한 자바스크립트 링크만 연결된 상태로 오게 된다.
덕분에 처음에 접속하면 텅 빈 화면만 나온다.
이후에 서버에서 자바스크립트에 필요한 프레임워크와 소스코드를 포함한 자바스크립트 파일을 주게 된다.
또 그 이후에 추가로 필요한 데이터까지 받아 오면 이것들을 사용해 유저에게 최종적으로 애플리케이션을 보여주게 된다.
단점 1 : 첫 화면 로딩이 길다. 받아와야 할 데이터가 꽤 되기 때문
단점 2 : 검색에 문제가 생긴다. HTML 파일을 읽어서 검색에 노출시키는데 정작 HTML 파일은 비어있기 때문이다.
SSR(Server Side Rendering)
서버에서 필요한 데이터를 가져와 HTML 파일을 만들어서 동적인 동작이 가능한 소스코드와 함께 클라이언트에게 보내준다.
클라이언트는 바로 쓰면 된다!
장점 1 : CSR과는 다르게 로딩은 당연히 빠르다. 그저 받아서 쓰면 되기 때문이다.
장점 2 : CSR보다 검색 효율도 좋다. HTML 파일에 내용이 있기 때문이다!
단점 1 : 전체 웹사이트를 받아 와야 하기 때문에 역시 끊김이 있다.
단점 2 : 서버가 힘들어한다. 서버가 하는 일이 많기 때문이다.
단점 3 : 만약, 용량이 큰 자바스크립트 파일을 아직 다운로드하지 못한 경우, 페이지를 볼 수는 있으나, 반응이 없는 상황이 생길 수 있다.
그냥 보면 헷갈릴 수 있다. 하지만 우리에게는 예시가 있다. 바로 지금 당신의 주소창을 보라! 광명을 찾을 수 있을 것이다. 그 주소창을 보면서 천천히 포스팅을 읽으면 될 것 같다! 위의 고양이 사진이 더 가지고 싶다면 아래의 링크로 가면 된다.
위의 예시에서 then은 기능이 올바르게 작동한다면 나오게 될 기능을 하게 된다. 이때, value는 우리가 promise에서 resolve라는 콜백 함수로 전달한 값인 'name'이 전달되게 된다.
만약 문제가 생긴다면? reject로 준 Error가 발생한다.
문제가 발생해서 reject 콜백 함수가 사용되면, then이 promise를 다시 불러오게 되고, 그 불러온 promise에 catch를 다시 등록시키게 된다. 그러면 에러가 발생했을 때, 그것을 다시 잡아와 catch안에서 사용하게 된다. 이를 '체이닝'이라고 한다.
finally는 가장 마지막에 에러가 발생하든, 올바르게 실행되든 상관없이 실행된다.
4. fs.readFile()
비동기적으로 파일을 읽어 온다는 의미이다.
fs.readFile('읽어올 파일의 경로', 'utf8(옵션, 대부분 utf8)', (err, data) => {
if(err) {
throw err; // 문제가 있다면 err를 던진다!
}
console.log(data); // 문제가 없다면 콘솔에 data를 입력한다.
})
파일의 불러올 방식으로는 주로, 'utf8'이 사용된다. 사람이 읽을 수 있는 언어로 만들어주는 느낌이다.
콜백 함수에서 err가 발생하지 않으면 자동으로 null이 되며, data에 내용이 전달된다.