๋Œ€๋ถ€๋ถ„ ์ธ๋”” ๊ฒŒ์ž„์—์„œ ๋งค์นญ ์„œ๋ฒ„๋Š” ํฌํ†ค, db ์„œ๋ฒ„๋Š” ํ”Œ๋ ˆ์ดํŒน์ด๋‚˜ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ• ๊ฑฐ์ž„


๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ๊ตฌ์„ฑ๋งŒ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋Œ€ํ•œ ์ง„์œ„ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—


๋ณดํ†ต์€ ํด๋ผ์ด์–ธํŠธ์— ๋ณด์•ˆ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜


์„œ๋ฒ„์—์„œ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” azure function, cloud Function ๋“ฑ์˜ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ• ๊ฑฐ์ž„


๋ณธ๋ฌธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๋ ค ํ•จ





์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋Š” ๊ทธ ์ž์ฒด๊ฐ€ ๋งˆ์ดํฌ๋กœ ์„œ๋ฒ„๋กœ ๊ณ ์œ ํ•œ url์„ ๊ฐ€์ง€๋ฉฐ ํ˜ธ์ถœ ์‹œ ์ •ํ•ด์ง„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•จ


์ข…๋Ÿ‰์ œ ๊ณผ๊ธˆ์— ๋ณ„๋„์˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”์—†๋Š”๋ฐ๋‹ค ๊ณ ๊ฐ€์šฉ์„ฑ์— ์˜คํ†  ์Šค์ผ€์ผ๋ง์„ ์ง€์›ํ•˜๋Š” ๋ฌด์‹œ๋ฌด์‹œํ•œ ๋…€์„์ž„


๋ฌธ์ œ๋Š” ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ๊ตฌ์กฐ์ธ๋ฐ


๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๋งˆ๋‹ค ์ข…์†์„ฑ์„ ํฌํ•จํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•จ


https://github.com/Kralizek/AWSLambdaSharpTemplate/tree/master/samples


์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋กœ ์ธํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๊ฐ ํ•จ์ˆ˜๋งˆ๋‹ค ๋‹ค๋ฅธ url๋กœ ์š”์ฒญํ•ด์•ผ ํ•˜๊ณ 


์„œ๋ฒ„์—์„œ๋Š” ํ•œ ํ•จ์ˆ˜์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋„


ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹ฌ๋ผ ์ฐธ์กฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ˆ ๋‹ค์‹œ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ์•„์ด๋Ÿฌ๋‹ˆ๊ฐ€ ๋ฐœ์ƒํ•จ


๊ทธ๋ž˜์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ‹ธ ํ•จ์ˆ˜๋„ ๋งค๋ฒˆ ์žฌ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€






์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ๊ฒŒ monolithic serverless ๋ผ๋Š” ์•„ํ‚คํ…์ณ์ธ๋ฐ


๋ชจ๋“  ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ž„


์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋Š” ๋„คํŠธ์›Œํฌ ํ•จ์ˆ˜๋กœ ์š”์ฒญํ•˜๋Š”๋ฐ ํ•จ์ˆ˜์˜ ๊ณ ์œ  url๊ณผ http method๋ฅผ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•จ


๋‚˜๋Š” c# ์œ ์ €๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋„คํŠธ์›Œํฌ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ๊ฑฐ์ž„


request(url, http method)


url์— /๋ฅผ ๋ถ™์—ฌ ํ•˜์œ„ ๊ฒฝ๋กœ(์ดํ•˜ path)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ 


์„œ๋ฒ„๋Š” ์š”์ฒญ๋ฐ›์€ path์™€ http method๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ (aws lambda๋งŒ ํ™•์ธํ•ด๋ด„ ใ…‹)


์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ router์—์„œ ์š”์ฒญํ•œ ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„ ์‹คํ–‰ํ•˜๋Š”๊ฒŒ ์•„ํ‚คํ…์ณ์˜ ํ•ต์‹ฌ ๊ฐœ๋…์ž„






๊ตฌํ˜„์€ ๊ฐ„๋‹จํ•จ. ์šฐ์„  ์„œ๋ฒ„๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฌ๊ธฐ์— ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•จ


์˜ˆ๋ฅผ๋“ค์–ด ๊ฐ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” http method ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์„๋•Œ


getItem, GET

updateItem, POST

getAccount, GET


httpRouteMap์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ


httpRouteMap = {

/item: {

GET: getItem,

POST: updateItem,

},

/account: {

GET: getAccount,

},

}


๊ทธ๋ฆฌ๊ณ  router ํ•จ์ˆ˜๋Š” ์œ„์˜ httpRouteMap์— path์™€, http method๋ฅผ ์ž…๋ ฅํ•ด์„œ ๋งคํ•‘ํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๋จ


fn = httpRouteMap[path][httpMethod]


๋งˆ์ง€๋ง‰์œผ๋กœ ์„œ๋ฒ„๋ฆฌ์Šค์˜ ์ง„์ž…์ ์—์„œ router ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์„œ๋ฒ„ ๋กœ์ง์€ ๋์ž„


์ด์ œ ํด๋ผ์—์„œ request(url/item, GET) ์œผ๋กœ ์š”์ฒญํ•˜๋ฉด getItem์ด ์‹คํ–‰๋จ






monolithic serverless ์•„ํ‚คํ…์ณ๋ฅผ ์ ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ์ฝœ๋“œ ์Šคํƒ€ํŠธ๋„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Œ


์ฝœ๋“œ ์Šคํƒ€ํŠธ๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ์ ์œผ๋กœ ์ตœ์ดˆ ์‹คํ–‰ ์‹œ ์ˆ˜ ์ดˆ์—์„œ ์ˆ˜์‹ญ ์ดˆ์˜ ์‹œ๊ฐ„ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๋Š”๊ฒƒ์„ ๋งํ•จ


์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋‚ฎ์€ ํ•จ์ˆ˜์ผ ์ˆ˜๋ก ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋‘๋“œ๋Ÿฌ์ง€๋Š”๋ฐ


์œ„ ์•„ํ‚คํ…์ณ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ๋ผ์šฐํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋ฌธ์ œ์—์„œ ๋น„๊ต์  ์ž์œ ๋กœ์›€


ํ•จ์ˆ˜์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ์ธ๋”” ๋ ˆ๋ฒจ์—์„œ ์ด๋Ÿฌํ•œ ์˜ํ–ฅ์€ ๋ฏธ๋ฏธํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ


์•ž์„œ ์–ธ๊ธ‰ํ•œ ์žฅ์ ๋“ค์ด ์œ„ ๋‹จ์ ์„ ๋ชจ๋‘ ์ƒ์‡„ํ•จ






๋์œผ๋กœ ์„œ๋ฒ„๋ฆฌ์Šค๋Š” ๋ฐ˜๋“œ์‹œ serverless framework๋‚˜ SAM ๋“ฑ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ local dev ๋ฐ hmr์„ ์ ์šฉํ•ด์•ผ ํ‰ํ™”๋กœ์šด ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•จ





๋‹ค์Œ ํฌ์ŠคํŒ…์„ ์ฐธ์กฐํ–ˆ์Œ

https://devstarsj.github.io/cloud/2016/11/22/Lambda+APIGateway.02.Route/

AWS Lambda์™€ API Gateway๋ฅผ ์ด์šฉํ•ด์„œ Serverless Web API ๋งŒ๋“ค๊ธฐ (2) - RouteWeb API๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ URL์— ๋Œ€ํ•ด์„œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ์€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ URL์„ ๋ณ„๋„์˜ Lambda๋กœ ๊ตฌํ˜„ํ•˜์—ฌ API Gateway์—์„œ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ํ•˜๋‚˜์˜ Lambda์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„ ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์ „ํŽธ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์•ฝ๊ฐ„์˜ ์„ค๋ช…์„ ํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „ํŽธ์˜ ๋‚ด์šฉ์„ ์•ˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ์ด ๊ธ€๋ถ€ํ„ฐ ๋ณด์‹œ๋Š” ๋ถ„๋“ค์€ ๊ธ€์•„๋ž˜ Link์—์„œ ๋‚ด์šฉ์„...devstarsj.github.io