📌 1. 동기처리 vs 비동기처리
동기 : 하나의 작업이 실행되는 동안은 다른 작업을 동시에 진행하지 않는 방식. 앞의 작업이 종료된 이후 다른 작업을 진행할 수 있는 순차적인 방식을 의미
프로그램에서 작업을 처리하는 주체를 스레드(Thread)라고 부른다. 여러 작업들을 동기적으로 처리하면 스레드는 각 작업을 순차적으로 하나씩 처리한다. 스레드에서 여러 작업을 동시에 처리하지 않고 하나의 작업이 종료된 다음에 다른 작업을 처리할 수 있는 방식을 블로킹 방식이라고 한다.
자바스크립트는 기본적으로 작업을 동기적으로 처리한다. 하지만, 실제로 자바스크립트의 모든 작업들을 동기적으로 처리하게 되면 많은 문제가 발생한다. 자바스크립트는 하나의 스레드만으로 동작한다. (싱글 스레드 방식) 그렇기 때문에 자바스크립트에서는 하나의 스레드에서 여러 작업을 동시에 처리하는 '비동기 방식'을 사용해서 작업을 수행할 수 밖에 없다.
비동기 = 논 블로킹방식 : 비동기 방식은 작업이 종료되길 기다리지 않고 그 다음 작업이 동시에 진행되게 하는 방식을 의미한다.
비동기적으로 작업을 하면 훨씬 빠르게 작업할 수 있고 동기적 방식의 문제점도 해결할 수 있다.
자바스크립트에서 비동기 작업을 다루는 데 사용되는 객체로 비동기 작업의 완료 또는 실패와 그 결과 값을 나타낸다. 프로미스는 비동기 작업이 완료되는 것을 기다리지 않고 다음 코드를 실행할 수 있도록 해준다. 프로미스는 다음 세 가지 상태를 가질 수 있다.
1. 대기(pending) : 비동기 작업이 완료되지 않은 초기 상태. (이행 X, 거부X)
2. 이행(fulfilled) : 연산이 성공적으로 완료됨. 결과값 존재.
3. 거부(rejected) : 연산이 실패함. 실패 사유 존재.
프로미스를 사용하면 비동기 메서드에서 마치 동기 메서드처럼 값을 반환할 수 있다. 그러나 이 반환 값은 최종 결과가 아니라 미래의 어떤 시점에 결과를 제공할 것임을 나타내는 '프로미스(promise)'이다. 프로미스를 사용하면 다음과 같은 작업을 수행할 수 있다.
* 비동기 작업의 성공 또는 실패를 처리하는 처리기를 연결한다.
* 여러 개의 비동기 작업을 순차적으로 또는 병렬로 처리한다.
* 프로미스 체이닝을 통해 여러 개의 비동기 작업을 연속적으로 실행한다.
프로미스를 생성할 때는 Promise 생성자를 사용하고, 비동기 작업이 완료되면 resolve 또는 reject 함수를 호출하여 프로미스를 이행하거나 거부한다. 이후 then 메서드를 사용하여 성공적인 처리기(success handler)와 실패 처리기(error handler)를 연결할 수 있다. catch 메서드를 사용하여 오류를 처리할 수도 있다. 프로미스를 사용하는 것은 비동기 작업을 좀 더 간편하게 다룰 수 있도록 해주며, 코드의 가독성과 유지 보수성을 높여준다.
📌 3. Promise (프로미스) 연결
Promise.prototype.then(), Promise.prototype.catch() 및 Promise.prototype.finally() 메서드는 정착된 프로미스와 추가 작업을 연결하는 데 사용됩니다. 이러한 메서드는 프로미스를 반환하므로 연쇄적으로 연결할 수 있다. 비동기 작업이 완료된 후 추가 작업을 연결할 수 있다. 이 메서드들은 모두 프로미스를 반환하므로, 체이닝(chaining)을 통해 여러 비동기 작업을 순차적으로 실행하거나 에러를 처리할 수 있다.
* then() 메서드
: 프로미스가 이행(fulfilled)되었을 때와 거부(rejected)되었을 때 각각 호출될 콜백 함수를 등록한다. 두 개의 인수를 받을 수 있다. 첫 번째 인수는 성공 콜백, 두 번째 인수는 실패 콜백이다.
위의 예시는 myPromise라는 프로미스를 생성하고, 이를 체이닝하여 여러 개의 then() 메서드를 연결하는 예제이다. 각 then() 메서드는 프로미스가 이행(fulfilled)되었을 때와 거부(rejected)되었을 때 호출될 콜백 함수를 각각 등록한다.
* catch() 메서드
: catch() 메서드는 프로미스가 거부(rejected)되었을 때 호출될 콜백 함수를 등록한다. 이는 then(null, failureCallback)와 동일하다.
이 코드는 새로운 프로미스를 생성한다. 프로미스는 비동기 작업을 나타내며, 여기서는 setTimeout을 사용하여 1초 후에 reject를 호출하여 오류를 발생시킨다. promise.then 부분은 프로미스가 성공적으로 이행되었을 때 실행될 콜백을 등록한다. 하지만 이 예제에서는 프로미스가 거부되므로 then 내부의 콜백은 실행되지 않는다. promise.catch 부분은 프로미스가 거부되었을 때 실행될 콜백을 등록한다. 프로미스가 거부될 때 발생한 오류 메시지를 콘솔에 출력한다.
* finally() 메서드
: finally() 메서드는 프로미스가 이행되든 거부되든 상관없이 항상 실행될 콜백 함수를 등록하다. 이 메서드는 리소스를 정리하거나 완료 메시지를 표시하는 등의 작업을 할 때 유용하다. finally 메서드는 결과를 반환하지 않으며, 프로미스의 상태에 영향을 미치지 않는다.
finally: 성공 여부와 관계없이 항상 실행되어 "Cleanup or final steps"를 출력한다.
'JS' 카테고리의 다른 글
<JAVA Script> Promise 고급 예제 (0) | 2024.05.30 |
---|---|
<JAVA Script> Promise 정적 속성과 정적 메서드(2) (0) | 2024.05.30 |
<JAVA Script> Promise 정적 속성과 정적 메서드(1) (0) | 2024.05.30 |
<JAVA Script> Promise() 의 생성자 알아보기 (0) | 2024.05.29 |
<JAVA Script> Promise 의 동시성 (0) | 2024.05.28 |