본문 바로가기

JavaScript/Node.js Lecture

4. Node 동기/ 비동기 처리 ( async / await )

안녕하세요! 효그니에요! 와! 샌즈! 오늘은 동기와 비동기에 대해 알아볼 예정이에요! 

그나저나... 요새 날씨가 많이 추워진 듯 하네요 하핳! 묵혀둔 코트를 입을 때가 온 듯 해요!

뭐 암튼.. 각설하고 여튼 째뜬 시작해볼까요?

동기 / 비동기란?

비동기란 특정 동작이 끝나지 않아도 다음 동작을 먼저 실행하는 자바스크립트의 특성입니다!

그럼 동기는 반대로 특정 동작이 끝나기 전에 다음 동작을 먼저 실행하지 않는 것이겠죠?

예를 하나 들어볼게요! 

app.get('/', (req, res) => {
	console.log('1');
	setTimeout(() => console.log('2'), 1000);
	console.log('3');
});

setTimeout는 인자 값으로 들어간 함수를 뒤의 시간 만큼 기다린 뒤 실행하는 함수입니다!

예상 동작은 1, ( 1초 기다린 뒤 ) 2, 3 이셨겠지만,

3이 먼저 출력되고, 그 다음 다음에 2가 나오는 모습을 볼 수 있습니다!

setTimeout의 동작이 끝나기 전에 다음 동작인 3을 출력해서 그렇습니다 하핳!

async / await 이란?

자바스크립트의 동기 / 비동기 처리 패턴 중 하나입니다.

함수 앞에 async를, 함수 내의 연산 앞에 await를 붙여 사용합니다.

저번 시간에 작성했던 로그인 코드입니다.

app.post('/signin', (req, res) => {
	Users.findOne({ id: req.body.id, password: req.body.password }, (err, user) => {
		if (err) return res.status(500).json({ message: '에러!' });
		else if (user) return res.status(200).json({ message: '유저 찾음!', data: user });
		else return res.status(404).json({ message: '유저 없음!' });
	});
});

콜백 함수 내에 없다면 찾은 결과 값에 접근하기 힘들고, 이로 인해 콜백 지옥이 발생할 수 있습니다

async / awiat 을 사용하여 결과 값을 변수에 할당했습니다.

app.post('/signin', async (req, res) => {
	let result = await Users.findOne({ id: req.body.id, password: req.body.password });
	if (!result) return res.status(404).json({ message: '유저 없음!' });
	return res.status(200).json({ message: '유저 찾음!', data: result });
});

어떤가요? 깔끔하쥬? 

참고로 http 통신, DB 등 작동 시간이 긴 함수들은 개발자에게 비동기 처리를 요구합니다!

익숙해지시면 사용하기도 편할거에요!

추운 날씨니깐 따듯하게 입고 따듯한거 먹으면서 하세요 여러분들!