μΈλ―Έλ 2μμλ SQLAlchemy λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€λ₯Ό λ€λ£¨λ λ°©λ²μ λ°°μ μ΅λλ€. μ΄λ² κ³Όμ μμλ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νμ¬ κ³Όμ 1μμ ꡬννλ API λ₯Ό κ³ λννκ³ , μΆκ° API λ₯Ό ꡬνν΄λ΄ λλ€.
μ°Έκ³ ) μ κ° λ§λ μ€μΌλ ν€ μ½λ κ³³κ³³μ # TODO μ£Όμμ λ¬μλμμ΅λλ€. κ°λ₯νλ©΄ ν΄λΉ μ£Όμλ€μ λͺ¨λ μ½μ΄λ³΄μκΈΈ λ°λΌμ.
- ER λ€μ΄μ΄κ·Έλ¨μ νμ©νμ¬ λλ©μΈμ μ ν©ν λ°μ΄ν°λ² μ΄μ€ λͺ¨λΈμ μ€κ³ν μ μλ€.
- FastAPI μμ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νμ¬ μꡬμ μΈ λ°μ΄ν°λ₯Ό μ μ₯νκ³ μ‘°νν μ μλ€.
- λͺ¨λ κ³Όμ λ python 3.11 λ²μ μ μ¬μ©ν κ²μ μ μ λ‘ ν©λλ€.
- λ³Έ κ³Όμ μ κ°μνκ²½μ μμ±μ poetry λ₯Ό μ¬μ©ν©λλ€.
- poetry λ₯Ό μ€μΉν λ€,
poetry env use -- 3.11κ³Ό κ°μ λͺ λ Ήμ΄λ₯Ό μ΄μ©ν΄ κ°μνκ²½μ μμ±νμΈμ. poetry installλͺ λ Ήμ΄λ₯Ό ν΅ν΄ ν¨ν€μ§λ₯Ό μ€μΉνμΈμ.pyproject.tomlκ³Όpoetry.lockνμΌμ μμ νμ§ μμ΅λλ€.- μ¦, μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό μμλ‘ μ€μΉνμ§ λ§λΌλ μλ―Έμ λλ€.
- poetry λ₯Ό μ€μΉν λ€,
μλ ER λ€μ΄μ΄κ·Έλ¨μ μ¬μ©νμ¬ μν‘μ λ°μ΄ν°λ² μ΄μ€ λͺ¨λΈμ μ€κ³ν΄λ΄ λλ€. λ¨, μ΄ λ€μ΄μ΄κ·Έλ¨μ μ κ° λ리λ μ€μΌλ ν€μ μΌλΆμ΄μ νλμ μμμΌ λΏ, μλ²½νκ² λ°μν νμλ μμ΅λλ€. μ±μ μλ API κ° μ μλνλμ§λ§ νμΈν©λλ€.
μΆκ°μ μΌλ‘ μ€κ³μ νμν μ 보λ λ€μκ³Ό κ°μ΅λλ€.
- μ μ λ id, username, email, password, address, phone_number μ κ°μ§κ³ μμ΄μΌ ν©λλ€.
- μ μ ν μ΄λΈμ μ€μΌλ ν€μ μΌλΆλ‘ μ 곡λ©λλ€.
- μ μ λ μ΅λ νλμ μμ λ§ μμ ν μ μμ΅λλ€.
- μμ μ id, store_name, address, email, phone_number λ₯Ό κ°μ§κ³ μμ΄μΌ ν©λλ€.
- μμ μ μ¬λ¬ κ°μ μνμ ν μ μμΌλ©°, κ°κ°μ μ¬κ³ λ₯Ό μ«μλ‘ κ΄λ¦¬ν©λλ€.
- μνμ id, item_name, price μ κ°μ§κ³ μμ΄μΌ ν©λλ€.
- μ μ λ μ¬λ¬ κ°μ μ£Όλ¬Έμ ν μ μμ΅λλ€.
- μ£Όλ¬Έμ μ§ν μνμ λ°λΌ
CANCELED,ORDERED,COMPLETEμ€ νλμ μνλ₯Ό κ°μ§λλ€. - ν μ£Όλ¬Έμλ μ¬λ¬ κ°μ μνμ΄ ν¬ν¨λ μ μμ΅λλ€.
- μ μ λ μνλ§λ€ μ΅λ ν κ°μ 리뷰λ₯Ό λ¨κΈΈ μ μμ΅λλ€.
2-1 μ ER λ€μ΄μ΄κ·Έλ¨μ λ°μ΄ν°λ² μ΄μ€μ λ§€ννμ¬ λ°μ΄ν°λ² μ΄μ€λ₯Ό μμ±νκ³ , FastAPI μμ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©ν μ μλλ‘ μ€μ ν΄λ΄ λλ€.
μΈλ―Έλ 2 μ μ€μ΅μΌλ‘ λ체ν©λλ€.
alembic μ μ¬μ©νμ¬ 2-1μμ ꡬνν λͺ¨λΈμ κΈ°λ°μΌλ‘ λ°μ΄ν°λ² μ΄μ€ λ§μ΄κ·Έλ μ΄μ μ μνν©λλ€. alembic μ μ€μ κ³Ό μΈν μ μ΄λ―Έ λμ΄μμΌλ©°, μ¬λ¬λΆμ΄ ν΄μΌν μΌμ λͺ¨λΈμ μ μνκ³ λ§μ΄κ·Έλ μ΄μ μ μννλ κ² λΏμ λλ€.
.env.localμ λ‘컬μμ ν μ€νΈνκΈ° μν μ λ³΄κ° λ°μ΄ν°λ² μ΄μ€ μ€μ μ΄ μ¬μ μ μλμ΄ μμ΅λλ€. νμ§λ§ μνλ€λ©΄ λ³κ²½ν΄λ μ’μ΅λλ€..env.testλ μ±μ μ μ¬μ©λλ―λ‘ μ λ 건λλ¦¬μ§ λ§μμ£ΌμΈμ..env.prodμμλ μ¬λ¬λΆμ EC2 μ RDS μ λ§μΆ€μΌλ‘ μ¬μ©λ μ€μ μ μμ±ν΄μ£Όλ©΄ λ©λλ€.- νλ‘λμ μμ μ΄ νμΌμ΄ μ¬μ©λκ² νλ €λ©΄ μ΄λ»κ² ν΄μΌν κΉμ?
μ¬λ¬λΆμ λ‘μΌλ°°μ‘μΌλ‘ μ λͺ ν μν‘μ κ°λ°μμ λλ€. κ³Όμ 1μ μ΄μ΄, μμ κ³Ό μν κ΄λ¦¬ API λ₯Ό ꡬνν΄μΌ ν©λλ€. μ΄λ²μλ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νμ¬ μμ κ³Ό μν μ 보λ₯Ό μ μ₯νκ³ , μ‘°νν μ μμ΄μΌ ν©λλ€. λλΆμ΄, κ³Όμ 1μμ ꡬννλ μ μ API λ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλλ‘ μμ ν΄μΌ ν©λλ€.
- μμ² νλμ νμμ΄ μ¬λ°λ₯΄μ§ μμ κ²½μ°,
400 Bad Requestμνμ½λμ ν¨κ» μλ΅μΌλ‘{"detail": "Invalid field format"}λ₯Ό λ°νν©λλ€.- e.g.
priceνλμ λ¬Έμμ΄μ΄ λ€μ΄μ¨ κ²½μ° (νμ λΆμΌμΉ) - e.g.
priceνλμ μμκ° λ€μ΄μ¨ κ²½μ° (κ° λ²μ) - e.g.
store_nameνλμ 2κΈμ λ―Έλ§μ λ¬Έμμ΄μ΄ λ€μ΄μ¨ κ²½μ° (κΈμ μ μ ν)
- e.g.
- μμ² νλκ° λΉμ΄μλ κ²½μ°,
400 Bad Requestμνμ½λμ ν¨κ» μλ΅μΌλ‘{"detail": "Missing required fields"}λ₯Ό λ°νν©λλ€. - λ‘κ·ΈμΈμ΄ νμν κ²½μ°, μμ² ν€λμλ
X-Wapang-Username,X-Wapang-Passwordνλλ₯Ό ν¬ν¨ν΄μΌ ν©λλ€.- ν΄λΉ ν€λκ° μκ±°λ μ μ λ₯Ό μ°Ύμ μ μλ κ²½μ°,
401 Unauthorizedμνμ½λλ₯Ό λ°νν©λλ€.
- ν΄λΉ ν€λκ° μκ±°λ μ μ λ₯Ό μ°Ύμ μ μλ κ²½μ°,
-
μμ μΆκ° API λ POST λ©μλλ‘
/api/storesμλν¬μΈνΈμ μμ²μ 보λ΄μΌ ν©λλ€. -
λ‘κ·ΈμΈμ΄ νμν©λλ€.
-
μμ² λ³Έλ¬Έμ JSON νμμΌλ‘,
store_name,address,email,phone_numberνλλ₯Ό ν¬ν¨ν΄μΌ ν©λλ€.store_nameνλλ 3κΈμ μ΄μ 20κΈμ μ΄νμ λ¬Έμμ΄μ΄μ΄μΌ ν©λλ€.address,email,phone_numberκ° λΉμ΄μλ€λ©΄ μ¬μ©μμ μ 보λ₯Ό μ¬μ©ν©λλ€.
-
ν μ μ λ μ΅λ νλμ μμ λ§ μμ±ν μ μμ΅λλ€.
-
μμ μΆκ°μ μ±κ³΅νλ©΄
201 Createdμνμ½λμ ν¨κ» μμ id λ₯Ό ν¬ν¨ν μμ μ 보λ₯Ό JSON νμμΌλ‘ λ°νν©λλ€. -
μμ μΆκ°μ μ€ν¨νλ κ²½μ°λ λ€μκ³Ό κ°μ΅λλ€.
store_name,address,email,phone_numberνλ μ€ 1κ° μ΄μμ΄ λΉμ΄μκ³ μ μ μ μ 보λ‘λ λ체ν μ μλ κ²½μ°400 Bad Requestμνμ½λμ ν¨κ» μλ΅μΌλ‘{"detail": "Missing required fields"}λ₯Ό λ°νν©λλ€.
- μ΄λ―Έ μμ μ μμ±ν μ μ κ° μμ μ μΆκ°νλ €κ³ ν κ²½μ°:
403 Forbiddenμνμ½λλ₯Ό λ°νν©λλ€.
- μ΄λ―Έ μ‘΄μ¬νλ
store_name,emailλλphone_numberλ₯Ό μ¬μ©νλ κ²½μ°:409 Conflictμνμ½λμ ν¨κ» μλ΅μΌλ‘{"detail": "Store already exists"},{"detail": "Email already exists"}, λλ{"detail": "Phone number already exists"}λ₯Ό λ°νν©λλ€.
μμ² μμ
{
"store_name": "store1",
"address": "address1",
"email": "minkyu97@wafflestudio.com",
"phone_number": "010-1234-5678"
}μλ΅ μμ
{
"id": 1,
"store_name": "store1",
"address": "address1",
"email": "minkyu97@wafflestudio.com",
"phone_number": "010-1234-5678"
}- μμ μ‘°ν APIλ GET λ©μλλ‘
/api/stores/{store_id}μλν¬μΈνΈμ μμ²μ 보λ΄μΌ ν©λλ€. {store_id}λ μ‘°ννκ³ μ νλ μμ μ λ²νΈ λλ- μμ μ΄ μ‘΄μ¬νλ κ²½μ°,
200 OKμνμ½λμ ν¨κ»id,store_name,address,email,phone_numberνλλ₯Ό ν¬ν¨ν JSON μλ΅μ λ°νν©λλ€. - μμ μ΄ μ‘΄μ¬νμ§ μλ κ²½μ°,
404 Not Foundμνμ½λλ₯Ό λ°νν©λλ€.
μλ΅ μμ
{
"id": 1,
"store_name": "store1",
"address": "address1",
"email": "minkyu97@wafflestudio.com",
"phone_number": "010-1234-5678"
}- μν μΆκ° APIλ POST λ©μλλ‘
/api/itemsμλν¬μΈνΈμ μμ²μ 보λ΄μΌ ν©λλ€. - λ‘κ·ΈμΈμ΄ νμν©λλ€.
- μμ² λ³Έλ¬Έμ JSON νμμΌλ‘,
item_name,price,stockνλλ₯Ό λͺ¨λ ν¬ν¨ν΄μΌ ν©λλ€.item_nameνλλ 2κΈμ μ΄μ 50κΈμ μ΄νμ λ¬Έμμ΄μ΄μ΄μΌ ν©λλ€.priceνλλ 1 μ΄μμ μ μμ΄μ΄μΌ ν©λλ€.stockνλλ 0 μ΄μμ μ μμ΄μ΄μΌ ν©λλ€.
- μν μΆκ°μ μ±κ³΅νλ©΄
201 Createdμνμ½λμ ν¨κ» μΆκ°λ μν μ 보λ₯Ό μν idμ ν¨κ» JSON νμμΌλ‘ λ°νν©λλ€. - μν μΆκ°μ μ€ν¨νλ κ²½μ°λ λ€μκ³Ό κ°μ΅λλ€.
- λ€λ₯Έ μ μ μ μμ μ μνμ μΆκ°νλ €κ³ ν κ²½μ°
403 Forbiddenμνμ½λλ₯Ό λ°νν©λλ€.
- νμκ°μ
λμ§ μμ μ μ μ κ²½μ°
401 Unauthorizedμνμ½λλ₯Ό λ°νν©λλ€.
- λ€λ₯Έ μ μ μ μμ μ μνμ μΆκ°νλ €κ³ ν κ²½μ°
μμ² μμ
{
"item_name": "item1",
"price": 15000,
"stock": 10
}μλ΅ μμ
{
"id": 1,
"item_name": "item1",
"price": 15000,
"stock": 10
}- μν μμ APIλ PATCH λ©μλλ‘
/api/items/{item_id}μλν¬μΈνΈμ μμ²μ 보λ΄μΌ ν©λλ€. - λ‘κ·ΈμΈμ΄ νμν©λλ€.
- μμ² λ³Έλ¬Έμ JSON νμμΌλ‘,
item_name,price,stockνλ μ€ νλ μ΄μμ ν¬ν¨ν΄μΌ ν©λλ€.item_nameνλλ 2κΈμ μ΄μ 50κΈμ μ΄νμ λ¬Έμμ΄μ΄μ΄μΌ ν©λλ€.priceνλλ 0λ³΄λ€ ν° μ μμ΄μ΄μΌ ν©λλ€.stockνλλ 0 μ΄μμ μ μμ΄μ΄μΌ ν©λλ€.
- μν μμ μ μ±κ³΅νλ©΄
200 OKμνμ½λμ ν¨κ» μμ λ μν μ 보λ₯Ό μν idμ ν¨κ» JSON νμμΌλ‘ λ°νν©λλ€. - μν μμ μ μ€ν¨νλ κ²½μ°λ λ€μκ³Ό κ°μ΅λλ€.
- μμ λλ μνμ΄ μ‘΄μ¬νμ§ μλ κ²½μ°
404 Not Foundμνμ½λλ₯Ό λ°νν©λλ€.
- λ€λ₯Έ μ μ μμ μ μνμ μμ νλ €κ³ ν κ²½μ°
403 Forbiddenμνμ½λλ₯Ό λ°νν©λλ€.
- μμ λλ μνμ΄ μ‘΄μ¬νμ§ μλ κ²½μ°
μμ² μμ
{
"item_name": "item1",
"price": 15000,
"stock": 10
}μλ΅ μμ
{
"id": 1,
"item_name": "item1",
"price": 15000,
"stock": 10
}- μν λͺ©λ‘ μ‘°ν APIλ GET λ©μλλ‘
/api/itemsμλν¬μΈνΈμ μμ²μ 보λ΄μΌ ν©λλ€. - 쿼리 νλΌλ―Έν°λ₯Ό μ΄μ©ν΄ λ€μκ³Ό κ°μ΄ νν°λ§ν μ μμ΅λλ€.
store_name: νΉμ μμ μ μνλ§ μ‘°νν λ μ¬μ©ν©λλ€.min_price: μ§μ λ μ΅μ κ°κ²© μ΄μμ μνμ μ‘°νν λ μ¬μ©ν©λλ€.max_price: μ§μ λ μ΅λ κ°κ²© μ΄νμ μνμ μ‘°νν λ μ¬μ©ν©λλ€.in_stock: μ¬κ³ κ° μλ μνλ§ μ‘°νν λ μ¬μ©ν©λλ€.trueλ‘ μ€μ ν κ²½μ°, μ¬κ³ κ° μλ μνλ§ μ‘°νν©λλ€.falseλ‘ μ€μ ν κ²½μ°, λͺ¨λ μνμ μ‘°νν©λλ€.- κΈ°λ³Έκ°μ
falseμ λλ€.
- λͺ¨λ 쑰건μ AND 쑰건μ λλ€.
- 쿼리 νλΌλ―Έν°κ° μμΌλ©΄ μ 체 μν λͺ©λ‘μ λ°νν©λλ€.
- μμ²μ΄ μ±κ³΅νλ©΄
200 OKμνμ½λμ ν¨κ» νν°λ§λ μν λͺ©λ‘μ JSON νμμΌλ‘ λ°νν©λλ€.- μλ΅μλ κ° μνμ
id,item_name,price,quantityνλκ° ν¬ν¨λ©λλ€. - μνμ΄ μλ κ²½μ°, λΉ λ°°μ΄μ λ°νν©λλ€.
- μλ΅μλ κ° μνμ
- μμ μ΄ μ‘΄μ¬νμ§ μλ κ²½μ°,
404 Not Foundμνμ½λλ₯Ό λ°νν©λλ€.
μλ΅ μμ
[
{
"id": 1,
"item_name": "item1",
"price": 15000,
"quantity": 10
},
{
"id": 2,
"item_name": "item2",
"price": 20000,
"quantity": 5
}
]- μ£Όλ¬Έ APIλ POST λ©μλλ‘
/api/ordersμλν¬μΈνΈμ μμ²μ 보λ΄μΌ ν©λλ€. - λ‘κ·ΈμΈμ΄ νμν©λλ€.
- μμ² λ³Έλ¬Έμ JSON νμμΌλ‘,
itemsνλλ₯Ό ν¬ν¨ν΄μΌ ν©λλ€.itemsνλλitem_idμquantityλ₯Ό ν¬ν¨νλ λ°°μ΄μ΄μ΄μΌ ν©λλ€.- μλμ 1 μ΄μμ μ μμ΄μ΄μΌ ν©λλ€.
- μ£Όλ¬Έμ μ±κ³΅νλ©΄
201 Createdμνμ½λμ ν¨κ» μ£Όλ¬Έ μ 보λ₯Ό JSON νμμΌλ‘ λ°νν©λλ€.- μ£Όλ¬Έ μ 보μλ
order_id,items,statusνλκ° ν¬ν¨λ©λλ€. itemsνλλ μμ²μitemsνλμ λμΌν©λλ€.- κ° μνμ μ¬κ³ λ μ£Όλ¬Έν μλλ§νΌ κ°μν©λλ€.
- μ£Όλ¬Έ μ 보μλ
- μ£Όλ¬Έμ μ€ν¨νλ κ²½μ°λ λ€μκ³Ό κ°μ΅λλ€.
- μνμ΄ μ‘΄μ¬νμ§ μλ κ²½μ°
404 Not Foundμνμ½λλ₯Ό λ°νν©λλ€.
- νμκ°μ
λμ§ μμ μ μ μ κ²½μ°
401 Unauthorizedμνμ½λλ₯Ό λ°νν©λλ€.
- μ£Όλ¬Έν μλμ΄ μ¬κ³ λ³΄λ€ λ§μ κ²½μ°
400 Bad Requestμνμ½λμ ν¨κ» μλ΅μΌλ‘{"detail": "Not enough stock"}λ₯Ό λ°νν©λλ€.
- μνμ΄ μ‘΄μ¬νμ§ μλ κ²½μ°
μμ² μμ
{
"items": [
{
"item_id": 1,
"quantity": 2
},
{
"item_id": 2,
"quantity": 1
}
]
}μλ΅ μμ
{
"order_id": 1,
"items": [
{
"item_id": 1,
"quantity": 2
},
{
"item_id": 2,
"quantity": 1
}
],
"status": "CANCELED"
}- μ£Όλ¬Έ μ‘°ν APIλ GET λ©μλλ‘
/api/orders/{order_id}μλν¬μΈνΈμ μμ²μ 보λ΄μΌ ν©λλ€. - λ‘κ·ΈμΈμ΄ νμν©λλ€.
- μ£Όλ¬Έμ΄ μ‘΄μ¬νλ κ²½μ°,
200 OKμνμ½λμ ν¨κ» μ£Όλ¬Έ μ 보λ₯Ό JSON νμμΌλ‘ λ°νν©λλ€. - μ£Όλ¬Έμ΄ μ‘΄μ¬νμ§ μλ κ²½μ°,
404 Not Foundμνμ½λλ₯Ό λ°νν©λλ€. - λ€λ₯Έ μ μ μ μ£Όλ¬Έμ μ‘°ννλ €κ³ ν κ²½μ°,
403 Forbiddenμνμ½λλ₯Ό λ°νν©λλ€.
μλ΅ μμ
{
"order_id": 1,
"items": [
{
"item_id": 1,
"quantity": 2
},
{
"item_id": 2,
"quantity": 1
}
],
"status": "CANCELED"
}- μ£Όλ¬Έ μ·¨μ APIλ DELETE λ©μλλ‘
/api/orders/{order_id}μλν¬μΈνΈμ μμ²μ 보λ΄μΌ ν©λλ€. - λ‘κ·ΈμΈμ΄ νμν©λλ€.
- μ£Όλ¬Έ μ·¨μμ μ±κ³΅νλ©΄
204 No Contentμνμ½λλ₯Ό λ°νν©λλ€. - μ£Όλ¬Έ μ·¨μμ μ€ν¨νλ κ²½μ°λ λ€μκ³Ό κ°μ΅λλ€.
- μ£Όλ¬Έμ΄ μ‘΄μ¬νμ§ μλ κ²½μ°
404 Not Foundμνμ½λλ₯Ό λ°νν©λλ€.
- λ€λ₯Έ μ μ μ μ£Όλ¬Έμ μ·¨μνλ €κ³ ν κ²½μ°
403 Forbiddenμνμ½λλ₯Ό λ°νν©λλ€.
- μ΄λ―Έ μ·¨μλ μ£Όλ¬Έμ μ·¨μνλ €κ³ ν κ²½μ°
400 Bad Requestμνμ½λλ₯Ό λ°νν©λλ€.
- μ£Όλ¬Έμ΄ μ‘΄μ¬νμ§ μλ κ²½μ°
- ꡬ맀 νμ APIλ POST λ©μλλ‘
/api/orders/{order_id}/completeμλν¬μΈνΈμ μμ²μ 보λ΄μΌ ν©λλ€. - λ‘κ·ΈμΈμ΄ νμν©λλ€.
- ꡬ맀 νμ μ μ±κ³΅νλ©΄
204 No Contentμνμ½λλ₯Ό λ°νν©λλ€. - ꡬ맀 νμ μ μ€ν¨νλ κ²½μ°λ λ€μκ³Ό κ°μ΅λλ€.
- μ£Όλ¬Έμ΄ μ‘΄μ¬νμ§ μλ κ²½μ°
404 Not Foundμνμ½λλ₯Ό λ°νν©λλ€.
- λ€λ₯Έ μ μ μ μ£Όλ¬Έμ νμ νλ €κ³ ν κ²½μ°
403 Forbiddenμνμ½λλ₯Ό λ°νν©λλ€.
- μ΄λ―Έ μ·¨μλ μ£Όλ¬Έμ νμ νλ €κ³ ν κ²½μ°
400 Bad Requestμνμ½λλ₯Ό λ°νν©λλ€.
- μ£Όλ¬Έμ΄ μ‘΄μ¬νμ§ μλ κ²½μ°
- λ°μ΄ν°λ² μ΄μ€ λͺ¨λΈμ΄ ER λ€μ΄μ΄κ·Έλ¨μ μ λ°μνκ³ μμ
- λ°μ΄ν°λ² μ΄μ€ λ§μ΄κ·Έλ μ΄μ μ μ±κ³΅μ μΌλ‘ μνν¨
- API κ° μꡬμ¬νμ λ§κ² λμν¨
- API κ° λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νμ¬ λμν¨
- API κ° μμΈ μν©μ λν΄ μ μ ν μλ΅μ λ°νν¨
κ³Όμ μλ½ μ μμ±λ λ ν¬μ§ν°λ¦¬μ main λΈλμΉμ μμ±λ μ½λλ₯Ό νΈμνμΈμ.
(μ£Όμ
