
๐ OAuth (Open Authorization)๋ ๋ฌด์์ธ๊ฐ์?
OAuth๋ Open Authorization์ ์ฝ์๋ก, ์ธํฐ๋ท ์ฌ์ฉ์๋ค์ด ์์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ ์ ๊ณตํ์ง ์๊ณ ๋ ๋ค๋ฅธ ์น์ฌ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ (์ดํ ํด๋ผ์ด์ธํธ)์ด ๋ณธ์ธ์ ์ ๋ณด(๋ฆฌ์์ค)์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ ์ ์๋๋ก ํ๋ ์ ๊ทผ ์์์ ์ํ ๊ฐ๋ฐฉํ ํ์ค ํ๋กํ ์ฝ์ ๋๋ค.
์ฝ๊ฒ ๋งํด, ์ฐ๋ฆฌ๊ฐ ํํ ๋ณด๋ "Google ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ", "์นด์นด์คํก์ผ๋ก ๋ก๊ทธ์ธ"๊ณผ ๊ฐ์ ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ด ๋ฐ๋ก ์ด OAuth๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ ๋ํ์ ์ธ ์์์ ๋๋ค.
๐ OAuth์ ํต์ฌ ์๋ฆฌ
OAuth๋ ์ฌ์ฉ์์ ์ธ์ฆ(Authentication) ๋์ ์ธ๊ฐ(Authorization), ์ฆ ๊ถํ ๋ถ์ฌ๋ฅผ ์ํ ํ๋กํ ์ฝ์ ๋๋ค. ์ฌ์ฉ์ ์๊ฒฉ ์ฆ๋ช (ID/PW)์ ํด๋ผ์ด์ธํธ์ ์ง์ ๋ ธ์ถํ์ง ์๊ณ , **Access Token(์ ๊ทผ ํ ํฐ)**์ ์ฌ์ฉํ์ฌ ์ ํ๋ ๋ฒ์์ ๊ถํ์ ์์ํฉ๋๋ค.
๐ฅ ์ฃผ์ ์ญํ (์ฃผ์ฒด)
OAuth 2.0 ํ๋กํ ์ฝ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ๋ค ๊ฐ์ง ์ฃผ์ ์ฃผ์ฒด๊ฐ ๊ด์ฌํฉ๋๋ค.
- ๋ฆฌ์์ค ์์ ์ (Resource Owner):
- ์์ ์ด ์์ ํ ๋ฐ์ดํฐ(๋ฆฌ์์ค)์ ์ ๊ทผ์ ํ์ฉํ ์ฌ์ฉ์์ ๋๋ค. (์: Google ๊ณ์ ์์ ์)
- ํด๋ผ์ด์ธํธ (Client):
- ๋ฆฌ์์ค ์์ ์๋ฅผ ๋์ ํ์ฌ ๋ฆฌ์์ค ์๋ฒ์ ์ ๊ทผ์ ์์ฒญํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์น์ฌ์ดํธ์ ๋๋ค. (์: ํน์ ์ผํ๋ชฐ ์น์ฌ์ดํธ)
- ๋ฆฌ์์ค ์๋ฒ (Resource Server):
- ์ฌ์ฉ์์ ๋ณดํธ๋ ๋ฆฌ์์ค(๋ฐ์ดํฐ)๋ฅผ ์ ์ฅํ๊ณ ์๋ ์๋ฒ์ ๋๋ค. (์: Google ์๋ฒ)
- ๊ถํ ๋ถ์ฌ ์๋ฒ (Authorization Server):
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ์ ๊ทผ ํ ํฐ์ ๋ฐ๊ธํด์ฃผ๋ ์๋ฒ์ ๋๋ค. (์ผ๋ฐ์ ์ผ๋ก ๋ฆฌ์์ค ์๋ฒ์ ๋์ผํ๊ฑฐ๋ ๋ฐ์ ํ๊ฒ ์ฐ๋๋์ด ์์ต๋๋ค.)
๐ ์๋ ๋ฐฉ์์ ๊ฐ๋ตํ (Authorization Code Grant Type ๊ธฐ์ค)
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ์์ธ ๊ถํ ๋ถ์ฌ ์ฝ๋(Authorization Code) ๋ฐฉ์์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํด๋ผ์ด์ธํธ์ ๊ถํ ์์ฒญ: ์ฌ์ฉ์๊ฐ ํด๋ผ์ด์ธํธ(์ผํ๋ชฐ)์์ "Google๋ก ๋ก๊ทธ์ธ"์ ์๋ํฉ๋๋ค.
- ๋ฆฌ์์ค ์์ ์์ ์ธ์ฆ ๋ฐ ๋์: ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์๋ฅผ ๊ถํ ๋ถ์ฌ ์๋ฒ (Google ๋ก๊ทธ์ธ ํ์ด์ง)๋ก ๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค. ์ฌ์ฉ์๋ Google์ ๋ก๊ทธ์ธํ๊ณ , ํด๋ผ์ด์ธํธ๊ฐ **์์ฒญํ ๋ฒ์(Scope)**์ ์ ๋ณด(์: ์ด๋ฆ, ์ด๋ฉ์ผ ์ฃผ์)์ ์ ๊ทผํ๋ ๊ฒ์ ๋์ํฉ๋๋ค.
- ๊ถํ ๋ถ์ฌ ์ฝ๋ ๋ฐ๊ธ: ๋์๊ฐ ์๋ฃ๋๋ฉด, ๊ถํ ๋ถ์ฌ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ฌ์ฉํ ์ ์๋ ์ผํ์ฉ ์ฝ๋์ธ **๊ถํ ๋ถ์ฌ ์ฝ๋(Authorization Code)**๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ์ ๊ทผ ํ ํฐ ์์ฒญ ๋ฐ ๋ฐ๊ธ: ํด๋ผ์ด์ธํธ๋ ๋ฐ์ ๊ถํ ๋ถ์ฌ ์ฝ๋์ ์์ ์ Client ID, Client Secret์ ๊ถํ ๋ถ์ฌ ์๋ฒ์ ์ ์กํ์ฌ, ์ต์ข ์ ์ผ๋ก **Access Token(์ ๊ทผ ํ ํฐ)**์ ์์ฒญํฉ๋๋ค.
- ๋ฆฌ์์ค ์ ๊ทผ: ํด๋ผ์ด์ธํธ๋ ๋ฐ๊ธ๋ฐ์ Access Token์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์๋ฒ์ ์ ๊ทผํ์ฌ ์ฌ์ฉ์์ ๋์๋ ๋ฒ์ ๋ด์ ์ ๋ณด(์: ํ๋กํ ์ ๋ณด)๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๐ก OAuth๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ๋ณด์์ฑ ๊ฐํ: ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ์์ ๋ฏผ๊ฐํ ๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ ์ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ ๋น๋ฐ๋ฒํธ ๋ ธ์ถ ์ํ์ ์ต์ํํฉ๋๋ค.
- ์ ๊ทผ ๋ฒ์ ์ ํ (Scope): ํด๋ผ์ด์ธํธ์๊ฒ ํ์ํ ์ต์ํ์ ๊ถํ๋ง ๋ถ์ฌํ ์ ์์ต๋๋ค. (์: '์ด๋ฉ์ผ ์ฃผ์ ์ฝ๊ธฐ' ๊ถํ๋ง ๋ถ์ฌํ๊ณ , '์บ๋ฆฐ๋ ์ผ์ ์์ ' ๊ถํ์ ๋ง์ ์ ์์ต๋๋ค.)
- ๊ฐํธํ ์ฌ์ฉ์ ๊ฒฝํ: ์ฌ์ฉ์๋ ์ด๋ฏธ ๊ณ์ ์ด ์๋ ๋ํ ์๋น์ค(Google, Naver ๋ฑ)๋ฅผ ํตํด ๊ฐํธํ๊ฒ ๋ค๋ฅธ ์๋น์ค์ ๋ก๊ทธ์ธํ ์ ์์ต๋๋ค.
๐ก๏ธ OAuth์ JWT (JSON Web Token)์ ๊ด๊ณ
OAuth์์ JWT๋ ๋ฌด์์ธ๊ฐ์?
OAuth๋ฅผ ์ดํดํ๋ค ๋ณด๋ฉด JWT(Json Web Token) ์ด๋ผ๋ ์ฉ์ด๊ฐ ์์ฃผ ๋ฑ์ฅํฉ๋๋ค.
๊ฐ๋จํ๊ฒ ๋งํ๋ฉด **์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ “๋์งํธ ์๋ช
๋ ํ ํฐ ํ์”**์
๋๋ค.
OAuth ์์ฒด๊ฐ "๊ถํ์ ์์ํ๋ ํ๋กํ ์ฝ"์ด๋ผ๋ฉด,
JWT๋ ๊ทธ ๊ณผ์ ์์ ์ฐ์ผ ์ ์๋ ํ ํฐ์ ํํ๋ผ๊ณ ์ดํดํ๋ฉด ๋ฉ๋๋ค.
๐ JWT๋ฅผ ํ ๋ฌธ์ฅ์ผ๋ก ์ ์ํ๋ฉด?
"์ฌ์ฉ์ ์ ๋ณด์ ๊ถํ์ ๋ด๊ณ ์์ผ๋ฉฐ, ์๋ณ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋๋ก ์๋ช ๋ ์์ถ ํ ํฐ"
๋น๋ฐ๋ฒํธ๋ ํฌํจ๋์ง ์๊ณ , ์ธ์ฆ ํ ์ฌ์ฉ์ ์ํ๋ฅผ ์ ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
JWT๊ฐ ์ OAuth์์ ์ฌ์ฉ๋ ๊น?
โ 1) ๊ฐ๋ฒผ์
JWT๋ ๋ฌธ์์ด ํ๋๋ก ๋ชจ๋ ์ ๋ณด๊ฐ ๋ด๊ฒจ ์์ด ์๋ฒ ๊ฐ ์ ๋ฌํ๊ธฐ ์ฝ์ต๋๋ค.
โ 2) ๋ฌด์ํ(Stateless)
์๋ฒ์์ ์ธ์ ์ ๊ธฐ์ตํ ํ์ ์์ด, ํ ํฐ๋ง ๊ฒ์ฆํ๋ฉด ๋ฉ๋๋ค.
โ 3) ์·๋ณ์กฐ ๋ฐฉ์ง
์๋ช (Signature)์ด ํฌํจ๋์ด ์์ด, ๋๊ฐ ํ ํฐ์ ๋ฐ๊ฟ์น๊ธฐํ๋ฉด ์ฆ์ ๊ฒ์ฆ์์ ์คํจํฉ๋๋ค.
โ 4) Access Token ํ์์ผ๋ก ์์ฃผ ์ฌ์ฉ
OAuth์ Access Token์ด ๋ฐ๋์ JWT์ผ ํ์๋ ์์ง๋ง,
๊ตฌ๊ธ·์ ํ·๋ง์ดํฌ๋ก์ํํธ ๋ฑ ์ต์ ์๋น์ค๋ค์ JWT ํ์์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
JWT๋ ์ด๋ป๊ฒ ์๊ฒผ๋์?
JWT๋ ์ (.)์ผ๋ก ๊ตฌ๋ถ๋ 3๊ฐ์ ๋ฉ์ด๋ฆฌ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค:
์์:
1) Header
์ฌ์ฉํ ์๊ณ ๋ฆฌ์ฆ ์ ๋ณด
์: HS256, RS256
2) Payload
์ฌ์ฉ์ ์ ๋ณด(Claims๋ผ๊ณ ๋ถ๋ฆ)
์: userId, ์ด๋ฉ์ผ, ๋ง๋ฃ ์๊ฐ(exp)
3) Signature
๋น๋ฐํค๋ก ์ํธํํ ์๋ช → ์์กฐ ๋ฐฉ์ง ๊ธฐ๋ฅ
OAuth์ JWT์ ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ์ค๋ช ํ๋ฉด
OAuth = ๋ก๊ทธ์ธ/์ธ์ฆ์ ์ฒ๋ฆฌํ๋ “์ ์ฐจ”
JWT = ๊ทธ ์ ์ฐจ์์ ๋ฐ๊ธ๋๋ “์ฆํ(ํ ํฐ)”
์นดํ ๋น์ ๋ก ๋ณด๋ฉด,
- OAuth = ์นดํ์์ ์ ๋ถ์ฆ ํ์ธํ๊ณ ๋์ฅ ์ฐ๋ ๊ณผ์
- JWT = ๋์ฅ์ด ์ฐํ ์ถ์ ์ฆ ์์ฒด
์ ๋ฆฌ
- JWT๋ ์๋ช ๋ ํ ํฐ ํฌ๋งท
- OAuth์์ Access Token ํน์ ID Token ํํ๋ก ์์ฃผ ์ฌ์ฉ
- ์์ ํ๊ณ ๊ฐ๋ฒผ์ ์๋ฒ ๊ฒ์ฆ์ด ๋น ๋ฆ
- ๊ตฌ์กฐ: Header + Payload + Signature
๐ฆ ํ์ด๋ก๋ (Payload)๋ ๋ฌด์์ธ๊ฐ์?
**ํ์ด๋ก๋(Payload)**๋ ์๋ ์ด์ก์ด๋ ๊ตฐ์ฌ์ฉ์ด์์ ํ์๋ ๊ฐ๋ ์ผ๋ก, ์ ๋ฌํ๊ณ ์ ํ๋ ์ค์ ๋ชฉ์ ๋ฐ์ดํฐ๋ ๋ฉ์์ง๋ฅผ ์๋ฏธํฉ๋๋ค. ์ปดํจํฐ ๊ณผํ์ด๋ ๋คํธ์ํน ๋ถ์ผ์์๋ ์ค๋ฒํค๋(Overhead)๋ฅผ ์ ์ธํ ํต์ฌ์ ์ธ ๋ด์ฉ๋ฌผ์ ๊ฐ๋ฆฌํต๋๋ค.
์ฝ๊ฒ ๋งํด, ์ด๋ฉ์ผ์ ๊ฒฝ์ฐ ํธ์ง ๋ณธ๋ฌธ ๋ด์ฉ์ด ํ์ด๋ก๋์ด๊ณ , ์ด๋ฉ์ผ ํค๋(๋ฐ์ ์, ์์ ์, ์ ๋ชฉ ๋ฑ)๋ ์ค๋ฒํค๋์ ๋๋ค.
๐ป IT ๋ถ์ผ์์์ ํ์ด๋ก๋
ํ์ด๋ก๋๋ ์ฌ์ฉ๋๋ ๋ถ์ผ์ ๋ฐ๋ผ ๋ค์ํ ์๋ฏธ๋ก ์ฌ์ฉ๋์ง๋ง, ํต์ฌ์ '์ ๋ฌ๋๋ ๋ฐ์ดํฐ์ ์์ง๋ฐฐ๊ธฐ'๋ผ๋ ์ ์ ๊ฐ์ต๋๋ค.
1. ์น ํต์ (HTTP)
- ์น์์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋, **HTTP ๋ฉ์์ง์ ๋ณธ๋ฌธ(Body)**์ด ํ์ด๋ก๋์ ๋๋ค.
- POST๋ PUT ์์ฒญ์ ๋ณด๋ผ ๋ ์๋ฒ๋ก ์ ์กํ๋ JSON ๋๋ XML ๋ฐ์ดํฐ๊ฐ ํ์ด๋ก๋์
๋๋ค.
- ์์: ์ผํ๋ชฐ์์ ์ํ์ ์ฃผ๋ฌธํ ๋ ์๋ฒ๋ก ๋ณด๋ด๋ ์ํ ID, ์๋, ๊ฒฐ์ ์ ๋ณด ๋ฑ์ด ํ์ด๋ก๋์ ๋๋ค.
- HTTP ํค๋(๋ฉ์๋, URL, ์ฝํ ์ธ ํ์ ๋ฑ)๋ ์ด ํ์ด๋ก๋๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ๋ถ๊ฐ์ ์ธ ์ ๋ณด(์ค๋ฒํค๋)์ ๋๋ค.
2. ํ๋ก๊ทธ๋๋ฐ (ํจ์/๋ฉ์๋)
- ํจ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ํจ์๊ฐ ์ค์ ์ฒ๋ฆฌํด์ผ ํ ๋ฐ์ดํฐ๋ **์ธ์(Argument)**๋ฅผ ํ์ด๋ก๋๋ผ๊ณ ๋น์ ์ ์ผ๋ก ํํํ๊ธฐ๋ ํฉ๋๋ค.
3. JWT (JSON Web Token)
- ์ด์ ๋ต๋ณ์์ ์ค๋ช ๋๋ ธ๋ฏ์ด, JWT์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ํด๋นํ๋ ๋ฐ์ดํฐ์ ๋๋ค.
- ์ฌ๊ธฐ์ ์ฌ์ฉ์ ID, ๊ถํ(Scope), ํ ํฐ ๋ง๋ฃ ์๊ฐ ๋ฑ ์ธ์ฆ์ ํ์ํ ํต์ฌ ์ ๋ณด(Claims)๊ฐ JSON ํํ๋ก ๋ด๊ฒจ ์์ต๋๋ค. ์ด ์ ๋ณด๊ฐ ๋ฐ๋ก JWT์ ํ์ด๋ก๋์ ๋๋ค.
4. ๋คํธ์ํฌ ํจํท (TCP/IP)
- ๋ฐ์ดํฐ๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ก๋ ๋ ํจํท ํํ๋ก ์ชผ๊ฐ์ง๋๋ค.
- ๊ฐ ํจํท์์ ํค๋(Header)์ ํธํฐ(Footer) (๋ฐ์ ์ง/๋ชฉ์ ์ง ์ฃผ์, ํ๋กํ ์ฝ ์ ๋ณด ๋ฑ)๋ฅผ ์ ์ธํ ์ค์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ํ์ด๋ก๋์ ๋๋ค.
- ํค๋์ ํธํฐ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ผ์ฐํ ํ๊ณ ์ค๋ฅ๋ฅผ ๊ฒ์ฌํ๋ ๋ฐ ํ์ํ ์ค๋ฒํค๋์ ๋๋ค.
๐๏ธ ์ค๋ฒํค๋(Overhead)์์ ๊ด๊ณ
ํ์ด๋ก๋๋ฅผ ์ดํดํ๋ ค๋ฉด ์ค๋ฒํค๋์์ ๊ด๊ณ๋ฅผ ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ ์ฒด ๋ฉ์์ง = ํ์ด๋ก๋ + ์ค๋ฒํค๋
- ํ์ด๋ก๋: ์ฌ์ฉ์๊ฐ ์ํ๋ ์ค์ ๋ฐ์ดํฐ. (์: ์ด๋ฉ์ผ ๋ณธ๋ฌธ)
- ์ค๋ฒํค๋: ํ์ด๋ก๋๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ํ์ํ ์ ์ด ์ ๋ณด, ์ฃผ์ ์ ๋ณด, ๋ณด์ ์ ๋ณด ๋ฑ. (์: ์ด๋ฉ์ผ ํค๋, ๋คํธ์ํฌ ํ๋กํ ์ฝ ํค๋)
๐ FastAPI๋ ๋ฌด์์ธ๊ฐ์?
FastAPI๋ **ํ์ด์ฌ(Python)**์ผ๋ก **API (Application Programming Interface)**๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ์ค๊ณ๋ ํ๋์ ์ด๊ณ ๋น ๋ฅด๋ฉฐ ๊ณ ์ฑ๋ฅ์ธ ์น ํ๋ ์์ํฌ์ ๋๋ค. ํนํ JSON ๊ธฐ๋ฐ์ ์น API๋ฅผ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ๊ณ ์์ต๋๋ค.
๐ FastAPI์ ์ฃผ์ ํน์ง
FastAPI๊ฐ ๊ฐ๋ฐ์๋ค์๊ฒ ์ธ๊ธฐ๋ฅผ ์ป๋ ์ฃผ์ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ฐ์ด๋ ์ฑ๋ฅ (Performance):
- Starlette (ASGI ์น ์๋ฒ)์ Pydantic ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
- Python ํ๋ ์์ํฌ ์ค์์๋ Node.js, Go์ ๊ฒฌ์ค ๋งํผ ๋งค์ฐ ๋น ๋ฅธ ์๋๋ฅผ ์๋ํฉ๋๋ค.
- ASGI(Asynchronous Server Gateway Interface)๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ(async/await)์ ์ง์, ๋์ ๋์์ฑ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์๋ ๋ฌธ์ํ (Automatic Docs):
- ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ง์ผ๋ก Swagger UI (OpenAPI)์ ReDoc ๊ธฐ๋ฐ์ API ๋ฌธ์๋ฅผ ์๋์ผ๋ก ์์ฑํด ์ค๋๋ค.
- ์ด๋ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ์๊ฐ์ ํฌ๊ฒ ์ ์ฝํด ์ค๋๋ค.
- ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ (Data Validation):
- Pydantic์ ์ฌ์ฉํ์ฌ ํ์ ํํธ(Type Hint)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ์ํ๊ณ , ๋ค์ด์ค๋ ์์ฒญ ๋ฐ์ดํฐ์ ๋๊ฐ๋ ์๋ต ๋ฐ์ดํฐ์ ๋ํ ์๋ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
- ์๋ชป๋ ๋ฐ์ดํฐ ํ์ ์ด๋ ๋๋ฝ๋ ํ๋๊ฐ ์์ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ์๋์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด ์ค๋๋ค.
- ์ฌ์ด ์ฌ์ฉ์ฑ:
- ํ์ค Python ํ์ ํํธ๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. IDE์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ต๋ํ ํ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์ด ์์ฐ์ฑ์ด ๋์ต๋๋ค.
๐ ๏ธ FastAPI์ ๊ธฐ๋ฐ ๊ธฐ์
FastAPI๋ ๋ค์ ๋ ๊ฐ์ง ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
1. Starlette (ASGI Web Framework)
- Starlette์ FastAPI์ ํต์ฌ ํ๋ ์์ํฌ ์ญํ ์ ํฉ๋๋ค.
- ASGI(Asynchronous Server Gateway Interface) ํ์ค์ ๋ฐ๋ฅด๋ฏ๋ก, ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ฅ์ํ๋ฉฐ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ๋ผ์ฐํ (Routing), ๋ฏธ๋ค์จ์ด(Middleware), ์ธ์ ๊ด๋ฆฌ ๋ฑ์ ๋ด๋นํฉ๋๋ค.
2. Pydantic (Data Validation & Settings Management)
- Pydantic์ ๋ฐ์ดํฐ ๋ชจ๋ธ ์ ์์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๋ด๋นํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- Python์ ํ์ค ํ์ ํํธ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ๊ฒ ์ ์ํ ์ ์์ผ๋ฉฐ, ๋ฐํ์์ ๋ฐ์ดํฐ๊ฐ ์ ์๋ ํ์๊ณผ ์ผ์นํ๋์ง ์๋์ผ๋ก ๊ฒ์ฌํฉ๋๋ค.
๐ก FastAPI ์ฌ์ฉ ์์ (Hello World)
FastAPI๋ก API๋ฅผ ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
from fastapi import FastAPI
# FastAPI ์ธ์คํด์ค ์์ฑ
app = FastAPI()
# ๋ฃจํธ ๊ฒฝ๋ก('/')์ ๋ํ GET ์์ฒญ ์ฒ๋ฆฌ ํจ์ ์ ์
@app.get("/")
def read_root():
# ๋ฐํ๋ Python ๋์
๋๋ฆฌ๋ ์๋์ผ๋ก JSON ์๋ต์ผ๋ก ๋ณํ๋ฉ๋๋ค.
return {"Hello": "World"}
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด, http://127.0.0.1:8000/docs์์ ์๋ ์์ฑ๋ API ๋ฌธ์๋ฅผ ๋ฐ๋ก ํ์ธํ ์ ์์ต๋๋ค.
FastAPI๋ API ๊ฐ๋ฐ ์๋์ ์ฑ๋ฅ์ ๋ชจ๋ ์ค์ํ๋ ํ๋์ ์ธ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ต์ ํ๋ ํ๋ ์์ํฌ์ ๋๋ค.
โ๏ธ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋ (Boilerplate Code)๋ ๋ฌด์์ธ๊ฐ์?
๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ ํ๋ก๊ทธ๋๋ฐ์์ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑํด์ผ ํ์ง๋ง, ๋น์ฆ๋์ค ๋ก์ง(ํต์ฌ ๊ธฐ๋ฅ)์๋ ์ง์ ์ ์ธ ์ํฅ์ ์ฃผ์ง ์๋ ์ฝ๋ ๋ถ๋ถ์ ๋งํฉ๋๋ค. ์ฆ, ์๋ก์ด ํ๋ก์ ํธ๋ ๊ธฐ๋ฅ์ ์์ํ ๋๋ง๋ค ๊ฑฐ์ ๋ณํ ์์ด ํ์ฒ๋ผ ๋ณต์ฌํด์ ๋ถ์ฌ๋ฃ์ด์ผ ํ๋ ํ์์ ์ธ ์ค๋น ์ฝ๋์ ๋๋ค.
๐งฑ ์ '๋ณด์ผ๋ฌ ํ๋ ์ดํธ'๋ผ๊ณ ๋ถ๋ฆด๊น์?
- ์ด ์ฉ์ด๋ ์๋ ์ธ์ ์ ๊ณ์์ ์ ๋ํ์ต๋๋ค.
- **๋ณด์ผ๋ฌ ํ๋ ์ดํธ(Boilerplate)**๋ ์์ ์ ์ ๋ฌธ์ด๋ ์ก์ง์์ ๊ด๊ณ ๋ ์นผ๋ผ์ ๊ณ ์ ๋ ์์์ด๋ ๋ฌธ๊ตฌ๋ฅผ ์ฐ์ด๋ด๋ ๋ฐ ์ฌ์ฉํ๋ **์ฃผ์ฒ ํ(steel plate)**์ ์๋ฏธํ์ต๋๋ค. ์ด ํ์ ๋ด์ฉ์ด ๊ฑฐ์ ๋ฐ๋์ง ์์๊ธฐ ๋๋ฌธ์, **'๋ ์ฐ๋ ์ํฌ์ ์ธ ๋ฌธ๊ตฌ'**๋ผ๋ ์๋ฏธ๋ก ํ์ฅ๋์์ต๋๋ค.
- ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก, ํต์ฌ ๋ด์ฉ(๊ธฐ๋ฅ)์ ๋ด๊ธฐ ์ํ ๊ณ ์ ๋ ํ ์ญํ ์ ํ๋ ์ฝ๋๋ฅผ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ผ๊ณ ๋ถ๋ฅด๊ฒ ๋์์ต๋๋ค.
๐ก ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋์ ์์
๋ค์์ ํ๋ก๊ทธ๋๋ฐ์์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๊ฐ ํํ ๋ฐ์ํ๋ ๋ํ์ ์ธ ์ํฉ๋ค์ ๋๋ค.
| ์ํฉ | ์ฝ๋์ ๋ชฉ์ | ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์์ |
| ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ | ํด๋์ค ํ๋(๋ณ์) ์ ๊ทผ ๋ฐ ์์ | Java๋ Kotlin์์ getter, setter ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๋ถ๋ถ. |
| ์น ํ๋ ์์ํฌ ์ด๊ธฐํ | ์๋น์ค ์์์ ์ํ ์ค๋น | ์น ์๋ฒ๋ฅผ ๋์ฐ๊ธฐ ์ํด ํ์ํ ์ค์ ํ์ผ์ ๋ถ๋ฌ์ค๊ณ ํ๋ ์์ํฌ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ ์ต์ํ์ ์ฝ๋. |
| ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด (DTO) | ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ๋ฌํ๋ ์ญํ | ๋ฐ์ดํฐ ํ๋๋ง ๊ฐ์ง๊ณ ์๊ณ , ๋ณ๋ค๋ฅธ ๋ก์ง ์์ด ์ค์ง ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ ํด๋์ค. |
| ์์ธ ์ฒ๋ฆฌ | ์ค๋ฅ ๋ฐ์ ์ ํ๋ก๊ทธ๋จ ์ข ๋ฃ ๋ฐฉ์ง | try...catch๋ try...except ๊ตฌ๋ฌธ์์ ์ค๋ฅ๋ฅผ ์ก๊ณ ๊ธฐ๋กํ๋ ๋ฐ๋ณต์ ์ธ ํจํด. |
๐ ํต์ฌ: ์ด ์ฝ๋๋ฅผ ์์ ๋ฉด ํ๋ก๊ทธ๋จ์ด ์๋ํ์ง ์์ง๋ง, ์ด ์ฝ๋๋ฅผ ๋ฐ๊พผ๋ค๊ณ ํด์ **ํ๋ก๊ทธ๋จ์ ํต์ฌ ๊ธฐ๋ฅ(์: ํ์๊ฐ์ , ๊ฒฐ์ )**์ด ๋ฌ๋ผ์ง์ง๋ ์์ต๋๋ค.
๐ค ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ ์ข์ ๊ฑด๊ฐ์, ๋์ ๊ฑด๊ฐ์?
- ํ์์ : ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ ํน์ ๊ตฌ์กฐ๋ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๊ธฐ ์ํด ๋ฐ๋์ ํ์ํฉ๋๋ค. (์: ๊ฐ์ฒด ์งํฅ ์ธ์ด์์ ๋ฐ์ดํฐ ์บก์ํ๋ฅผ ์ํ getter/setter)
- ๋จ์ : ํ์ง๋ง ์ฝ๋๋ฅผ ๊ธธ๊ณ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ , ๊ฐ๋ฐ์๊ฐ ๋ฐ๋ณต์ ์ธ ์์ ์ ์๊ฐ์ ๋ญ๋นํ๊ฒ ํ์ฌ ์์ฐ์ฑ์ ์ ํดํ ์ ์์ต๋๋ค.
โจ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ
ํ๋์ ๋ง์ ๊ธฐ์ ์ ์ด ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ฐ์ ํ๊ณ ์์ต๋๋ค.
- ์ธ์ด ๋ฐ ํ๋ ์์ํฌ ๊ธฐ๋ฅ ํ์ฉ:
- Python/JavaScript๋ Java๋ C++๋ณด๋ค ๋น๊ต์ ์ ์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์๊ตฌํฉ๋๋ค.
- FastAPI๋ Spring Boot ๊ฐ์ ์ต์ ํ๋ ์์ํฌ๋ ์ด๊ธฐ ์ค์ ์ ์ต์ํํด์ค๋๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ:
- Java์ Lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ getter/setter ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ์๋์ผ๋ก ์์ฑํด์ค๋๋ค.
- ์ฝ๋ ์์ฑ ๋๊ตฌ:
- **IDE (ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ)**์ ์๋ ์์ฑ์ด๋ ์ฝ๋ ์์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ญ๋๋ค.
Streamlit๊ฐ ๋ญ์์?
**Streamlit(์คํธ๋ฆผ๋ฆฟ)**์ ํ์ด์ฌ ์ฝ๋๋ง์ผ๋ก ์์ฃผ ์ฝ๊ฒ ์น ๋์๋ณด๋·์น ์ฑ์ ๋ง๋ค ์ ์๋ ์คํ์์ค ํ๋ ์์ํฌ์
๋๋ค.
HTML, CSS, JavaScript๋ฅผ ๋ชฐ๋ผ๋ ๋ฐ์ดํฐ ๋ถ์ ๊ฒฐ๊ณผ๋ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ฐ๋ก ์น์ฑ ํํ๋ก ์๊ฐํํ ์ ์๊ฒ ํด์ค์
๋ฐ์ดํฐ ์ฌ์ด์ธํฐ์คํธ๋ AI ๊ฐ๋ฐ์๋ค์ด ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
๐ ํ ์ค ์์ฝ
“ํ์ด์ฌ์ผ๋ก ์ฐ๋ฉด ๋ฐ๋ก ์น ์ฑ์ด ๋๋ ๋ง๋ฒ ๊ฐ์ ๋๊ตฌ”
์ ๋ง์ด ์ธ๊น?
โ 1) ์ค์น์ ์ฌ์ฉ์ด ๋งค์ฐ ์ฌ์
์ด๋ ๊ฒ๋ง ํ๋ฉด ๋ฐ๋ก ์น ํ์ด์ง๊ฐ ์ด๋ฆฝ๋๋ค.
โ 2) ๋์๋ณด๋๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์์
๋ฐ์ดํฐํ๋ ์, ๊ทธ๋ํ, ์ด๋ฏธ์ง, ํ ์คํธ ๋ชจ๋ ํ ์ค ์ฝ๋๋ก ํํ ๊ฐ๋ฅ.
โ 3) ๋จธ์ ๋ฌ๋/AI ๋ฐ๋ชจ ๋ง๋ค๊ธฐ ์ต์ ํ
๋ชจ๋ธ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๋ฐ ์์ฃผ ์ ํฉํฉ๋๋ค.
โ 4) ํ๋ก ํธ์๋ ์ง์ ํ์ ์์
๋ฒํผ, ์ฌ๋ผ์ด๋, ํ ์คํธ ์ ๋ ฅ์ฐฝ ๊ฐ์ UI๋ฅผ ํ์ด์ฌ์ผ๋ก ๋ฐ๋ก ๊ตฌํ.
์์๋ก ๋ณด๋ฉด ๋ ์ฌ์
์๋ 10์ค ์ ๋์ ์ฝ๋๋ง์ผ๋ก๋ ์น์ฑ์ด ๋ง๋ค์ด์ง๋๋ค:
์คํํ๋ฉด ์ ๋ ฅ์ฐฝ๊ณผ ๋ฒํผ์ด ์๋ ์น ํ์ด์ง๊ฐ ๋ฐ๋ก ์ด๋ฆฝ๋๋ค.
Streamlit์ ์ธ์ ์ฐ๋ฉด ์ข์๊น?
- ๋ฐ์ดํฐ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋๋ฃ์ ๊ณต์ ํ๊ณ ์ถ์ ๋
- AI ๋ชจ๋ธ ๋ฐ๋ชจ ํ์ด์ง๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ค๊ณ ์ถ์ ๋
- ์๋ฒ๊น์ง ๋ง๋ค๊ธฐ์ ๋ถ๋ด๋ ๋
- ํ๋ก ํธ์๋ ์์ด๋ ์น UI๊ฐ ํ์ํ ๋
ํต์ฌ ์์ฝ
- Streamlit = ํ์ด์ฌ ๊ธฐ๋ฐ ์ด๊ฐ๋จ ์น์ฑ ํ๋ ์์ํฌ
- ๋ฐ์ดํฐ, ๊ทธ๋ํ, ML ๋ชจ๋ธ ๋ฐ๋ชจ ๋ง๋ค๊ธฐ์ ๊ฐํจ
- ์ค์น & ์คํ์ด ๋งค์ฐ ๋น ๋ฅด๊ณ ๊ฐ๋จ
'Project ESG+AI > Tech Basics' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 37์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (0) | 2025.11.28 |
|---|---|
| 36์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (0) | 2025.11.27 |
| 34์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (1) | 2025.11.25 |
| 33์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (1) | 2025.11.24 |
| 32์ผ์ฐจ. IT ๊ฐ๋ ์ ๋ฆฌ (1) | 2025.11.21 |