컴파일 - 사용자가 작성한 코드를 컴퓨터 언어로 번역하는 과정
빌드 - 컴파일된 코드를 실제 실행할 수 있는 상태로 만드는 과정
빌드가 완성된 실행 가능한 파일을 다른 사용자가 접근할 수 있는 환경에 배치하는 것을 배포라고 한다.
컴퓨터 종료 시, 서버가 꺼지기 때문에 yarn start:dev 명령어가 24시간 실행되고 있는( 클라우드 ) 컴퓨터에서 배포를 진행하게 된다.
HTTP
로 요청했을 때에는 pcap 내 로그인한 유저의 정보(이메일, 패스워드)가 그대로 들어와서 확인을 할 수 있기 때문에 해킹의 위험이 존재한다.HTTPS
로 요청했을 때에는 암호화가 되어 전달이 되기 때문에 pcap을 확인해 보아도 암호화된 문자열만 나타나지 해당 유저의 정보를 볼 수 없다.네트워크 간의 통신을 모니터링 해주는 도구로 오픈 소스 패킷 분석 프로그램이다.
데이터를 주고 받을 때 데이터가 담긴 pcap(Packet Capture)이 존재하는데, 이 pcap을 확인하는 도구다.
와이어 샤크를 이용하여 해당 API가 방화벽 단에서 막혀있는지, API와 연결은 이루어지는데 API 내부에서 처리가 늦는 것인지 원인을 확인할 수 있습니다.
▶ 3-Way-Handshake
SYN(synchronize) - 클라이언트는 서버에게 접속을 요청하는 SYN 패킷을 보낸다.
SYN - ACK - 서버는 SYN 요청을 받고 클라이언트에게 요청을 수락한다는 응답을 보낸다.
ACK(acknowledgement) - 클라이언트는 서버에게 SYN-ACK를 잘 받았다고 ACK 패킷을 보낸다.
이후, 연결이 이루어지고 API 요청을 통해 데이터가 오가게 되는 것이다.
▶ 4-Way-Handshake
4-Way-Handshake
는 데이터 송-수신이 완료된 후, TCP의 연결을 해제하는 과정이다.이후, 연결이 종료됩니다.
@Get('/qqq1')
getHello1(): string {
let sum = 0;
for (let i = 0; i <= 9000000000; i++) {
sum += i;
}
return '철수 성공!!';
}
@Get('/qqq2')
getHello2(): string {
return '영희 성공!!';
}
위와 같은 코드가 있을 때,
/qqq1 API
함수는 - 발생되는 트래픽이 많아지게 되므로, cpu를 많이 사용하게 된다. ( = cpu-intensive )
/qqq2 API
: 일반 함수 입니다.
/qqq1 API
(시간이 오래 걸리는 함수)를 요청하게 된다면 해당 함수가 종료될 때 까지(계산이 완료될 때까지) /qqq2 API
요청에 대한 응답도 이루어지지 않는 것을 확인할 수 있다.
/qqq1 API
의 계산이 완료되면/qqq1 API
와 /qqq2 API
에 대한 응답이 이루어지는 것을 확인할 수 있다.
이러한 상황이 발생되는 이유는 자바스크립트가 한 번에 하나의 태스크만 실행할 수 있는 싱글스레드 기반으로 이루어져 있기 때문이다.
먼저 요청이 발생된 API 1에 대한 응답이 완료되기 전에, API 2의 다른 요청이 발생하게 된다면, 앞서 발생된 API 1 실행이 완료될 때 까지 API 2의 실행은 이루어지지 않는다.
현재 실행 중인 태스크가 종료될 때까지 다음에 실행될 태스크가 실행되지 않고 block 상태가 되는 것을 동기 처리 라고 한다.
동기 처리 방식은 태스크를 순서대로 실행하기에 실행 순서가 보장되지만, 동시에 여러 요청을 받을 수 없는 문제가 발생하게 된다.
만약 복잡한 계산 등이 이루어져야 하는 API가 필수적으로 있어야 되는 상황이라면, 어떻게 처리해야 되는지 알아보기 위해서 이벤트 루프에 대해 알아보겠습니다.
비동기 처리 방식
이 존재한다.const onClickLoop = () => {
console.log("시작!!!");
setTimeout(() => {
console.log("0초 뒤에 실행된다!!!");
}, 0);
let sum = 0;
for (let i = 0; i <= 9000000000; i++) {
sum += i;
}
console.log("끝!!!");
};
시작!!! → 0초 뒤에 실행된다!!! → 끝!!!
으로 나올 것으로 예상된다.사진 5
하지만 실행을 해보면 위와 같은 결과가 나오는 것을 확인할 수 있다.
이렇게 순서가 다르게 발생된 이유는 이벤트 루프에 대한 개념이 필요하다.
▶ 스택(Stack)
▶ 큐(Queue)
console.log(”시작!!!”)
실행이 이루어 진 뒤,setTimeout
함수가 실행된다.콜백함수(conosle.log(”0초 뒤에 실행된다!!!”))
와 타이머
는 브라우저의 web API로 보내진다.4-2. 콜 스택에서는 console.log(”끝!!!”)
실행이 이루어진다.
console.log(”끝!!!”)
실행이 완료되면, 이벤트 루프
가 태스크 큐에서 대기 중인 콜백 함수를 콜 스택으로 보내게 된다.conosle.log(”0초 뒤에 실행될 거예요!!!”)
가 나타나게 된다.이벤트 루프는 콜 스택에 현재 실행 중인 함수가 있는지, 태스크 큐에 대기 중인 함수가 있는지 반복해서 확인한다.
만약, 콜 스택이 비어 있고 태스크 큐에 대기 중인 함수가 존재한다면, 이벤트 루프는 FIFO 방식으로 태스크 큐에 대기 중인 함수를 콜 스택으로 이동시킨다.
싱글 스레드
, 이벤트루프스레드
, 싱글이벤트루프스레드
는 다 같은 말이다.
자바스크립트 엔진은 싱글 스레드 기반이기에 한 번에 하나의 함수만 처리한다.
그렇기 때문에 setTimeout 이나 API 요청 등을 제외한 어쩔수 없이 오래 걸리는 일들(복잡한 계산식이 들어간 for문 등)을 콜 스택에서 처리하는 문제가 발생할 때도 있다.
그러면 당연히 자바스크립트 엔진으로 다른 요청이 들어온다면 앞 요청이 끝날때 까지 실행되지 못하게 된다.
이게 바로 싱글 스레드의 문제점이다.
따라서, 이러한 복잡한 계산식이 들어간 for문 같은 함수들은 멀티 스레드 방식의 다른 서버를 만들어서 해당 서버로 보내 계산이 이루어지게 로직을 구성한다면 효율적인 처리가 가능해진다.
만약 자바스크립트 엔진에서 무조건 처리가 되어야 한다면
자바스크립트 내에 존재하는 워커 스레드를 생성하여 일을 나누어 처리할 수도 있다.
출처 : 코드캠프