Loading...
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์—์„œ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ..

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. 5. 20. 21:04

[Spring boot] Spring Data Rest๋ฅผ ์ด์šฉํ•œ REST API ๊ฐœ๋ฐœ 2

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ Spring Data Rest๋ฅผ ์ด์šฉํ•ด Domain๊ณผ Repository Interface๋งŒ์„ ๊ตฌํ˜„ํ•˜์—ฌ HATEOAS์— ์ค€์ˆ˜ํ•œ REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ REST API๋ฅผ ์„ค๊ณ„ํ•˜๋‹ค๋ณด๋ฉด, HATEOAS์˜ ๊ตฌ์กฐ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ ํด๋ž˜์Šค์˜ ์ •๋ณด๊ฐ€ ๋‚˜์˜จ๋‹ค๊ฑฐ๋‚˜, ์ด ์™ธ์˜ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๊ฑฐ๋‚˜, ๋งŒ์•ฝ User ์ •๋ณด๋ฅผ ๊ฐ€์ ธ๋‹ค ์ค€๋‹ค๋ฉด, ํŒจ์Šค์›Œ๋“œ ์ •๋ณด์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์ˆจ๊ฒจ์•ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Spring Data Rest์— Controller + Service ์กฐํ•ฉ์„ ๋„ฃ์–ด์„œ ๋‚˜๋งŒ์˜ REST API๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. RepositroyRestController ์ง€๋‚œ ํฌ..

2020. 5. 20. 11:13

[Spring boot] Spring Data Rest๋ฅผ ์ด์šฉํ•œ REST API ๊ฐœ๋ฐœ 1

MVC ํŒจํ„ด์— ์ด์–ด์„œ, ์ด๋ฒˆ์—๋Š” Spring Data Rest๋ฅผ ์ด์šฉํ•˜์—ฌ REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. MVC ํŒจํ„ด์—์„œ๋Š” Domain, Controller, Repository ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๋ฅผ ์ด์šฉํ•˜์˜€๊ณ , ์ถ”๊ฐ€๋กœ Service ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋”์šฑ ์„ธ๋ถ€์ ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Spring Data Rest๋Š” VC๋ฅผ ์ƒ๋žตํ•˜๊ณ , ์˜ค์ง Domain๊ณผ Repository๋งŒ์„ ๊ฐ€์ง€๊ณ  ์•„์ฃผ ์‰ฝ๊ฒŒ REST API ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ์‹œ์ž‘ํ•ด๋ณด๋„๋ก ํ•˜์ฃ . ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ค€๋น„ ๊ธฐ์กด์˜ MVC ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ๋˜ ๋””ํŽœ๋˜์‹œ์—์„œ ์ผ๋ถ€ ๋ณ€๊ฒฝํ•˜์—ฌ, Rest Repositores ์„ ํƒํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. Spring Data Rest์—์„œ๋Š” base-path๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ชจ๋“  A..

2020. 5. 19. 21:47

[Spring boot] MVC ํŒจํ„ด์„ ์ด์šฉํ•œ REST API ๊ฐœ๋ฐœ

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ REST API๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ์„ค๊ณ„๋ฅผ ํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค„๋ดค์Šต๋‹ˆ๋‹ค. REST API๋Š” HTTP Method๋ฅผ ์ด์šฉํ•˜์—ฌ ํ–‰์œ„๋ฅผ ์ •ํ•˜๊ณ , URI๋ฅผ ์ด์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์„œ๋ฒ„์˜€๋Š”๋ฐ์š”. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” MVC ํŒจํ„ด + Spring boot 2.x ์กฐํ•ฉ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. What is MVC ? MVC ํŒจํ„ด์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ๊ธ€์—์„œ ๋‹ค๋ค„ ๋ณธ์ ์ด ์žˆ๋Š”๋ฐ์š”. ํ˜น์‹œ MVC ํŒจํ„ด์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋ณต์Šตํ•ด๋ณด์‹œ๊ฑฐ๋‚˜, ์ž˜ ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด, ์•„๋ž˜์˜ ๊ธ€์„ ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. 2016/12/29 - [Programming/JavaFX] - MVC Pattern์— ๊ธฐ๋ฐ˜ํ•œ GUI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ JavaFX MVC Pattern์— ๊ธฐ๋ฐ˜ํ•œ GUI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ..

2020. 5. 19. 18:40

[Spring boot] REST API์˜ ๊ธฐ์ดˆ์™€ ์„ค๊ณ„

Spring boot๊ฐ€ ๊ธฐ์กด์˜ Spring์— ๋น„ํ•ด ๋‹ค์–‘ํ•œ ์„ค์ •๋“ค์„ ์ž๋™ํ™” ์‹œ์ผœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์„ ์ค„์ด๊ณ , ์ž„๋ฒ ๋””๋“œ ํ†ฐ์บฃ์„ ํƒ‘์žฌํ•˜์—ฌ ๋” ์‰ฌ์šด ๊ฐœ๋ฐœ๋“ค์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Spring boot๋กœ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•ด๋ณด๋Š” ์ฒซ ๋‹จ์ถ”์ธ REST API์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. What is REST API ? REST API๋ž€, REST(Representational State Transfer)์˜ ์•ฝ์ž๋กœ '๋Œ€ํ‘œ์ ์ธ ์ƒํƒœ ์ „๋‹ฌ'์ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์›น๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ํ•˜์ดํผ๋ฏธ๋””์–ด ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ†ต์‹  ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ณธ๋ž˜ ์›น์€ ์ „์†ก ๋ฐฉ์‹์œผ๋กœ HTTP ํ”„๋กœํ† ์ฝœ์„, ์‹๋ณ„ ๋ฐฉ๋ฒ•์œผ๋กœ URI๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ํ˜ผ๋™ํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์€ URL๊ณผ URI๋Š” ๋‹ค๋ฆ…..

2020. 4. 21. 10:59

[Spring boot] ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•œ HTTP API ๊ตฌํ˜„

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ IntelliJ IDEA๋ฅผ ์ด์šฉํ•˜์—ฌ Spring boot ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์‹œ๊ฐ„์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ธฐ์กด์˜ Spring์— ๋น„ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์ ˆ์ฐจ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ , ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •๋„ ๊นŒ๋‹ค๋กญ์ง€ ์•Š์€ ๋ชจ์Šต์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ๊ทธ์— ์ด์–ด์„œ ๊ฐ„๋‹จํ•œ HTTP API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Hello World ๊ฐ€์žฅ ๋จผ์ € ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ์ข‹๊ฒ ์ฃ ? REST API์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๋ฐ›์ง€ ์•Š๊ณ , ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฉ”์†Œ๋“œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” GET ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด Hello World๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. package xyz.neonkid.blogexample import org.springframework..

[GP] Spring boot์—์„œ REST API ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•ด๋ณด๊ธฐ

์ด ๊ธ€์€ N.K Dev Lab์—์„œ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์•ˆ๋…•ํ•˜์„ธ์š”. N.K Dev Lab์— ๊ธ€์„ ์•ˆ์“ด์ง€๊ฐ€ ์ •๋ง ์˜ค๋ž˜๋˜์—ˆ๋„ค์š”. ์˜ฌํ•ด๋Š” ์ €์˜ ์ทจ์—… ์‹œ์ฆŒ์ธ ๋งŒํผ ๋ธ”๋กœ๊ทธ์— ๊ธ€์„ ์“ฐ๋Š” ๊ฒƒ์— ๋งŽ์ด ์†Œํ™€ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”์šฑ์ด Dev Lab ๋ฆฌ๋‰ด์–ผ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ผ๋“ค์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ €์˜ Dev Lab์ด ๋‹ค์‹œ Jekyll๋กœ ๋Œ์•„์˜ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์ด์ œ ์ œ๊ฐ€ ์ทจ์—…์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํ˜„์žฌ ํ•˜๊ณ  ์žˆ๋Š” ์ผ๋“ค์„ ์กฐ๊ธˆ ๋ฏธ๋ฆฌ ๊ฐ„์†Œํ™” ํ•˜๋Š” ์ž‘์—…์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ œ Dev Lab์— ์˜ฌ๋ฆฌ๋Š” ๊ธ€์€ ์ €์˜ ์†์— ์˜ํ•ด ์ˆ˜๋™์œผ๋กœ NKLAB(Tistory)์— ๊ฒŒ์‹œ๋˜์ง€ ์•Š๊ณ  ์ž๋™ํ™” ๋œ ์ฝ”๋“œ์— ์˜ํ•ด์„œ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋˜๋Š” ์ž‘์—… ๋“ฑ Hugo ๋ณด๋‹ค๋Š” Jekyll์ด ์ข€ ๋” ํŽธํ•˜๋”๊ตฐ์š”. ๋ณธ๋ก ์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ, ์˜ค๋Š˜์€ Sp..

[GP] Spring boot์—์„œ REST API ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•ด๋ณด๊ธฐ

์ด ๊ธ€์€ N.K Dev Lab์—์„œ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์•ˆ๋…•ํ•˜์„ธ์š”. N.K Dev Lab์— ๊ธ€์„ ์•ˆ์“ด์ง€๊ฐ€ ์ •๋ง ์˜ค๋ž˜๋˜์—ˆ๋„ค์š”. ์˜ฌํ•ด๋Š” ์ €์˜ ์ทจ์—… ์‹œ์ฆŒ์ธ ๋งŒํผ ๋ธ”๋กœ๊ทธ์— ๊ธ€์„ ์“ฐ๋Š” ๊ฒƒ์— ๋งŽ์ด ์†Œํ™€ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”์šฑ์ด Dev Lab ๋ฆฌ๋‰ด์–ผ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ผ๋“ค์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ €์˜ Dev Lab์ด ๋‹ค์‹œ Jekyll๋กœ ๋Œ์•„์˜ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์ด์ œ ์ œ๊ฐ€ ์ทจ์—…์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํ˜„์žฌ ํ•˜๊ณ  ์žˆ๋Š” ์ผ๋“ค์„ ์กฐ๊ธˆ ๋ฏธ๋ฆฌ ๊ฐ„์†Œํ™” ํ•˜๋Š” ์ž‘์—…์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ œ Dev Lab์— ์˜ฌ๋ฆฌ๋Š” ๊ธ€์€ ์ €์˜ ์†์— ์˜ํ•ด ์ˆ˜๋™์œผ๋กœ NKLAB(Tistory)์— ๊ฒŒ์‹œ๋˜์ง€ ์•Š๊ณ  ์ž๋™ํ™” ๋œ ์ฝ”๋“œ์— ์˜ํ•ด์„œ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋˜๋Š” ์ž‘์—… ๋“ฑ Hugo ๋ณด๋‹ค๋Š” Jekyll์ด ์ข€ ๋” ํŽธํ•˜๋”๊ตฐ์š”. ๋ณธ๋ก ์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ, ์˜ค๋Š˜์€ Sp..