MySql과 같은 DB에 연결하거나 외부의 라이브러리를 사용하여 어떠한 기능 수행 후 return값을 받아오려고 할 때에는 시간이 필요하다. 따라서 코드가 실행될 때 해당 부분을 만났을 때 바로 아래쪽의 코드로 넘어가지 않고 return값을 받아올 때까지 기다려주는 문법이 async와 await이다.
다음은 프론트엔드로부터 사용자의 email을 전달받았을 때 해당 email이 이미 서비스에 등록된 이메일인지 DB에서 찾아 확인하는 코드이다.
async checkIsAvailable({ email }) {
const user = await this.userRepository.findOne({ where: { email } });
if (user) {
throw new UnprocessableEntityException('이미 사용중인 아이디입니다.');
}
}
위와 같은 코드가 작성되었을 때 우리는 먼저 DB에 해당 email을 가진 user정보가 있는지 확인하고 해당 값을 리턴 받아와야한다. 이후 user정보의 존재 유무에 따라 이미 존재한다면 '이미 사용중인 아이디입니다.'라는 메시지를 프론트엔드에 전달해주고 없는 정보라면 회원가입을 진행할 수 있도록 해야한다. 이 때의 프로세스는 user정보를 반드시 먼저 가져와야하므로 해당 작업 앞에 await를 적어주고 작업이 진행되는 function에 async를 붙여주었다. async와 await로 인해 userRepositofy.findOne()작업(Promise객체를 반환하는 작업)은 코드의 실행 순서를 보장받을 수 있게되었다.
async checkIsAvailable({ email }) {
try{
const user = await this.userRepository.findOne({ where: { email } });
if (user) {
throw new UnprocessableEntityException('이미 사용중인 아이디입니다.');
}
}catch(error) {
console.log(error)
}
}
확실히 async와 await를 사용할 경우 코드를 읽을 때 훨씬 더 빠르게 이해할 수 있었다. 내가 작성한 코드를 다른 사람이 봤을 때에도 어떤 역할을 수행하고 어떤 프로세스를 거치고 있는지 쉽게 파악할 수 있어 개발하는데 매우 용이하다.