본문 바로가기

Programming/Node.js

2. Javascript ES2015 (7) - async/awiat [1/2]

node js logo image

 

 

 

 

 

async/await는 노드 7.6 버전부터(ES2017) 추가된 기능입니다. 노드와 같이 비동기 중심의 코드를 작성하는 데 있어서 코드를 간소화하는데 큰 도움을 주는 문법이죠. 

 

우선은 기본적으로 프로미스를 이해하고 있어야 합니다. async/await는 근본적으로 프로미스 문법을 간소화시켜주는 기능을 갖고 있기 때문입니다. 기본 콜백 지옥을 프로미스로 간소화하였지만, 앞선 아티클들에서 살펴보았듯이 then과 catch가 여전히 장황하게 반복됩니다. 

 

앞서 살펴보았던 findAndSaveUser( ) 예제를 통해서 알아보겠습니다. 

 

 

 

2. Javascript ES2015 (6) - 프로미스 [4/5]

앞선 아티클에서 우리는 3개의 뎁스를 가진 콜백 함수 예제를 살펴보았습니다. function findAndSaveUser(Users){ Users.findOne( {}, (err, user) => { // 첫 번째 콜백 if(err){ return console.error(err); } user.name = 'zero'; use

nozeroslope.tistory.com

 

 

 

 

1. 기본 콜백 타입

function findAndSaveUser(Users){
    Users.findOne( {}, (err, user) => { // 첫 번째 콜백
        if(err){
            return console.error(err);
        }
        user.name = 'zero';
        user.save( (err) => {    // 두 번째 콜백
            if(err){
                return console.error(err);
            }
            Users.findOne( { gender: 'm' }, (err, user) => {    // 세 번째 콜백
                /* 내용 생략*/
            } );
        } );
    } );
}

 

 

 

2. 프로미스 사용

function findAndSaveUser(Users){
    Users.findOne({})
        .then((user) => {
            user.name = 'zero';
            return user.save();
        })
        .then((user) => {
            return Users.findOne({gender: 'm'});
        })
        .then((user) => {
            // 내용생략
        })
        .catch(err => {
            console.error(err);
        })
}

 

 

 

3. async/await 사용

 

async function findAndSaveUser(Useres) {
    let user = await Useres.findOne({});
    user.name = 'zero';
    user = await user.save();
    user = await Useres.findOne({ gender: 'm' });
    // 생략
}

 

 

 

우선, 위에 사용된 async/await를 사용한 코드가 엄청나게 짧아졌다는 것을 체감할 수 있습니다. 어떤 부분에 변화가 생겼는지를 차근차근 짚어보겠습니다. 

 

· 우선 함수 findAndSaveUser( )를 선언할 때, async function으로 선언하였습니다. 
· 그리고 프로미스 앞에는 await를 붙였습니다.
· 이제 함수는 프로미스 await Users.findOne( { } ) 이 resolve 될 때까지 기다린 다음에 user 변수를 초기화 합니다.

 

여기서 사용된 예제의 경우에는 프로미스가 resolve일 경우에 대한 처리만 선언되어 있는 상태입니다. 당연히 프로미스가 reject 되었을 때에 대한 처리도 필요하겠죠? 아래와 같이 코드를 추가해 보겠습니다. 

 

async function findAndSaveUser(Useres) {
    try { 
        let user = await Useres.findOne({});
        user.name = 'zero';
        user = await user.save();
        user = await Useres.findOne({ gender: 'm' });
        // 생략
    } catch (error) {
        console.log(error);
    }
}