์ฐ๋ฆฌ๋ ๋ญ์น์๊ฒ ๊ธฐ๋ค๋ ค! ๋จน์ด! ํ๋ จ์ ๊ต์ก์ํค๊ณ ์ถ์ต๋๋ค.
๋ญ์น์ ๋ค๋ฆฌ์ ๊ฐ์์ ์ฌ๋ ค๋๊ณ ๋จน์ด!๋ผ๊ณ ํ์ ๊ฒฝ์ฐ ๋ญ์น๊ฐ ๊ฐ์์ ๋จน์์ผ๋ฉด ํ๋๋ฐ ๋ญ์น๋ ์ฃผ์ธ์ ๋ช ๋ น์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ (๋น๋๊ธฐ ๋ฐฉ์ ๋ฌธ์ ) ์ ๋ฉ๋๋ก ๊ฐ์์ ๋จน์ด๋ฒ๋ ธ์ต๋๋ค...๋ญ์น์๊ฒ ํ๋ จ(์ผ๋ฐ ์ฝ๋ฐฑํจ์)์ ์์ผ๋ณด์์ง๋ง ์ฌ์ ํ ๋ญ์น๋ ๋ง์ ๋ฃ์ง ์์ต๋๋ค. ๋ญ์น๋ ๋ง๋ชปํ๋ ๊ฐ์์ง๋ผ ํผ๋ผ ์๋ ์๊ณ ์ฐ๋ฆฌ๋ ๋์ฒํ ์ํฉ์ ๋น ์ ธ๋ฒ๋ ธ์ต๋๋คใ ใ ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ ์ฌ์ด ํ๋ จ๋ฐฉ๋ฒ(async/await)์ผ๋ก ๋ญ์น๋ฅผ ๊ต์ก์ํค๊ณ ์ ํฉ๋๋ค!!
# ๋น๋๊ธฐ์ ๋๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ์ ๊ฒฝ์จ์ผ ํ๋ ๋ถ๋ถ ์ค ํ๋๊ฐ ๋๊ธฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋๋ค. ๋ถ๋ช ๋ก์ง์ ๋ง๊ฒ ์ง ๊ฑฐ ๊ฐ์๋ฐ ๊ฒฐ๊ณผ๊ฐ์ด undefined ์ด๊ฑฐ๋ ์์ ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ญ์คํ๊ตฌ ๋น๋๊ธฐ ๋ฌธ์ ๋ฅผ ์์ฌํด๋ด์ผ ํฉ๋๋ค.
์๋ ์ฝ๋๋ Node.js ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํด ์ฟผ๋ฆฌ๋ฌธ์ ์กฐํํ๋ ์ฝ๋์ ๋๋ค.
router.get('/', function (req, res, next) {
let query_result = "init"
connection.connect();
connection.query('SELECT * FROM bjgg.champions LIMIT 1', function(err, result, fields){
query_result = result;
});
connection.end();
res.json(query_result);
});
**๊ฐ๋จํ ์ฝ๋ ์ค๋ช
connection.query๋ ์ฝ๋ฐฑ ํจ์๋ก ์ฟผ๋ฆฌ๋ฌธ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ๋ ํจ์์ ๋๋ค. ์ฝ๋ฐฑํจ์ result์ ๊ฒฐ๊ณผ๊ฐ์ด ๋ด๊น๋๋ค.
res.json(query_result)๋ ์น ๋ธ๋ผ์ฐ์ ์ json ๊ฐ์ ๋ณด์ฌ์ค๋๋ค.
connection.connect()์ .end()๋ ์ ๊ฒฝ์ฐ์์ง ์์๋ ๋ฉ๋๋ค.
๊ณผ์ฐ query_result ๋ ์ด๋ค ๊ฐ์ ์ถ๋ ฅํ ๊น์? "init" ์๋๋ฉด "SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ"?
~
~
~
์ ๋ต์ ๋ฐ๋ก "init" ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ connection.query์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ์ค๊ธฐ๋ ์ ์ ์ด๋ฏธ ๋ค์ ํจ์์ธ res.json(query_result)๋ก ๋์ด๊ฐ๊ฒ ๋์ด ์ฟผ๋ฆฌ๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ ์ ์์ต๋๋ค.
router.get('/', function (req, res, next) {
let query_result = "init"
connection.connect();
connection.query('SELECT * FROM bjgg.champions LIMIT 1', function(err, result, fields){
query_result = result;
connection.end();
res.json(query_result);
});
});
๋ง์ ๋ถ๋ค์ด ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐ๋์ง ์์๊น? ๋ผ๊ณ ์๊ฐํ์ค ์๋ ์์ต๋๋ค. ๋ง์ต๋๋ค. ์์ ๊ฐ์ด ํด๋ ๋ฌธ์ ์์ด ์๋์๊ฐ๋๋ค.
๊ฒฐ๊ณผ ๊ฐ์ ์ ๊ฐ์ ธ์จ ๊ฒ์ ๋ณด์ค ์ ์์ต๋๋ค. ํ์ง๋ง "SELECT ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ"์ ๋ค๋ฅธ ์ฝ๋ฐฑํจ์์์ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด ์ด๋จ๊น์?
router.get('/', function (req, res, next) {
let query_result = "init"
connection.connect();
connection.query('SELECT * FROM bjgg.champions LIMIT 1', function(err, result, fields){
query_result = result;
myFunc_01(query_result, function(result_01){
myFunc_02(result_01, function(result_02){
myFunc_03(result_02, function(result_03){
//์ฝ๋ฐฑ ์ง์ฅ...
console.log(result_03);
});
});
})
connection.end();
res.json(query_result);
});
});
query_result๋ฅผ ์ด์ฉํ์ฌ 3๊ฐ์ ํจ์(myFunc_01, 02, 03)๋ฅผ ๊ฑฐ์น ๋ค result_03์ ๊ตฌํ๋ค๊ณ ํ๋ค๋ฉด,
์์ ๊ฐ์ด ์ฝ๋ฐฑ ํจ์๋ฅผ ๊ตฌ์ฑํ์ฌ์ผ ํ๋๋ฐ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ ๊ฐ๋ ์ฑ์ด ์๋นํ ๋จ์ด์ง๋๋ค. ์์ ์ฝ๋์๋ ํจ์์์ ๋ค๋ฅธ ๋ก์ง๋ค์ด ์์ง๋ง, ๋ง์ฝ ํจ์ ์์ ๋ค๋ฅธ ๋ก์ง๋ค๊น์ง ์์ผ๋ฉด ํ์ ํ๊ธฐ๊ฐ ์๋นํ ํ๋ญ๋๋ค. ์ด๋ฅผ ์์ ๋งํด ์ฝ๋ฐฑ ์ง์ฅ์ ๋น ์ก๋ค๊ณ ๋งํฉ๋๋ค.
# async/await
์ฝ๋ฐฑ์ง์ฅ์ ํด๊ฒฐํ๊ณ ์ ๋์จ ๊ฒ์ด ๋ฐ๋ก async/await ์ ๋๋ค. async/await๊ฐ ๋์ค๊ธฐ ์์ promise๋ผ๋ ๊ฒ์ด ๋จผ์ ๋์๋๋ฐ promise์ ๋ํด์ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค.
(๊ฐ๋ฐ์์ ์์ฌ์ ๋์ด ์๋ค๊ณ promise ๋ํ ๊ฐ๋ ์ฑ์ด ์ข์ง ์๋ค ์๊ฐํด ์ด๋ฅผ ๋์ฑ ๊ฐ์ ํ ๊ฒ์ด async/await์ ๋๋ค.)
async/await ๋ฌธ๋ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ ES2017์ ๋๋ค. ๋ฐ๋ผ์ ์ต์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋๋ผ๋ฉด ํด๋น ์คํฌ๋ฆฝํธ๋ ๋์ํ์ง ์์ ์๋ ์์ต๋๋ค.
router.get('/',async function (req, res, next) {
let query_result = "init"
query_result = await connection('SELECT * FROM bjgg.champions LIMIT 1');
res.json(query_result);
});
์ ์ฝ๋๋ async/await ๋ฌธ๋ฒ์ ์ฌ์ฉํ ์ฝ๋์ ๋๋ค. ์ผํ๋ด๋ ๊ฐ๋ ์ฑ์ด ์ข์์ก๋ค๋ ๊ฑธ ์ ์ ์์ต๋๋ค.
async/await ๋ฌธ๋ฒ ์ฌ์ฉ๋ฒ์ await๋ฅผ ์ฐ๊ณ ์ถ์ ํจ์ ์์ async๋ฅผ ์จ์ฃผ๊ณ , ๋น๋๊ธฐ๋ฅผ ๋๊ธฐ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ ํจ์ ์์ await๋ฅผ ๋ถ์ฌ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๊ฒฐ๊ณผ๊ฐ์ ์ ๊ฐ์ ธ์จ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
router.get('/',async function (req, res, next) {
let query_result = "init"
query_result = await connection('SELECT * FROM bjgg.champions LIMIT 1');
result_01 = await myFunc_01(query_result);
result_02 = await myFunc_02(result_01);
result_03 = await myFunc_03(result_02);
res.json(query_result);
});
์ฝ๋ฐฑ์ง์ฅ์ ๋น ์ก๋ ์ฝ๋๋ค๋ ์์ ๊ฐ์ด ๊ฐ๋ ์ฑ ์ข๊ฒ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ํจ์ฌ ๋ณด๊ธฐ๊ฐ ์ข์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ try~catch ๋ฌธ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ธ์ฒ๋ฆฌ ๋ํ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
router.get('/',async function (req, res, next) {
try{
let query_result = "init"
query_result = await connection('SELECT * FROM bjgg.champions LIMIT 1');
result_01 = await myFunc_01(query_result);
result_02 = await myFunc_02(result_01);
result_03 = await myFunc_03(result_02);
res.json(query_result);
}catch(error){
console.log(error);
}
});
# ๊ธฐํนํ ๋ญ์น
์ฐ๋ฆฌ๋ ์ด์ ์๋ก์ด ํ๋ จ๋ฐฉ๋ฒ(async/await)์ ์์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ํ๋ ํ๋ จ๋ฐฉ๋ฒ(์ผ๋ฐ ์ฝ๋ฐฑํจ์)๋ณด๋ค ๋์ฑ ์ฝ๊ฒ ๋ญ์น๋ฅผ ๊ต์ก์ํฌ ์ ์์ต๋๋ค. ๋ญ์น๋ ๋ ์ด์ ๊ฐ์์ ์ ๋ฉ๋๋ก ๋จน์ง ์์ต๋๋ค. ๋ญ์น์๊ฒ ๊ธฐ๋ค๋ ค!(await)๋ผ๊ณ ๋งํ ํ ๋จน์ด!(await์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์์ ๋)๋ผ๊ณ ์ธ์น ๋ ๋ง ๋ญ์น๋ ๊ฐ์์ ๋จน์ต๋๋ค.
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
'...' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Node.js] uuid ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋ฐ ์ฌ์ฉํ๊ธฐ (0) | 2021.04.12 |
---|---|
Node.js์ ๊ดํ 10๊ฐ์ง ํํ - ๋ผ์ด์ธ ๋ฌ๊ณผ Deno.js (8) | 2021.04.11 |
[Server] ๋ก๋๋ฐธ๋ฐ์(Load Balancer)๋ ์ ํ์ํ ๊น? (6) | 2021.03.15 |
[Linux] OpenSSH ์๋ฒ ๊ตฌ์ถํ๊ธฐ (0) | 2021.03.09 |
[shell] ์ ธ ์คํฌ๋ฆฝํธ for๋ฌธ๊ณผ while๋ฌธ ๋ฐ๋ณต๋ฌธ (0) | 2021.03.09 |