๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/Tech Basics

35์ผ์ฐจ. IT ๊ฐœ๋… ์ •๋ฆฌ

by GreenJin_S2 2025. 11. 26.

 

๐ŸŒ 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) ๋ฐฉ์‹์˜ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ์˜ ๊ถŒํ•œ ์š”์ฒญ: ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ(์‡ผํ•‘๋ชฐ)์—์„œ "Google๋กœ ๋กœ๊ทธ์ธ"์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์˜ ์ธ์ฆ ๋ฐ ๋™์˜: ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ถŒํ•œ ๋ถ€์—ฌ ์„œ๋ฒ„ (Google ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€)๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” Google์— ๋กœ๊ทธ์ธํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ **์š”์ฒญํ•œ ๋ฒ”์œ„(Scope)**์˜ ์ •๋ณด(์˜ˆ: ์ด๋ฆ„, ์ด๋ฉ”์ผ ์ฃผ์†Œ)์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ถŒํ•œ ๋ถ€์—ฌ ์ฝ”๋“œ ๋ฐœ๊ธ‰: ๋™์˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ๊ถŒํ•œ ๋ถ€์—ฌ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผํšŒ์šฉ ์ฝ”๋“œ์ธ **๊ถŒํ•œ ๋ถ€์—ฌ ์ฝ”๋“œ(Authorization Code)**๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  4. ์ ‘๊ทผ ํ† ํฐ ์š”์ฒญ ๋ฐ ๋ฐœ๊ธ‰: ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ›์€ ๊ถŒํ•œ ๋ถ€์—ฌ ์ฝ”๋“œ์™€ ์ž์‹ ์˜ Client ID, Client Secret์„ ๊ถŒํ•œ ๋ถ€์—ฌ ์„œ๋ฒ„์— ์ „์†กํ•˜์—ฌ, ์ตœ์ข…์ ์œผ๋กœ **Access Token(์ ‘๊ทผ ํ† ํฐ)**์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  5. ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ: ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐœ๊ธ‰๋ฐ›์€ 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๊ฐœ์˜ ๋ฉ์–ด๋ฆฌ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค:

 
header.payload.signature

์˜ˆ์‹œ:

 
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywiaWF0IjoxNjg3MDM2MDB9.VZ0QjvF1mWqg...

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๊ฐ€ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ธ๊ธฐ๋ฅผ ์–ป๋Š” ์ฃผ์š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ (Performance):
    • Starlette (ASGI ์›น ์„œ๋ฒ„)์™€ Pydantic ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
    • Python ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘์—์„œ๋Š” Node.js, Go์™€ ๊ฒฌ์ค„ ๋งŒํผ ๋งค์šฐ ๋น ๋ฅธ ์†๋„๋ฅผ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ASGI(Asynchronous Server Gateway Interface)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(async/await)์„ ์ง€์›, ๋†’์€ ๋™์‹œ์„ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ž๋™ ๋ฌธ์„œํ™” (Automatic Docs):
    • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ Swagger UI (OpenAPI)์™€ ReDoc ๊ธฐ๋ฐ˜์˜ API ๋ฌธ์„œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค.
    • ์ด๋Š” ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ ˆ์•ฝํ•ด ์ค๋‹ˆ๋‹ค.
  3. ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (Data Validation):
    • Pydantic์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ํžŒํŠธ(Type Hint)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์ •์˜ํ•˜๊ณ , ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ ๋ฐ์ดํ„ฐ์™€ ๋‚˜๊ฐ€๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ž๋™ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋‚˜ ๋ˆ„๋ฝ๋œ ํ•„๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ด ์ค๋‹ˆ๋‹ค.
  4. ์‰ฌ์šด ์‚ฌ์šฉ์„ฑ:
    • ํ‘œ์ค€ 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๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

Python
 
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)
  • ๋‹จ์ : ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๊ธธ๊ณ  ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์— ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ์„ ์ €ํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœจ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•

ํ˜„๋Œ€์˜ ๋งŽ์€ ๊ธฐ์ˆ ์€ ์ด ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋Šฅ ํ™œ์šฉ:
    • Python/JavaScript๋Š” Java๋‚˜ C++๋ณด๋‹ค ๋น„๊ต์  ์ ์€ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    • FastAPI๋‚˜ Spring Boot ๊ฐ™์€ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ดˆ๊ธฐ ์„ค์ •์„ ์ตœ์†Œํ™”ํ•ด์ค๋‹ˆ๋‹ค.
  2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ:
    • Java์˜ Lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” getter/setter ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.
  3. ์ฝ”๋“œ ์ƒ์„ฑ ๋„๊ตฌ:
    • **IDE (ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ)**์˜ ์ž๋™ ์™„์„ฑ์ด๋‚˜ ์ฝ”๋“œ ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Streamlit๊ฐ€ ๋ญ์˜ˆ์š”?

**Streamlit(์ŠคํŠธ๋ฆผ๋ฆฟ)**์€ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋งŒ์œผ๋กœ ์•„์ฃผ ์‰ฝ๊ฒŒ ์›น ๋Œ€์‹œ๋ณด๋“œ·์›น ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
HTML, CSS, JavaScript๋ฅผ ๋ชฐ๋ผ๋„ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ฒฐ๊ณผ๋‚˜ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ๋ฐ”๋กœ ์›น์•ฑ ํ˜•ํƒœ๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์„œ
๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธํ‹ฐ์ŠคํŠธ๋‚˜ AI ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”Ž ํ•œ ์ค„ ์š”์•ฝ

“ํŒŒ์ด์ฌ์œผ๋กœ ์“ฐ๋ฉด ๋ฐ”๋กœ ์›น ์•ฑ์ด ๋˜๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๋„๊ตฌ”


์™œ ๋งŽ์ด ์“ธ๊นŒ?

โœ” 1) ์„ค์น˜์™€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฌ์›€

 
pip install streamlit streamlit run app.py

์ด๋ ‡๊ฒŒ๋งŒ ํ•˜๋ฉด ๋ฐ”๋กœ ์›น ํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค.

โœ” 2) ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„, ๊ทธ๋ž˜ํ”„, ์ด๋ฏธ์ง€, ํ…์ŠคํŠธ ๋ชจ๋‘ ํ•œ ์ค„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅ.

โœ” 3) ๋จธ์‹ ๋Ÿฌ๋‹/AI ๋ฐ๋ชจ ๋งŒ๋“ค๊ธฐ ์ตœ์ ํ™”

๋ชจ๋ธ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ ์•„์ฃผ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

โœ” 4) ํ”„๋ก ํŠธ์—”๋“œ ์ง€์‹ ํ•„์š” ์—†์Œ

๋ฒ„ํŠผ, ์Šฌ๋ผ์ด๋”, ํ…์ŠคํŠธ ์ž…๋ ฅ์ฐฝ ๊ฐ™์€ UI๋ฅผ ํŒŒ์ด์ฌ์œผ๋กœ ๋ฐ”๋กœ ๊ตฌํ˜„.


์˜ˆ์‹œ๋กœ ๋ณด๋ฉด ๋” ์‰ฌ์›€

์•„๋ž˜ 10์ค„ ์ •๋„์˜ ์ฝ”๋“œ๋งŒ์œผ๋กœ๋„ ์›น์•ฑ์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค:

 
import streamlit as st st.title("Hello Streamlit!") name = st.text_input("์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”:") if st.button("ํ™•์ธ"): st.write(f"{name}๋‹˜, ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค!")

์‹คํ–‰ํ•˜๋ฉด ์ž…๋ ฅ์ฐฝ๊ณผ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋กœ ์—ด๋ฆฝ๋‹ˆ๋‹ค.


Streamlit์„ ์–ธ์ œ ์“ฐ๋ฉด ์ข‹์„๊นŒ?

  • ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋™๋ฃŒ์™€ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • AI ๋ชจ๋ธ ๋ฐ๋ชจ ํŽ˜์ด์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ
  • ์„œ๋ฒ„๊นŒ์ง€ ๋งŒ๋“ค๊ธฐ์—” ๋ถ€๋‹ด๋  ๋•Œ
  • ํ”„๋ก ํŠธ์—”๋“œ ์—†์ด๋„ ์›น UI๊ฐ€ ํ•„์š”ํ•  ๋•Œ

ํ•ต์‹ฌ ์š”์•ฝ

  • Streamlit = ํŒŒ์ด์ฌ ๊ธฐ๋ฐ˜ ์ดˆ๊ฐ„๋‹จ ์›น์•ฑ ํ”„๋ ˆ์ž„์›Œํฌ
  • ๋ฐ์ดํ„ฐ, ๊ทธ๋ž˜ํ”„, ML ๋ชจ๋ธ ๋ฐ๋ชจ ๋งŒ๋“ค๊ธฐ์— ๊ฐ•ํ•จ
  • ์„ค์น˜ & ์‹คํ–‰์ด ๋งค์šฐ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จ