π¨π»π» λ€μ΄κ°λ©°
μ΅κ·Ό μ νλ μκ° μμ RESTful APIλ₯Ό μ€κ³νκ³ κ΅¬νν΄μΌ νμ΅λλ€. κ·Έ μμ€μ μμ§ μ μμ§κ° λμ§ μμλμ§ λ¬νκ² μνκ°μ΄ μλ λΆλΆμ΄ μμλλ°μ, λ°λ‘ DELETE μμ² λ©μλμ μ²λ¦¬ μ μ± μ λλ€.
λ¨μν μμ μμ€μμ DELETE μμ² λ©μλλ‘ μμ μμ λ₯Ό μμ²νλ κ²μ μ λ§ μ½μ§λ§, μλ μν©μμ κ³ λ―Όλλ μ§μ λ€μ΄ μμμ΅λλ€.
- DELETE μμ²ν ν΄λΌμ΄μΈνΈμ κΆνμ κ²μ¬ν΄μΌνλ μν©μμ, μΈμ¦/μΈκ°μ νμν μ 보λ₯Ό μ΄λμ λ΄μμ μμ²ν΄μΌν κΉ?
- Soft delete νλ μν©μμ soft delete μ¬λΆλ₯Ό κ΄λ¦¬νλ μ»¬λΌ μ΄λ¦μ 무μμ΄ μ μ ν κΉ?
- κ·Έλ¦¬κ³ μμμ μμ νλ κ²μ΄ μλλΌ νλκ·Έλ₯Ό λ°κΎΈλ κ²μ΄λ λ©μλλ PATCH λ©μλλ₯Ό μ¨μΌνλ κ±ΈκΉ?
- DELETE μμ²μ λν΄ μλ΅ν΄μΌνλ μν©μμ μ΄λ€ κ°μ 리ν΄ν΄μΌν κΉ?
κ³ λ―Όν λ΄μ©μ DELETE μμ² λ©μλλ₯Ό μ²λ¦¬νλ κ³Όμ μ μμ², μ€ν, μλ΅μΌλ‘ λλ μ 곡μ ν©λλ€.
π μμ²
λ³΄ν΅ RESTful APIμμλ λμΌν μμμ λν΄ CRUD μμ²μ νλλΌλ, μμ²ν ν΄λΌμ΄μΈνΈμ κΆνμ λ°λΌ λ€λ₯΄κ² λμνλλ‘ κ΅¬νν νμκ° μμ΅λλ€. DELETE μμ² λ©μλλ API νΈμΆ μ μμμ λ³νλ₯Ό μΌμΌν¨λ€λ μ μμ 'λΉμμ μ±'μ κ°μ§λ―λ‘, κΆν κ²μ¬κ° λλμ± νμμ λλ€.
κΆν κ²μ¬λ μ΄λ»κ² ν μ μμκΉμ? μΉ μλΉμ€μμ μ£Όλ‘ μ°μ΄λ HTTP νλ‘ν μ½μ κΈ°λ³Έμ μΌλ‘ μνλ₯Ό μ μ₯νμ§ μμΌλ―λ‘(Stateless), DELETE μμ² λ©μΈμ§μ ν΄λΌμ΄μΈνΈλ₯Ό μΈμ¦/μΈκ°νλλ° νμν μ 보λ₯Ό ν¨κ» λ³΄λΌ νμκ° μμ΅λλ€.
κ·Έλ¦¬κ³ μ΄ μ 보λ₯Ό μμ² λ©μΈμ§μ λ΄μλ§ν κ³³μΌλ‘ 3κ°μ§λ₯Ό κ³ λ €ν μ μμ΅λλ€.
URL query string parameter (λΉμΆμ²)
κ°νΈνμ§λ§ 보μμ μ·¨μ½νλ―λ‘ μΆμ²νμ§ μμ΅λλ€. μλ²½ν 보μμ μλ€μ§λ§ "μ λλ€..?" μλ¦¬κ° μ λ‘ λμ¬ μ μμ΅λλ€.
- μΈμ¦μ νμν username, id, password λ± λ―Όκ° μ λ³΄κ° κ·Έλλ‘ λ ΈμΆλ μ μμΌλ―λ‘ λ³΄μμ μ’μ§ μμ΅λλ€.
- λν μλ μ΄μ λ€ λλ¬Έμ HTTPSλ₯Ό μ¬μ©νλλΌλ μ¬μ ν 보μμ μ’μ§ μμ΅λλ€!
- server logμ passwordκ° νλ¬ΈμΌλ‘ κ·Έλλ‘ μ μ₯λ μ μμ΅λλ€.
- λΈλΌμ°μ νμ€ν 리μ URLμ΄ μ μ₯λ μ μμ΅λλ€.
- Google Analytics κ°μ μ ν리μΌμ΄μ μ Referer ν€λλ€λ‘ URLμ΄ μ λ¬λλ©° λ―Όκ°μ λ³΄κ° κ·Έλλ‘ λλ¬λ μλ μμ΅λλ€.
Request Body parameter (λΉμΆμ²)
A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request. - RFC 7231
Request bodyμ μΈμ¦/μΈκ° μ 보λ₯Ό λ£λ κ²μ μ΄λ¨κΉμ? URL query string parameterμ λΉν΄ URLμ μ§μ λ ΈμΆμ΄ λμ§ μμΌλ―λ‘ Query string λ°©μ보λ€λ 보μμ΄ μ’λ€κ³ ν μ μλλ°μ(μ¬μ ν μνΈνλ νμμ§λ§), μ΄λ‘μ μΈ λ°©μμ΄λΌλ μ μμ μΆμ²νμ§ μμ΅λλ€.
- DELETE μμ²μ Requestμ bodyλ₯Ό ν¬ν¨μν€λ κ²μ΄ κΈμ§λμ΄ μμ§λ μμ΅λλ€, νμ§λ§ DELETE μμ² λ©μΈμ§μ bodyκ° ν¬ν¨λμ΄μμΌλ©΄ μμ²μ κ±°μ ν΄λ²λ¦¬λ μλ²κ° λ§μ΅λλ€. μ΄λ‘μ μΈ λ°©μμΌλ‘ λ°μλ€μ¬μ§κ³ μλ κ²μ΄μ£ .
λ³κ°λ‘ κ΅³μ΄ DELETE λ©μλλ₯Ό κ³ μ§ν νμκ° μλ€λ©΄, Request bodyμ νμν μ 보λ₯Ό λ΄κ³ , POST λ©μλ μμ² λ©μΈμ§λ₯Ό 보λ΄λ κ²λ λμμ§ μμ λ°©λ²μ λλ€. DELETE λ©μλ μ체λ₯Ό νμ©νμ§ μλ μλ², λ°©νλ²½μ΄ λ§μμ νΈμμ± μΈ‘λ©΄μμ λ μ’μ μλ μμ΅λλ€. μ€μ λ‘ TOSSμ κ²°μ μμ€ν μ κ²½μ°, PG μ°λ κ°λ°μλ€μ νΈμλ₯Ό μν΄ POST λ©μλλ‘ DELETE μμ²μ ν΄λΉνλ APIλ₯Ό λμμΈν μ¬λ‘κ° μμ΅λλ€. κ΄λ ¨ λ΄μ©μ μ΄ λ§ν¬μ μμ½ν΄λμ΄μ :)
Request Header parameter (μΆμ²)
Request headerμ κ°μ λ£μ΄μ μμ²νλ κ²μ μΆμ²ν©λλ€. Query stringλ³΄λ€ λ³΄μμ΄ μ¬λμ΄λλ§ μ’κ³ , Body parameterλ³΄λ€ μ’ λ μΌλ°μ μΈ λ°©λ²μ λλ€.
μ κ° νμΈν Request headerλ₯Ό μ΄μ©ν λ°©λ² μμλ μλμ κ°μ΅λλ€.
Authorization
ν€λμBearer
νμ μ λͺ μνκ³ , μΈμ¦ μ λ³΄κ° λ΄κΈ΄ JWT ν ν°μ λ£μ΄μ 보λ΄λ λ°©λ²Authorization
ν€λμBasic
νμ μ λͺ μνκ³ ,username:password
μ BASE64 μΈμ½λ©ν΄μ HTTPSλ‘ λ³΄λ΄λ λ°©λ². BASE64λ μ½κ² λμ½λ©μ΄ κ°λ₯νκΈ° λλ¬Έμ λ³λ λ°©λ²μΌλ‘ μνΈνν νμκ° μμ΅λλ€.
π μ€ν
ν΄λΌμ΄μΈνΈμ μμ²μ΄ μ ν¨νλ€λ©΄, μμμ hard delete ν μ§, soft delete ν μ§ μ νν΄μΌ ν©λλ€. κ°μ μ₯λ¨μ μ΄ μμ΅λλ€.
Hard delete
- 쿼리λ₯Ό λ 릴 λ μ΄μ μ 'Delete' μ²λ¦¬ν λ μ½λλ₯Ό μ κ²½μΈ νμκ° μμ΅λλ€.
- λ°μ΄ν°λ² μ΄μ€ μ©λμ΄ μλμ μΌλ‘ μ μ½λ©λλ€.
- νλ² μμ νλ©΄ λ°μ΄ν°λ₯Ό 볡ꡬνκΈ° νλλλ€.
Soft delete
- 쿼리λ₯Ό λ 릴 λ μ΄μ μ 'Delete' μ²λ¦¬ν λ μ½λλ μ κ²½μ¨μ€μΌ ν©λλ€.
- κ°μΈμ 보μ κ΄λ ¨λ λ μ½λλ₯Ό soft delete μ²λ¦¬νλ€λ©΄ κ°μΈμ 보 보νΈλ²μ μ€μν΄μΌ ν©λλ€.
- λ°μ΄ν°λ₯Ό 볡ꡬνκ±°λ λ€λ₯Έ μ©λλ‘ νμ©ν λ κ°νΈν©λλ€.
Soft deleteλ₯Ό ꡬνν λ μ΄λ€ μμΌλ‘ ꡬνν μ§ κ³ λ―Όλμλλ°μ, μ κ²½μ° μμ λμλμ§ μ¬λΆλ₯Ό booleanμΌλ‘ μ μ₯νλ columnμ μΆκ°νμ΅λλ€. μ°Ύμ보λ λ€μ΄λ°μ λ³΄ν΅ active/inactive
, removed
, is_deleted
μ λκ° κ³ λ €λλ κ²μΌλ‘ 보μ΄λλ°, is_deleted
κ° κ°μ₯ μ·¨ν₯μ λ§μμ΅λλ€. booleanκ° λμ μμ μΌμλ₯Ό datetimeμΌλ‘ μ μ₯ν΄μ, ν΄λΉ 컬λΌμ΄ nullμΈμ§ μ¬λΆλ₯Ό νμΈνλ λ°©μμΌλ‘ κ΄λ¦¬νλ μ€νμΌλ μμ΅λλ€.
νλ¨μ soft deleteμ μ»¬λΌ μμ±μ λν λ©ν λμ μ견μ λλ€.
μ κ·Έλ¦¬κ³ μ΄ λ μ΄μ§ μ°μ°ν μλ μλ λΆλΆμ΄ μμ΅λλ€. Soft deleteλ₯Ό ν κ²½μ° μ€μ λμμ μμμ μμ νλ κ²μ΄ μλλΌ, μ»¬λΌ μ 보λ₯Ό μΌλΆλΆ μ
λ°μ΄νΈνλ μμΌλ‘ μλνλκΉ PATCH
λ PUT
λ©μλ, νΉμ POST
λ©μλλ₯Ό νμ©ν΄μΌν κΉμ??
νμΈν΄λ³΄λ μ΄ λΆλΆμ μ΄κ²¬μ΄ κ°λ¦¬λ κ²μΌλ‘ 보μ
λλ€. μ λ κ°μΈμ μΌλ‘ DELETE
λ©μλλ₯Ό νμ©νλ κ²μ΄ λ°λμ§νλ€κ³ μκ°ν©λλ€. μμ² λ©μλμλ ν΄λΌμ΄μΈνΈμ μμ² μλκ° λλ¬λλ©΄ μΆ©λΆνλ©°, λ΄λΆ λμμ κ°μΆ°μ Έ μλ κ²½μ°κ° 보ν΅μ΄κΈ° λλ¬Έμ
λλ€.
π μλ΅
A successful response of DELETE requests SHOULD be HTTP response code 200 (OK) if the response includes an entity describing the status, 202 (Accepted) if the action has been queued, or 204 (No Content) if the action has been performed but the response does not include an entity. - RFC 7231
μ΄μ DELETE λ©μλλ₯Ό μ€νν κ²°κ³Όμ λ°λΌ μ μ ν μν μ½λλ₯Ό μλ΅ν΄μ£Όλ©΄ λ©λλ€.
202(Accepted)
: DELETEμ ν΄λΉνλ μμ²μ΄ μ μ μλμκ³ , μμ μ΄ μ€νλ μμ μΌ λ.204(No Content)
: μμ μ΄ μνλμμΌλ©° λ³λλ‘ λ΄μ©μ λ°νν κ² μμ λ.200(OK)
: μμ μ΄ μ μνλμκ³ , μμ μ λν λ΄μ©μ λ°νν λ.
ex) μ κ²½μ° νλ‘ νΈμλλ₯Ό 맑μ λλ£μ μμ²μ λ°λΌ μ μμ μΌλ‘ μνλμμ κ²½μ° 200 μνμ½λλ₯Ό μλ΅νλ©° μμ λ λ°μ΄ν°μ κ΄ν μ 보λ₯Ό Bodyμ λ£μ΄μ μλ΅νμ΅λλ€.
π¨π»π» λ§μΉλ©°
API μ€κ³μ ꡬνμ λ± λ² μ€νΈ νλ ν°μ€κ° μλ κ²μ΄ μλλΌ κ°λ° νμ μ μ± μ λ°λΌ μ ννλκ² λ§λ κ² κ°μ΅λλ€. κ·Έλλ κ° λ°©μμ μ₯λ¨μ μ κ³ λ €ν΄μ μν©μ λ§κ² μ νν μ μλλ‘ κ³ λ―Όν κΈ°νκ° μμ λ 미리 κ³ λ―Όν΄λλ κ²μ΄ μ’μ κ² κ°λ€μ :)
μμμ μκ°λλ¦° DELETE λ©μλ λ€λ£¨λ λ°©μ μΈμ λ λμ λ°©λ²μ΄ μλ€λ©΄ λκΈλ‘ μλ €μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€, μ±μ€ν λ°μνκ² μ΅λλ€!