ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Node.js/Node.js ์‹ค์Šต

callback ํ•จ์ˆ˜ ์ดํ•ดํ•˜๊ธฐ

๋Œ•๋Œ•์ด๋ฐœ๐Ÿพ 2018. 9. 8. 23:03


Node js ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ฉด About ํƒญ์—์„œ Node.js์˜ ๋Œ€ํ•ด์„œ ๋ผ๋Š” ์„ค๋ช…์ด ์งค๋ง‰ํ•˜๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค.


Node.jsยฎ์— ๋Œ€ํ•ด์„œ

๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฃผ๋„ JavaScript ๋Ÿฐํƒ€์ž„์œผ๋กœ์จ Node๋Š” ํ™•์žฅ์„ฑ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ "hello world" ์˜ˆ์ œ๋Š” ๋‹ค์ˆ˜์˜ ์—ฐ๊ฒฐ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์—ฐ๊ฒฐ์—์„œ ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜๋Š”๋ฐ ์‹คํ–‰ํ•  ์ž‘์—…์ด ์—†๋‹ค๋ฉด Node๋Š” ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.




์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๋‹จ์–ด ๋‘ ๊ฐ€์ง€๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜๋Š”๋ฐ ํ•˜๋‚˜๋Š” ๋น„๋™๊ธฐ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ฝœ๋ฐฑ์ด๋ผ๋Š” ๋‹จ์–ด์ž…๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ๋ผ๋Š” ๋ง์€ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ ์ˆœ์„œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ์ž‘์—…์ด ๋‹ค ๋๋‚˜์ง€ ์•Š์•„๋„ ๊ทธ๊ฑด ๊ทธ๋Œ€๋กœ ๊ณ„์† ์ž‘์—…ํ•˜๊ฒŒ ๋‚ด๋ฒ„๋ ค๋‘๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ๋ฐ”๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฌํ•œ ํŠน์ง•์€ ์žฅ์ ์ด ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋„๋ฆฌ์–ด ๋‹จ์ ์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ทธ๋ž˜์„œ Node.js์—์„œ ํ•ญ์ƒ ๋ถ™๋Š” ์ˆ˜์‹์–ด๊ฐ€ callback ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.



๋ณดํ†ต ์–ด๋–ค ํ•จ์ˆ˜ ์ž‘์—…์ด ๋๋‚˜์„œ ๊ฐ’์„ ๋ฆฌํ„ดํ•  ๋•Œ ๋ณดํ†ต C๋‚˜ Java์™€ ๊ฐ™์€ ์–ธ์–ด์—์„œ๋Š” 

return ๊ฐ’ 

์˜ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์œ„์™€๊ฐ™์€ ์–ธ์–ด์—์„œ๋Š” ์ฝ”๋“œ ์ž‘์„ฑ ์ˆœ์„œ๋Œ€๋กœ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žˆ์ง€๋„ ์•Š๋Š” ๊ฐ’์„ return ํ•˜๊ฒŒ ๋  ์ผ์€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ’์ด๋ผ๊ณ  ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋œฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๊ทธ๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋Š” Node์—์„œ๋Š” ์–˜๊ธฐ๊ฐ€ ์ข€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. 


์˜ˆ๋ฅผ๋“ค๋ฉด ๋ณ€์ˆ˜ A์— ์–ด๋– ํ•œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ ๋‚˜์„œ ๊ทธ ๊ฐ’์„ return ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค์น˜๋ฉด ์ƒ์‹์ ์œผ๋กœ๋Š” ๋ฆฌํ„ด๋ฐ›๋Š” ๊ฐ’์€ ๊ณ„์‚ฐ๋œ ์–ด๋–ค ๊ฐ’์ด ๋‚˜์™€์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ• ํ…๋ฐ ๊ทธ๋ ‡์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ A๋Š” ์„ ์–ธ์ด ๋˜์—ˆ์ง€๋งŒ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋„ ์ „์— ๊ฐ’์„ return ํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ๋˜๊ธฐ ์ „์˜ ๊ฐ’์„ return ํ•˜๋Š” ์ƒํ™ฉ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž‘์—…ํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1
2
3
4
5
6
7
8
9
10
11
12
13
function weatherFunction(callback) {
    request(url,function(err,response,body) {
        if(err)
            console.log(err);
        else {
            var obj = JSON.parse(body);
            var weatherObj = {"img":"rain.gif""temp":obj.main.temp};
            callback(weatherObj)
        }
    });
}
 
exports.weatherFunction = weatherFunction;

cs


else๋ถ€๋ถ„์—์„œ weatherObj๋ผ๋Š” JSON ํƒ€์ž…์˜ Object๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด Object๋ฅผ Server๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.


App.js

1
2
3
4
5
6
app.get('/forecast',function(req,res){
    weather.weatherFunction(function(data){
        res.render('forecast',{data:JSON.stringify(data)});
        console.log(data);
    })
});
cs


์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋‹ค ์“ฐ์ง„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. forecast๋ผ๋Š” ๋ผ์šฐํ„ฐ๋กœ ์ ‘์†์„ ํ–ˆ์„ ๋•Œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์œ„์—์„œ ์ „๋‹ฌํ–ˆ๋˜ Object ๊ฐ’์„ client๋‹จ์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์ฝ”๋“œ์ธ๋ฐ ๋„˜๊ฒจ์ฃผ๋Š”๊ฑด ๋‘˜์งธ์น˜๊ณ  console.log๋กœ ์ฐํžˆ๋Š” ๊ฐ’๋งŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


temp๊ฐ€ ๋‚˜์˜จ ๊ฒฝ์œ„๋Š” ์ œ๊ฐ€ ๋‚ ์”จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” API๋ฅผ ์“ด๊ฑฐ๋ผ ์œ„์— ๋‚ด์šฉ์—๋Š” ์ƒ๋žต๋˜์—ˆ์ง€๋งŒ ์ผ๋‹จ ๋ญ๊ฐ€๋๋“  ์ž˜ ๋„˜์–ด์™”๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ callbackํ˜•์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


์ฝ”๋“œ๋ฅผ return ํ˜•์‹์œผ๋กœ ์‚ด์ง ๋ฐ”๊ฟ”๋ณด๋ฉด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function weatherFunction() {
    var obj;
    var weatherObj;
    request(url,function(err,response,body) {
        if(err){
            weatherObj = {"img":"err","temp":"err"};
        }
        else {
            obj = JSON.parse(body);
            weatherObj = {"img":"rain.gif""temp":obj.main.temp};
        }
    });
    return weatherObj;
}
 
exports.weatherFunction = weatherFunction;
cs

๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„์ชฝ์—์„œ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ ํ–ˆ์„ ๋•Œ ๋ฆฌํ„ด ๋˜๋Š” ๊ฐ’์ด ์žˆ์œผ๋ฆฌ๋ผ ์ถ”์ธก๋˜๋ฏ€๋กœ ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.


App.js

1
2
3
4
app.get('/forecast',function(req,res){
    res.render('forecast',{data:JSON.stringify(weather.weatherFunction())});
    console.log(weather.weatherFunction());
});
cs


์•„๊นŒ๋„ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋‹น์—ฐํžˆ else๋ถ€๋ถ„์ด ์‹คํ–‰๋  ๊ฒƒ์ด๊ณ  ๊ทธ๋ ‡๋‹ค๋ฉด weatherObj๊ฐ’์ด ๋ฆฌํ„ด๋˜๋ฆฌ๋ผ ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹คํ–‰์„ ์‹œ์ผœ๋ณด์•˜๋”๋‹ˆ


undefined์ด ๋‚˜์™€๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ returnํ•˜๊ธฐ ์ „์— ๊ฐ’์„ ๋ช…์‹œํ•˜๊ณ  return์„ ์‹œ์ผฐ๋Š”๋ฐ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Node.js์—์„œ๋Š” ๊ฐ’์„ returnํ•˜๋Š” ํ˜•์‹์ด ์•„๋‹Œ callback์˜ ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ•จ์ˆ˜์˜ ์„ ์–ธ๋ถ€ ์ฐจ์ด๋ฅผ ๋ณด๋ฉด


function weatherFunction(callback)

function weatherFunction()


๋งค๊ฐœ๋ณ€์ˆ˜๋กœ callback์ด๋ผ๋Š” ๊ฒƒ์ด ์ฐจ์ด๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ๋งจ ์ฒ˜์Œ์— ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์—์„œ ๋‚˜์™”๋˜ ๋ง ์ค‘์— ์ด๋Ÿฐ ๋ง์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


๊ฐ ์—ฐ๊ฒฐ์—์„œ ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋˜๋Š”๋ฐ ์‹คํ–‰ํ•  ์ž‘์—…์ด ์—†๋‹ค๋ฉด Node๋Š” ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.


์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด์™ธ์— callback์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋…€์„์„ ํ†ตํ•ด ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


forecastFunction

callback(weatherObj)


app.js

weather.weatherFunction(function(data){
    res.render('forecast',{data:JSON.stringify(data)});
})


forecastํ•จ์ˆ˜์—์„œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธธ ๊ฐ’์ธ weatherObj๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„์ชฝ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ„์™€๊ฐ™์ด ์„ ์–ธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


weatherFunction์„ ์‚ฌ์šฉํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ €๊ธฐ์— ์žˆ๋Š” data๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ forecastFunction ์—์„œ ๋„˜๊ฒจ์ค€ weatherObj๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 


ํ•จ์ˆ˜์—์„œ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ๋งŽ์ด ์“ฐ์ด๋Š” ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ๋กœ ์ง„ํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค์—์„œ callback์€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ ๊ทธ๊ฒƒ๋„ ๋ชจ๋ฅด๊ณ  ๋„๋Œ€์ฒด ๊ฐ’์ด ์™œ ์•ˆ ๋‚˜์˜ค๋Š”๊ฑด๊ฐ€ ํ•œํƒ„๋„ ์ฐธ ๋งŽ์ดํ–ˆ๋Š”๋ฐ ์ด์ œ์•ผ ์ชผ๊ธˆ ์ดํ•ด๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™๋„ค์š”..ใ…‹ใ…‹


๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ