Loading...
2022. 5. 22. 21:13

[FastAPI] 16. Pulumi๋ฅผ ์ด์šฉํ•ด FastAPI Serverless ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•ด๋ณด๊ธฐ

์šฐ๋ฆฌ๋Š” ์ง€๋‚œ ๊ธ€์—์„œ FastAPI, Magnum, AWS Serverless Stack(Lambda, API Gateway)์„ ์ด์šฉํ•˜์—ฌ FastAPI ์„œ๋ฒ„๋ฆฌ์Šค ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. 2022.05.22 - [Programming/Python] - [FastAPI] 15. FastAPI๋ฅผ Serverless๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ• - Mangum [FastAPI] 15. FastAPI๋ฅผ Serverless๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ• - Mangum ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” FastAPI์™€ Serverless(์„œ๋ฒ„๋ฆฌ์Šค) ์กฐํ•ฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ดˆ๊ธฐ ์„œ๋ฒ„๋ฆฌ์Šค๋ฅผ ๋ฐฐ์› ์„ ๋•Œ๋Š” AWS์˜ Lambda๋ผ๋Š” ์„œ๋น„์Šค๊ฐ€ ๋‚˜์™”์„ ๋•Œ์˜€๋Š”๋ฐ์š”. ๋‹น์‹œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ณ„๋„์˜ ํ”„ blog.neonkid.xyz ํ•˜์ง€๋งŒ AWS Lambda์™€ API..

2022. 5. 22. 00:03

[FastAPI] 15. FastAPI๋ฅผ Serverless๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ• - Mangum

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” FastAPI์™€ Serverless(์„œ๋ฒ„๋ฆฌ์Šค) ์กฐํ•ฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ดˆ๊ธฐ ์„œ๋ฒ„๋ฆฌ์Šค๋ฅผ ๋ฐฐ์› ์„ ๋•Œ๋Š” AWS์˜ Lambda๋ผ๋Š” ์„œ๋น„์Šค๊ฐ€ ๋‚˜์™”์„ ๋•Œ์˜€๋Š”๋ฐ์š”. ๋‹น์‹œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ณ„๋„์˜ ํ”„๋ ˆ์ž„์›Œํฌ ํ•„์š”์—†์ด ํ•จ์ˆ˜์˜ ๊ตฌํ˜„๋งŒ์œผ๋กœ API ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” Cloud Native(ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ) ๊ฐœ๋ฐœ ๋ชจ๋ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Serverless Serverless(์„œ๋ฒ„๋ฆฌ์Šค)๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด์„ํ•˜๋ฉด '์„œ๋ฒ„ ์—†๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜', '์„œ๋ฒ„ ์—†๋Š” ์„œ๋น„์Šค'๋ผ๋Š” ๋œป์ด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์„œ๋ฒ„๋ฆฌ์Šค๋Š” ์„œ๋ฒ„ ์—†์ด ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๊ฑฐ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ ์„œ๋ฒ„๋ฆฌ์Šค๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ„๋„๋กœ ์„œ๋ฒ„ ๊ด€๋ฆฌ๋ผ๋Š” ๋น„์šฉ์—†์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฐœ๋ฐœ ๋ชจ๋ธ๋กœ์จ ๋Œ€ํ‘œ์ ์œผ..

2021. 11. 9. 10:48

[FastAPI] 13. SQLAlchemy์™€ Pydantic์„ ์ด์šฉํ•œ ๊ด€๊ณ„ ๋ฐ์ดํ„ฐ ๋งคํ•‘

SQLAlchemy๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์›ํ•˜์ง€ ์•Š์„ ๋•Œ API์—์„œ ๋ชจ๋“  ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์ตœ์ ํ™” ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค API์—์„œ๋Š” ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํ˜น์€ ๊ด€๊ณ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋ชจ๋‘ ๋‚˜์˜ค๊ฒŒ ๋˜์–ด ์˜คํžˆ๋ ค API ๋กœ๋”ฉ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๊ณ  ์„œ๋ฒ„ ๋ถ€ํ•˜์— ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. SQLAlchemy ORM์˜ relationship SQLAlchemy ORM์—์„œ๋Š” ๊ด€๊ณ„๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด relationship์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ธ”๋กœ๊ทธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋ ค๋Š”๋ฐ, ์–ด๋–ค ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€์ธ์ง€๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๊ณ„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นดํ…Œ๊ณ ๋ฆฌ๋Š” ํ•˜์œ„ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ํ•˜๋‚˜์˜ ์ปจํ…์ธ ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ํ•˜๋‚˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ผ๊ณ  ํ–ˆ์„ ..

2021. 10. 30. 22:24

[FastAPI] 12. Pytest / UnitTest๋ฅผ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Pytest์™€ Unit Test๋ฅผ ์ด์šฉํ•˜์—ฌ FastAPI์—์„œ ์ž‘์„ฑํ•œ API๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Pytest Python ์–ธ์–ด์—์„œ ์ง€์›ํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” Pytest๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Pytest๋Š” Python์—์„œ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์‹ฌํ”Œํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋ฉฐ ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด์„œ๋„ ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ํŠน์ง•์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‹คํ–‰์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ž์„ธํ•œ ์ •๋ณด ํ‘œ์‹œ ์ง€์› ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ ๋ฐ ๊ธฐ๋Šฅ์„ ์ž๋™์œผ๋กœ ๊ฒ€์ƒ‰ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ ์ง€์› Session๊ณผ ๊ฐ™์€ ์ˆ˜๋ช…์ด ๊ธด ๋ฆฌ์†Œ์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํ•ด์ฃผ๊ณ , ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋งค์ปค๋‹ˆ์ฆ˜ ์ œ๊ณต unitte..

2021. 9. 26. 11:47

[FastAPI] 11. Dependency Injector๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ

์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ฒŒ ๋˜์–ด ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€ํ‘œ์ ์ธ ์•„ํ‚คํ…์ฒ˜์ธ Layered Architecture๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Layered Architecture๋Š” ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์šด์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ˜„๋Œ€ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ, Application, Domain, Infrastructure์˜ 3๊ฐœ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋“ค์„ ์ „๋ถ€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ๊ฐ์˜ ์˜์กด์„ฑ์ด ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๊ณ , ๊ทธ ๋กœ์ง์ด ์ปค์ง€๋ฉด ์ด ์—ญ์‹œ ๊ด€๋ฆฌ๊ฐ€ ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค. Python์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ DI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘์—์„œ๋„ Dependency Injector๋ฅผ ์‚ฌ์šฉ ํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. Dependency I..

2021. 5. 2. 19:38

[FastAPI] 10. Middleware๋ฅผ ์ด์šฉํ•œ ์ „ํ›„ ์ฒ˜๋ฆฌ

API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์–ด๋Š ์ •๋„ ์†Œ๋ชจ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๊ฑฐ๋‚˜ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์•˜์„ ๋•Œ ๋ฐ›์€ EndPoint์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? Middleware Spring์—์„œ๋Š” Intercepter, Filter์™€ ๊ฐ™์€ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด, Flask์—์„œ๋Š” App Context ์ค‘ after_request๋‚˜ before_request ๋“ฑ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. FastAPI์—๋Š” Middleware ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Middleware ํŒจํ„ด์€ API ํ˜ธ์ถœ ์ „ํ›„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋‚˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚œ ๋’ค, API Router๋กœ ์š”์ฒญ์„ ๋„˜๊ธฐ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์ด ์š”์ฒญ์€ ๋จผ์ € Middleware์—์„œ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ..

2021. 4. 4. 12:52

[FastAPI] 9. Persistence Layer ๊ตฌ๊ฐ„์„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ฒซ ํฌ์ŠคํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” FastAPI๊ฐ€ ASGI ๊ธฐ๋ฐ˜์˜ uvicorn์„ ์ด์šฉํ•˜์—ฌ uvloop์— ๊ธฐ๋ฐ˜ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ API ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณต๊ต๋กญ๊ฒŒ๋„ Database Connection์—์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ด์ฃผ์ง€ ์•Š์•„ API ์š”์ฒญ ๋‹จ์—๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ๋„ DB์— ์•ก์„ธ์Šค ํ•˜๋Š” ๊ตฌ๊ฐ„์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Blocking์ด ๋ฐœ์ƒํ•˜๊ณ , ๋‹ค์Œ ์š”์ฒญ์ด ๊ณ„์† ๋Œ€๊ธฐ ๋˜๋Š” ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Python DB API ๊ทธ๋ ‡๋‹ค๋ฉด ํŒŒ์ด์ฌ์€ ์–ด๋–ค์‹์œผ๋กœ Database์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ผ๊นŒ์š”? Java์˜ ๊ฒฝ์šฐ๋Š” JDBC๋ผ๋Š” Database Connector๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ Database ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•œ๋ฐ์š”. Pyt..

2021. 3. 14. 16:53

[FastAPI] 8. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ SQLAlchemy์˜ scoped_session์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ด์œ 

์•„๋ž˜์˜ ํฌ์ŠคํŠธ์—์„œ FastAPI๊ฐ€ SQLAlchemy์™€ ์—ฐ๋™ํ•˜์˜€์„ ๋•Œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด ๋ฏธํกํ•˜๋‹ค๋Š” ๋‹จ์ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์—ˆ๋˜ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 2020.12.27 - [Programming/Python] - [FastAPI] 2. SQLAlchemy๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ CRUD API ๋งŒ๋“ค๊ธฐ [FastAPI] 2. SQLAlchemy๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ CRUD API ๋งŒ๋“ค๊ธฐ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ORM์— ๋Œ€ํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ORM์€ Object Relation Mapping์˜ ์•ฝ์ž๋กœ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Entity์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ blog.neonkid.xyz ์ด ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฃฌ SQLAlchemy์˜ scoped_session์— ๋Œ€ํ•ด ์ข€ ๋” ..

2021. 2. 27. 16:39

[FastAPI] 7. Google-auth ๋ฐ PyJWT๋ฅผ ์ด์šฉํ•œ OAuth2 ์ธ์ฆ ๊ตฌํ˜„ 2

์ง€๋‚œ ๊ธ€์— ์ด์–ด์„œ ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” OAuth2 ์ธ์ฆ ํ† ํฐ์„ API์—์„œ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. HTTP Header ์šฐ๋ฆฌ๊ฐ€ REST API๋ฅผ ํ†ต์‹ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” HTTP ํ”„๋กœํ† ์ฝœ์€ Header์™€ Body๋ผ๋Š” ๊ตฌ์กฐ๋กœ ์ด๋ค„์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. Header์™€ Body ๋ชจ๋‘ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ Header์—๋Š” ์ „์†กํ•˜๊ณ ์ž ํ•˜๋Š” ์„œ๋ฒ„ ํ˜น์€ ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด ๋‚ด์ง€ ์ „์†กํ•˜๊ณ ์ž ํ•˜๋Š” ๋Œ€์ƒ์— ๋ถ€๊ฐ€์ ์ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค„ ๋–„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‰ฌ์šด ์˜ˆ์‹œ๋กœ ์œ„์™€ ๊ฐ™์ด ๋กœ์ปฌ ์„œ๋ฒ„์—๊ฒŒ GET ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ˜ธ์ถœ์„ ์ „๋‹ฌํ–ˆ์„ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋Œ€์ƒ์ž์—๊ฒŒ ๋ถ€๊ฐ€์ ์ธ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก Key-value ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘์—์„œ ๊ฐ€..

2021. 2. 13. 13:26

[FastAPI] 6. Google-auth ๋ฐ PyJWT๋ฅผ ์ด์šฉํ•œ OAuth2 ์ธ์ฆ ๊ตฌํ˜„ 1

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ธ์ฆ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. Spring์—์„œ๋Š” Spring Security๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ธ์ฆ์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ•˜์ง€ ์•Š๊ณ ๋„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•˜์—ฌ Google ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ Client ID๋ฅผ ๋ฏธ๋ฆฌ ๋ฐœ๊ธ‰๋ฐ›์€ ํ›„ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ๊ตฌํ˜„์ฒด๋งŒ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋ ต์ง€ ์•Š๊ฒŒ OAuth2 ์ธ์ฆ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์ฃ . FastAPI๋„ ์ด์™€ ๋น„์Šทํ•˜๊ฒŒ OAuth2 ์ธ์ฆ์„ ๊ตฌํ˜„ํ•˜์ง€๋งŒ JWT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์—๋Š” ๋ณ„๋„์˜ ๊ตฌํ˜„ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ด ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  OAuth2 ์ธ์ฆ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. [Spring boot] Spring boot Security๋กœ ์‹œ์ž‘ํ•ด๋ณด๋Š” ์ธ์ฆ Spring ..

2021. 1. 31. 00:11

[FastAPI] 5. pyyaml์„ ์ด์šฉํ•œ FastAPI ํ™˜๊ฒฝ ๋‚˜๋ˆ„๊ธฐ

FastAPI๋กœ ๊ธฐ๋ณธ์ ์ธ API์™€ ๋ฌธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ์ž‘์—… ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํ•ด๋ดค๋‹ค๋ฉด ์ด์ œ๋Š” ๋ณธ๊ฒฉ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ํ™˜๊ฒฝ์„ ๋‚˜๋ˆ„์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ™˜๊ฒฝ์ด๋ผ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ผ๊นŒ์š”? ๊ฐœ๋ฐœ ํ™˜๊ฒฝ? ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” PyCharm์„ ์‚ฌ์šฉํ•˜๊ณ  Python์„ ์„ค์น˜ํ–ˆ๊ณ  ์ด๋ฏธ ๋‹ค ์ž‘์—…ํ•œ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€์š”? 2021/01/16 - [Programming/Python] - [FastAPI] 4. SQLAlchemy + Alembic ์กฐํ•ฉ์„ ์ด์šฉํ•œ Database Migration ๊ฐ€์ด๋“œ [FastAPI] 4. SQLAlchemy + Alembic ์กฐํ•ฉ์„ ์ด์šฉํ•œ Database Migration ๊ฐ€์ด๋“œ ์›น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•œ ๋’ค์— ๋ฐ˜๋“œ์‹œ ํ•œ ๋ฒˆ ์ฏค ๋”ฐ๋ฅด๋Š” ์—…๋ฐ์ดํŠธ ์‚ฌํ•ญ์ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด..

2020. 12. 31. 15:41

[FastAPI] 3. SQLAlchemy + Graphene ์กฐํ•ฉ์œผ๋กœ GraphQL ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” GraphQL์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. What is GraphQL ? GraphQL์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋Š” ๊ทธ๋ฆฌ ๊ธธ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. GraphQL์€ Facebook์—์„œ ๊ฐœ๋ฐœํ•œ ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ์–ธ์–ด๋กœ ์—ฌ๊ธฐ์„œ QL์ด Query Language์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด REST API๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ , REST API๋Š” ๋ฉ”์†Œ๋“œ์™€ ์š”์ฒญ ๋ฐ์ดํ„ฐ ํ˜น์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•˜๋Š” ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ GraphQL์€ ๋ฉ”์†Œ๋“œ ์—†์ด ์˜ค์ง Query Language๋งŒ์„ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋ชจ๋ธ์„ ์ ์žฌํ•˜๊ณ , ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์›ํ•˜๋Š” ํ•ญ๋ชฉ์„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ๋ช…์‹œํ•จ์œผ๋กœ์จ ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š”..

2020. 12. 27. 12:14

[FastAPI] 2. SQLAlchemy๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ CRUD API ๋งŒ๋“ค๊ธฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ORM์— ๋Œ€ํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ORM์€ Object Relation Mapping์˜ ์•ฝ์ž๋กœ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Entity์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ DB์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ SQL Query๋ฅผ ๋˜์ ธ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ SQL Query๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด์—๊ฒŒ ์žˆ์–ด ๋Ÿฌ๋‹ ์ปค๋ธŒ๋ฅผ ์ฆ๊ฐ€ ์‹œํ‚ค๊ณ , ์†Œํ”„ํŠธ์›จ์–ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›์ธ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ORM์„ ์ด์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์ธ CRUD๋ฅผ ํฌํ•จํ•œ ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด SQL Query๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ์— ์งˆ์˜ํ•˜์ง€ ์•Š์•„๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python ์–ธ์–ด์—์„œ์˜ ๋Œ€ํ‘œ์ ์ธ ORM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ SQLAlch..

2020. 12. 25. 16:42

[FastAPI] 1. GET, POST, PUT, DELETE ๋“ฑ ๊ธฐ๋ณธ API ๋งŒ๋“ค๊ณ  ๋ฌธ์„œ ์ž๋™ํ™” ํ•ด๋ณด๊ธฐ

์ง€๋‚œ ๊ธ€์— ์ด์–ด์„œ FastAPI๋ฅผ ์ด์šฉํ•ด์„œ ๊ธฐ๋ณธ์ ์ธ REST API ๊ฐœ๋ฐœ ์ด์•ผ๊ธฐ ๋‘ ๋ฒˆ์งธ๋ฅผ ์ด์–ด๊ฐ€๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ REST API๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด ์ฃผ์š” ๋ฉ”์†Œ๋“œ ์ข…๋ฅ˜ 5๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ์š”. ๋ฐ”๋กœ GET, POST, PUT, DELETE, PATCH ์ด๋ ‡๊ฒŒ 5๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ์™ธ์—๋„ OPTIONS๊ฐ€ ์žˆ์ง€๋งŒ ์ด ๊ธ€์—์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ API ๋งŒ๋“ค๊ธฐ (GET) REST API์˜ ๊ธฐ๋ณธ API๋Š” ๋จผ์ € GET ๋ฉ”์†Œ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. GET ๋ฉ”์†Œ๋“œ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์“ฐ๋Š” READ API ์ž…๋‹ˆ๋‹ค. FastAPI์—์„œ๋Š” ์•„๋ž˜์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. from fastapi import FastAPI app = FastAPI() @app.route('/health') async ..

2020. 12. 25. 15:16

[Python] FastAPI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ REST API ๊ฐœ๋ฐœ

Python ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ REST API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตญ๋‚ด ํ˜น์€ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์‚ฌ๋ž‘์„ ๋ฐ›๊ณ  ์žˆ๋Š” Django, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋ฒผ์šด ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์จ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Flask ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ์š”. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Jetbrains์˜ IDE ๋„๊ตฌ์ธ PyCharm๊ณผ FastAPI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•ด์„œ REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. What is FastAPI? Python์—์„œ๋Š” ์›น ์„œ๋ฒ„์™€ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด WSGI๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ WSGI๋Š” ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์‚ฌ๋žŒ์ด ๊ณ„์† ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๋‹จ์ ์„ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. FastAPI๋Š” Starlette์ด๋ผ๋Š” ๋น„๋™๊ธฐ ํ”„..