자바스크립트의  promise에 대해 이해해보자.

일반적으로 자바스크립트는 탑다운 방식으로 순차적으로 실행된다. A작업이 시작되면 A작업이 완료된 후 B작업이 시작되고  B작업이 마무리되면 그 다음 C작업이 시작된다. 하지만 Promise는 비동기적 방식으로 A promise가 완료되기 전에 B작업이 시작되고 이 후 언제 든 A promise가 완료되면 그 때 반환된다. 즉 main thread를 방해하지 않는 방식으로 작업이 수행되므로 사용자 입장에서는 훨씬 작업을 수월하게 이행할 수 있다.  

글로 설명하려 하니 좀 어려우니 코드로 살펴보자.

우선 lazyDiv라는 함수이다. 이는 n를 dn으로 나눈다. 나누긴 나누는데 lazy라는 이름 그대로 setTimeout function을 이용해서 1초 쉰 후 실행하도록 했다. 명심해야 할 것은 lazyDiv함수는 실행 1초 후에 Promise를 반환한다는 점이다.

function lazyDiv(n,dn) {
return new Promise((res, rej) => {
setTimeout(() => {
if (dn != 0) {
res(n / dn);
} else {
rej(new Error("Can't devide by 0"));
}
}, 1000);
});
}


자 그럼 이제 then 을 이용해 promise의 값을 얻어보자. 그리고 다른 작업들을 포함 시켜 어떤 순서로 수행되는지 확인해 보자.

lazyDiv(5,2).then((result)=>{console.log(result)}).catch((err)=>console.log(err.message)); //작업1
console.log("hi"); //작업2
console.log("async function is in progress");//작업3

먼저 작업 1로 lazyDiv promise를 수행하고 작업2로 hi 를 콘솔에 프린트한다. 그리고 작업3 를 콘솔에 프린트한다. 결과가 어떨까? 일반적인 스크립트 함수라면 lazyDiv가 1초 후 계산을 완료할 때까지 기다린 후 작업2 와 작업3를 수행하겠지만 promise의 경우는 좀 다르다. 수행하면 아래와 같은 결과가 나온다.

hi
async function is in progress
2.5

즉 1초동안 lazyDiv가 계산을 끝낼 때 까지 기다리지 않고 작업2와 작업3가 먼저 실행된다.

물론 에러가 발생하는 경우에도 마찬가지이다.

lazyDiv(5,0).then((result)=>{console.log(result)}).catch((err)=>console.log(err.message)); //작업1
console.log("hi"); //작업2
console.log("async function is in progress");//작업3

hi
async function is in progress
Can't devide by 0

아마존 LOAD BALANCER를 이용하여 https 즉 ssl 인증서를 내 AWS EC2에 장착하였다. 그리고 조금 더 나아가  http로 들어오는 request를 모두 https 쪽으로 리다이렉트를 시켜 보다 안전한 웹사이트로 만들고 싶었다.

그래서 기존에 NGINX 서버 설정하듯이 sites-enabled 폴더안에서 리다이렉션 설정을 하였는데...

LOAD BALANCER Health check에서 계속 outofservice를 당한다. 포트를 이리 바꿔보고 저리 바꿔봐도 health check 때문에 LOAD BALANCER와 EC2를 이어지지 않는다.에 그래서 할 수 없이  자바스크립트로 아래와 같이 설정하니 되긴 된다.

<script>
var current_url = window.location.href;
if (current_url.includes("localhost")){
console.log("development");
}else{
console.log("production");
if(window.location.protocol != 'https:') {
location.href = location.href.replace("http://", "https://");
}
}
</script>

위 코트드는 디벨롭먼트 환경에서는 그냥 두고 프로덕션 환경에서 http 사이트를 강제로 https로 바꿔주는 자바스크립트 코드이다.

근데 stack flow 이런데 보니까 자바스크립트로 하는 것보다 웹서버에서 설정하는게 훨씬 reliable하다고 하는데... 이렇게 하면 뭐가 문제가 되는지 아직 파악하지 못했다. 뭐 아무튼 AWS EC2에 https를 사용하고 싶고 그러면 LOAD BALANCER가 필수적인데 NGINX 설정 하니 LOAD BALANCER에서 EC2를 잡아주지 못하니 어쩔 수 없이 이렇게 했다.

+ Recent posts