๐Ÿ“ Flask

ํ”Œ๋ผ์Šคํฌ๋Š” ๋งŽ์€ ์‚ฌ๋žŒ์ด "Micro Web Framework" ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
์—ฌ๊ธฐ์„œ "Micro" = "ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค" ๋ผ๋Š” ์˜๋ฏธ

  • Micro : ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ ์ œ๊ณต, ๊ฐ€๋ณ๊ฒŒ ๋ฐฐ์šฐ๊ณ  ๊ฐ€๋ณ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ™•์žฅ์„ฑ์ด ๋„“๋‹ค.
  • Framework : ์ด๋ฏธ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์˜ ๋ชจ์ž„์ธ "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ" ๊ทธ ์ด์ƒ์˜ ์˜๋ฏธ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์ผ์ •ํ•œ "๋ผˆ๋Œ€"๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ์ˆ 

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

๐Ÿ’ก ํ”Œ๋ผ์Šคํฌ ์žฅ์ 

  • ๊ฐ€๋ณ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค : HTML/CSS/JS ์•Œ๊ณ , python์„ ์–ด๋Š์ •๋„ ์•Œ๊ณ ์žˆ๋‹ค๋ฉด, ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ€๋ณ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. : ์ฝ”๋“œ ๋ช‡ ์ค„์ด๋ฉด, ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ€๋ณ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค. : pip์„ ์‚ฌ์šฉํ•˜์—ฌ Flask๋ฅผ ๋‹ค์šด๋ฐ›๊ณ  ๋ฐฐํฌํ•˜๋ฉด ๋์ด๋‹ค.

๐Ÿ’ก ํ”Œ๋ผ์Šคํฌ์˜ ๋‹จ์ 

  • Django์— ๋น„ํ•ด์„œ ์ž์œ ๋„๊ฐ€ ๋†’์œผ๋‚˜, ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ๋œ ํ•˜๋‹ค.
  • ๋ณต์žกํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ, ํ•ด์•ผ ํ•  ๊ฒƒ๋“ค์ด ๋งŽ๋‹ค.

Flask๋Š” ์†Œ๊ทœ๋ชจ์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ๋ฐฐํฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋Œ€๊ทœ๋ชจ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ ํ™•์žฅ์˜ ์—ญํ• ์„ ํ•˜๊ธฐ ์‰ฌ์šด ์žฅ์ ์ด ์žˆ๋‹ค.
๋ฐ˜๋ฉด, Django๋Š” ๋Œ€๊ทœ๋ชจ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ๋‹ค.

Flask Django
ORM ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜์ง€ ์•Š์Œ ORM ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ
์งง์€ ์ฝ”๋“œ๋กœ ์›น ์„œ๋ฒ„ ๊ตฌ๋™๊ฐ€๋Šฅ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ์ž ํ™”๋ฉด ๊ตฌ์„ฑ

ORM(Object Relational Mapping) : ORM์€ DB์™€ OOP ์–ธ์–ด ๊ฐ„์˜ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

 

๐Ÿ“ ๋กœ์ปฌ์—์„œ Simple Web Server๋„์šฐ๊ธฐ : Hello World !!

ํ™˜๊ฒฝ : VS code, Python.exe 20.3.3 version ์ด์ƒ
(์˜ค๋ฅ˜ ๋ฐœ์ƒ์‹œ, ๋ณดํ†ต, ํŒŒ์ด์ฌ ์‹คํ–‰ํŒŒ์ผ ๋ฒ„์ ผ์ด, ์ด์ „ ๋ฒ„์ ผ์ด์–ด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ทธ๋Ÿด ๊ฒฝ์šฐ, ๋ฒ„์ ผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•„์š”)

c:/python39/python.exe -m pip install --upgrade pip
c:/python39/python.exe -m pip install --upgrade pip --user (์•ก์„ธ์Šค ๊ฑฐ๋ถ€์‹œ)

์„ฑ๊ณต ์‹œ, ์•„๋ž˜์™€ ๊ฐ™์€ "Hello world!"๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ„๋‹จํ•œ, ํ”Œ๋ผ์Šคํฌ ์ฝ”๋“œ ์ž‘์„ฑ

from flask import Flask  # ํ”Œ๋ผ์Šคํฌ import

app = Flask(__name__)   # app ์ด๋ผ๋Š” ์ด๋ฆ„์˜, flask์•ฑ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊บผ์•ผ.

@app.route('/')             # ๋ผ์šฐํŒ…, '/'๋Š” ์ ‘์†์‹œ, root ๊ฒฝ๋กœ
def hello_World():          # '/'๊ณผ ๋งค์นญ๋˜๋Š” ํ•จ์ˆ˜(root ๊ฒฝ๋กœ์ผ ์‹œ), ํŽ˜์ด์ง€์—์„œ ์ž‘๋™ํ•  ๋ฉ”์†Œ๋“œ
    return "Hello World!"

if __name__ == '__main__':  # ๋ชจ๋“ˆ ๋ช…์ด "main"์ผ ๋•Œ๋งŒ ์‹คํ–‰ํ•˜๋„๋ก ์กฐ๊ฑด๋ฌธ
    app.run()

127.0.0.1:5000(๋กœ์ปฌ) ์— ์ถœ๋ ฅ๋œ Hello World

 

๐Ÿ“ Flask  HTTP ํ†ต์‹  : HTTP Methods

๋จผ์ € HTTP ๊ฐœ๋…์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ์•„๋ž˜, ํฌ์ŠคํŒ…์„ ์ž ๊น ์ฝ๊ณ  ์˜ค์ž. 

 

[Network] HTTP๋ž€ ?

๐Ÿ“ ๊ฐœ์š” ์šฐ๋ฆฌ ๋ชจ๋‘, ๋Œ€๋ถ€๋ถ„ ์ •๋ณด๋ฅผ ์ธํ„ฐ๋„ท์œผ๋กœ ํ™•์ธํ•œ๋‹ค. ๋ชจ๋“  "์›น ๋ธŒ๋ผ์šฐ์ €"์— ์žˆ๋Š” ์ •๋ณด์— ์ ‘๊ทผํ•  ๋•Œ๋Š”, "URL"์„ ํ†ตํ•˜์—ฌ ์ ‘๊ทผํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•˜๋ฉด, "URL์„ ๋ชจ๋ฅด๋Š” ์ •๋ณด์—๋Š” ์ ‘๊ทผ์„ ํ•  ์ˆ˜ ์—†๋‹ค"

youngminieo1005.tistory.com

Flask๋Š” HTTP ํ†ต์‹ ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ Methods๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Method ์„ค๋ช…
GET ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•
HEAD GET๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Response Body๋ฅผ ํฌํ•จ์ง€ ์•Š๊ณ  ์‚ฌ์šฉ
POST ํŠน์ • ์–‘์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
PUT ํŠน์ • ๋Œ€์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ (Update)ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
DELETE URL์— ์ง€์ •๋œ ๋Œ€์ƒ์„ ์‚ญ์ œ(DELETE)ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

 

๐Ÿ“ URL Routing ์ด๋ž€ ?

URL Routing : ์„œ๋ฒ„์—์„œ ํŠน์ • URL์— ์ ‘์†ํ–ˆ์„ ์‹œ, ๋ณด์—ฌ์ค„ ํŽ˜์ด์ง€๋ฅผ ์ •ํ•ด์ฃผ๋Š” ๊ฒƒ

์ฆ‰, ํŠน์ • URL์„ ์ผ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ๊ณผ "Mapping"ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

https://page.com/home  # ํ™ˆํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ณ 
https://page.com/login # ๋กœ๊ทธ์ธํ™”๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.

์œ„์— ์˜ˆ์‹œ๊ฐ™์€ ๊ฒƒ์ด, URL Routing ์ด๋‹ค.

๐Ÿ’ก Flask์—์„œ URL Mapping์„ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ ?

Flask์—์„œ URL Routing์€ @app.route(' ')๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.
๋˜ํ•œ, ์—ฌ๊ธฐ์„œ @๋ฅผ ํ†ตํ•ด ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹ = ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(decorator)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

from flask import Flask  # ํ”Œ๋ผ์Šคํฌ import

app = Flask(__name__)   # app ์ด๋ผ๋Š” ์ด๋ฆ„์˜, flask์•ฑ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊บผ์•ผ.

@app.route('/')             # ๋ผ์šฐํŒ…, '/'๋Š” ์ ‘์†์‹œ, root ๊ฒฝ๋กœ
def home():          # '/'๊ณผ ๋งค์นญ๋˜๋Š” ํ•จ์ˆ˜(root ๊ฒฝ๋กœ์ผ ์‹œ), ํŽ˜์ด์ง€์—์„œ ์ž‘๋™ํ•  ๋ฉ”์†Œ๋“œ
    return "This is Home page !!"

@app.route('/hello')        # "/hello" URL ์ ‘์† ์‹œ 
def hello():
    return "Hello world !!"
if __name__ == '__main__':  # ๋ชจ๋“ˆ ๋ช…์ด "main"์ผ ๋•Œ๋งŒ ์‹คํ–‰ํ•˜๋„๋ก ์กฐ๊ฑด๋ฌธ
    app.run()

localhost ํŽ˜์ด์ง€
localhost/hello ํŽ˜์ด์ง€

 

๐Ÿ“ Variable Rules

ํ”Œ๋ผ์Šคํฌ์—์„œ๋Š” route( ) ๋ฅผ ์‚ฌ์šฉํ•ด์„œ url path์˜ ๊ฐ’์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
url path์˜ ๋ฌธ์ž์—ด, ์ •์ˆ˜, ์„œ๋ธŒ๊ฒฝ๋กœ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฌธ์ž์—ด์€ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋ช…์„ <๋ณ€์ˆ˜๋ช…>์œผ๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด ํ•จ์ˆ˜์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ •์ˆ˜๋Š” <int:๋ณ€์ˆ˜๋ช…> ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์„œ๋ธŒ๊ฒฝ๋กœ๋Š” <path:subpath> ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
from flask import Flask

app = Flask(__name__)

@app.route('/user/<username>')
def show_user_profile(username):
    return f"User {username}"

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f"Post {post_id}"

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    return f"Subpath {subpath}"

if __name__ == '__main__':
    app.run()

๋ฌธ์ž์—ด  = <๋ณ€์ˆ˜๋ช…>

 

์ •์ˆ˜ = <int:๋ณ€์ˆ˜๋ช…>
์„œ๋ธŒ๊ฒฝ๋กœ = <path:์„œ๋ธŒ๊ฒฝ๋กœ>

 

๐Ÿ“ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ํ•˜๊ธฐ - jsonify( )

Flask ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ json ํŒŒ์ผ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.

json ํŒŒ์ผ ํ˜•์‹์€ ์›น ์‚ฌ์ดํŠธ ์ƒ์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ํ˜•์‹์ด๋‹ค. Dictionaryํ˜•ํƒœ์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

Flask ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ json ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” jsonify( ) ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค.

from flask import Flask, jsonify    # jsonify import

app = Flask(__name__)

@app.route('/')
def json():
    people = [
        {'name' : 'natto' , 'birth-year' : 2020},
        {'name' : 'apple' , 'birth-year' : 2021},
        {'name' : 'banana' , 'birth-year' : 2022}
    ]
    return jsonify(people)

if __name__ == '__main__':
    app.run()

jsonify( ) ๋ฐ˜ํ™˜ = jsonํ˜•์‹

 

๐Ÿ“ URL ์„ค๊ณ„ํ•˜๊ธฐ - URL Building

์›น ์‚ฌ์ดํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์‚ฌ์šฉ์ž๋“ค์ด ์›น ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด URL ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•  ํ•„์š”์„ฑ์ด ์žˆ๋‹ค.

๋งŒ์•ฝ ํ•œ ํŽ˜์ด์ง€์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก "๋งํฌ"๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ ?

Flask ์—์„œ๋Š” url_for( ) ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

url_for( ) ๋ฉ”์†Œ๋“œ : ํŠน์ • ํ•จ์ˆ˜์— ๋Œ€ํ•œ url์„ "๋™์ "์œผ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ url ๋์ ์— ์ด๋™ํ•  ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ์ (.)์„ ์ ‘๋‘์‚ฌ๋กœ ๋ถ™์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

from flask import Flask, redirect, url_for

app = Flask(__name__)

# ํ™ˆ ํŽ˜์ด์ง€๋กœ ์ด๋™
@app.route('/')
def home():
    return "์ฃผ์†Œ์ฐฝ์— /user/admin๊ณผ /admin <br> /user/student ์™€ /student๋ฅผ ์ž…๋ ฅํ•ด๋ณด์„ธ์š”."

# ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋กœ ์ด๋™
@app.route('/admin')
def admin():
    return "๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹ค."

@app.route('/student')
def student():
    return "ํ•™์ƒ์šฉ ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹ค."

# redirect() ๋Š” "ํŽ˜์ด์ง€์— ๋‹ค์‹œ ์—ฐ๊ฒฐํ•œ๋‹ค"๋Š” ๋œป์œผ๋กœ ๋งˆ์น˜ ํŽ˜์ด์ง€๋ฅผ "์ƒˆ๋กœ๊ณ ์นจ" ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋™์ž‘ํ•œ๋‹ค.
@app.route('/user/<name>')
def user(name):
    # ์ „๋‹ฌ ๋ฐ›์€ name์ด 'admin'์ด๋ผ๋ฉด ?
    if name == 'admin':
        return redirect(url_for('admin'))
    
    # ์ „๋‹ฌ ๋ฐ›์€ name์ด 'student' ๋ผ๋ฉด ?
    if name == 'student':
        return redirect(url_for('student'))


if __name__ == '__main__':
    app.run()

/admin = /user/admin ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
/student = /user/studnet ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

๋‹ค๋งŒ, ์ฐจ์ด๋Š” ํ„ฐ๋ฏธ๋„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, "HTTP status code" ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

์œ„์—, HTTP ํฌ์ŠคํŒ…์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด

300 = "๋ฆฌ๋‹ค์ด๋ ‰ํŠธ" , 200 = "์„ฑ๊ณต" ์„ ์˜๋ฏธํ•œ๋‹ค.
๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, GET Method๋ฅผ ์‚ฌ์šฉํ•œ๊ฒƒ์€ ๊ณตํ†ต์ ์ด๋‹ค.

728x90
๋ฐ˜์‘ํ˜•

+ Recent posts