RESTful API(Representational State Transfer API)λ μΉ μλΉμ€λ₯Ό ꡬμΆνκΈ° μν μ€κ³ λ°©μ μ€ νλλ‘, RESTλΌλ μν€ν
μ² μ€νμΌμ λ°λ₯΄λ APIλ‘, μ£Όλ‘ HTTP νλ‘ν μ½μ κΈ°λ°μΌλ‘νλ μΉ μλΉμ€ μν€ν
μ²μ
λλ€. μμ, λ©μλ, λ©μμ§ λ±μ μ μνμ¬ ν΄λΌμ΄μΈνΈ-μλ² κ°μ ν΅μ μ κ°λ₯νκ² ν©λλ€.
λ©μμ§(Message)
λ©μμ§λ ν΄λΌμ΄μΈνΈμ μλ² κ°μ ν΅μ μμ μ λ¬λλ λ°μ΄ν°μ λ΄μ©μ λνλ
λλ€. RESTful APIμμ λ©μμ§λ μμ²(Request)κ³Ό μλ΅(Response)λ‘ κ΅¬λΆλ©λλ€.
μμ² λ©μμ§
μμ² λ©μμ§λ ν΄λΌμ΄μΈνΈκ° μλ²λ‘ 보λ΄λ λ°μ΄ν°μ
λλ€. μ΄ λ°μ΄ν°μλ μμ²μ λͺ©μ κ³Ό ν¨κ» νμν μ λ³΄κ° ν¬ν¨λ μ μμ΅λλ€. μ£Όλ‘ JSON νμμΌλ‘ λ°μ΄ν°κ° μ μ‘λ©λλ€.
μμ² λ©μμ§μλ μμ²νλ μμμ μλ³, μμμ μν λ³κ²½μ μν λ°μ΄ν°, μμ²νλ μμ
μ μ’
λ₯(λ©μλ) λ±μ΄ ν¬ν¨λ μ μμ΅λλ€.
π μμ²(Request)
IDκ° 123μΈ μ¬μ©μμ μ 보λ₯Ό μ‘°ν : GET /users/123
{ "id": 123, "name": "John Doe", "email": "john@example.com" }
μλ‘μ΄ μ¬μ©μ μμ± : POST /users
{ "name": "Jane Doe", "email": "jane@example.com" }
- μλ΅: 201 Created (μ±κ³΅ μ)
μλ΅ λ©μμ§
μλ΅ λ©μμ§λ μλ²κ° ν΄λΌμ΄μΈνΈλ‘ 보λ΄λ λ°μ΄ν°μ
λλ€. ν΄λΌμ΄μΈνΈμ μμ²μ λν μλ΅μΌλ‘ μ±κ³΅ μ¬λΆ, μ²λ¦¬λ λ°μ΄ν°, λλ μ€λ₯ μ 보λ₯Ό ν΄λΌμ΄μΈνΈμκ² μ λ¬ν©λλ€. μΌλ°μ μΌλ‘ HTTP μν μ½λμ ν¨κ» JSON νμμΌλ‘ λ°νλλ©°, μν©μ λ°λΌ λ€μν ꡬ쑰λ₯Ό κ°μ§ μ μμ΅λλ€. λ§μ°¬κ°μ§λ‘ μ£Όλ‘ JSON νμμΌλ‘ λ°μ΄ν°κ° μ μ‘λ©λλ€.
- μν©: μ¬μ©μκ° νΉμ 리μμ€λ₯Ό μ±κ³΅μ μΌλ‘ μ‘°ννμ λ
- HTTP μν μ½λ: 200 OK
π μμ ) IDκ° 123μΈ μ¬μ©μλ₯Ό μ‘°ν
{ "status": "success", "data": { "id": 123, "name": "John Doe", "email": "john@example.com", "created_at": "2025-01-01T10:00:00Z" }, "message": "User retrieved successfully" }
- μν©: μλ‘μ΄ λ¦¬μμ€κ° μ±κ³΅μ μΌλ‘ μμ±λμμ λ
- HTTP μν μ½λ: 201 Created
π μμ ) μλ‘μ΄ μ¬μ©μλ₯Ό μΆκ°
{ "status": "success", "data": { "id": 124, "name": "Jane Doe", "email": "jane@example.com", "created_at": "2025-03-11T09:00:00Z" }, "message": "User created successfully", "location": "/users/124" }
- location: μλ‘ μμ±λ 리μμ€μ URIλ₯Ό λνλ (μ νμ ).
π μλ²μμ μλ΅ λ©μμ§ μ€κ³ ν
- μΌκ΄μ± μ μ§: μ±κ³΅/μ€λ₯ μλ΅ νμμ μΌκ΄λκ² μ€κ³ (μ: νμ status, data, message νλ μ¬μ©).
- μν μ½λ νμ©: μ μ ν HTTP μν μ½λλ₯Ό μ¬μ©ν΄ ν΄λΌμ΄μΈνΈκ° μλ΅μ μ½κ² ν΄μνλλ‘ λμ.
- μ€λ₯ μμΈ μ 곡: μ€λ₯ λ°μ μ error κ°μ²΄μ ꡬ체μ μΈ μ 보(μ½λ, λ©μμ§, μΈλΆμ¬ν)λ₯Ό ν¬ν¨ν΄ λλ²κΉ μ©μ΄μ±μ λμ.
- νμν λ°μ΄ν°λ§ λ°ν: ν΄λΌμ΄μΈνΈκ° νμλ‘ νλ μ λ³΄λ§ μ κ³΅ν΄ μ€λ²νμΉ(over-fetching)μ λ°©μ§.
μμ(Resource)
μμμ RESTful APIμ ν΅μ¬ κ°λ
μ€ νλμ
λλ€. URI(Uniform Resource Identifier)λ μΉμμ μλ£μ id μ¦, λ΄κ° μ¬λ¦° λΈλ‘κ·Έ κΈμ νΉμ idλ₯Ό μ
λ ₯ν΄μ€μΌ κΈμ λ³Όμ μλ κ²μ²λΌ URIλ μΈν°λ· μμμ λνλ΄λ μλ²μ μλ μ 보(κ³ μ μλ³μ)μ ννμ
λλ€.
μΌλ°μ μΌλ‘ μΉμμλ URIλ₯Ό μ¬μ©νμ¬ μλμ κ°μ΄ μμμ μλ³ν©λλ€.
μΌλ°μ μΌλ‘ μΉμμλ URIλ₯Ό μ¬μ©νμ¬ μλμ κ°μ΄ μμμ μλ³ν©λλ€.
- /todos ---- ν μΌ λͺ©λ‘μ΄λΌλ μμ
- /todos/1 ---- IDκ° 1μΈ νΉμ ν μΌ μμ
λ©μλ(Method) λ©μμ§
λ©μλ λ©μμ§λ ν΄λΌμ΄μΈνΈκ° μλ²μκ² μμ²νλ μμ
μ μ’
λ₯λ₯Ό λνλ
λλ€. RESTful APIμμλ μ£Όλ‘ λ€μκ³Ό κ°μ λ€ κ°μ§ λ©μλλ₯Ό μ¬μ©ν©λλ€.
- GET: μλ²μμ μμμ κ°μ Έμ€κΈ° μν΄ μ¬μ©λ©λλ€. ν΄λΌμ΄μΈνΈκ° μλ²μκ² νΉμ μμμ λν μ 보λ₯Ό μμ²ν λ μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄, /todosμ GET μμ²μ 보λ΄λ©΄ λͺ¨λ ν μΌ λͺ©λ‘μ κ°μ Έμ¬ μ μμ΅λλ€.
- POST: μλ²μ μλ‘μ΄ μμμ μμ±νκΈ° μν΄ μ¬μ©λ©λλ€. ν΄λΌμ΄μΈνΈκ° μλ²μκ² μλ‘μ΄ μμμ μΆκ°νλ €λ κ²½μ° μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄, /todosμ POST μμ²μ 보λ΄λ©΄ μλ‘μ΄ ν μΌμ μΆκ°ν μ μμ΅λλ€.
- PUT: μλ²μ μμμ μμ νκΈ° μν΄ μ¬μ©λ©λλ€. ν΄λΌμ΄μΈνΈκ° μλ²μκ² νΉμ μμμ μμ νλ €λ κ²½μ° μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄, /todos/1μ PUT μμ²μ 보λ΄λ©΄ IDκ° 1μΈ ν μΌμ μμ ν μ μμ΅λλ€.
- DELETE: μλ²μμ μμμ μμ νκΈ° μν΄ μ¬μ©λ©λλ€. ν΄λΌμ΄μΈνΈκ° μλ²μκ² νΉμ μμμ μμ νλ €λ κ²½μ° μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄, /todos/2μ DELETE μμ²μ 보λ΄λ©΄ IDκ° 2μΈ ν μΌμ μμ ν μ μμ΅λλ€.
RESTμ μ£Όμ νΉμ§
π ν΄λΌμ΄μΈνΈ-μλ² κ΅¬μ‘° (Client-Server)
ν΄λΌμ΄μΈνΈμ μλ²κ° λͺ
νν λΆλ¦¬λμ΄ μμ΅λλ€. ν΄λΌμ΄μΈνΈλ μμ²μ 보λ΄κ³ , μλ²λ μ΄μ λν μλ΅μ μ 곡ν©λλ€. μ΄λ‘ μΈν΄ κ° κ΅¬μ± μμκ° λ
립μ μΌλ‘ λ°μ ν μ μμ΅λλ€.
π μ λνΌ μΈν°νμ΄μ€(μΌκ΄μ μΈ μΈν°νμ΄μ€)
REST APIλ 리μμ€(λ°μ΄ν°)λ₯Ό URIλ‘ μλ³νκ³ , HTTP λ©μλ(GET, POST, PUT, DELETE λ±)λ₯Ό ν΅ν΄ μ‘°μν©λλ€. μ΄λ₯Ό ν΅ν΄ λ¨μνκ³ μΌκ΄λ μ κ·Ό λ°©μμ μ 곡ν©λλ€.
- μ: GET /users/123 (νΉμ μ¬μ©μ μ‘°ν), POST /users (μ¬μ©μ μμ±).
π 무μνμ±(Statelessness)
REST APIλ μνλ₯Ό κ΄λ¦¬νμ§ μλ statelessν νΉμ±μ κ°μ§λλ€. μνκ° μλ€λ κ²μ ν΄λΌμ΄μΈνΈκ° μλ²μ μμ²μ λ³΄λΌ λ κ° μμ²μ λ
립μ μΌλ‘ μ²λ¦¬λλ©°, μλ²λ μ΄μ μμ²μ μνλ₯Ό κΈ°μ΅νμ§ μμ΅λλ€. ν΄λΌμ΄μΈνΈλ νμν λͺ¨λ μ 보λ₯Ό μμ²μ ν¬ν¨ν΄μΌ ν©λλ€.
μ΄λ μλ²μ λΆνλ₯Ό μ€μ΄κ³ , νμ₯μ±μ λμ΄λλ° λμμ΄ λ©λλ€.
HTTPλ κΈ°λ³Έμ μΌλ‘ μνκ° μλ νλ‘ν μ½ μ
λλ€. λ°λΌμ HTTPλ₯Ό μ¬μ©νλ μΉ μ ν리μΌμ΄μ
μ κΈ°λ³Έμ μΌλ‘ μνκ° μλ ꡬ쑰λ₯Ό λ°λ¦
λλ€.
π μΊμ κ°λ₯ (Cacheable)
μλ΅ λ°μ΄ν°λ μΊμ κ°λ₯ μ¬λΆλ₯Ό λͺ
μν μ μμ΄, ν΄λΌμ΄μΈνΈλ μ€κ° μλ²κ° λμΌν μμ²μ λν΄ μ΄μ μλ΅μ μ¬μ¬μ©ν μ μμ΅λλ€. μ΄λ μ±λ₯μ ν₯μμν΅λλ€.
π κ³μΈ΅ν μμ€ν (Layered System)
ν΄λΌμ΄μΈνΈλ μλ²μ μ§μ ν΅μ νλμ§, μλλ©΄ νλ‘μλ κ²μ΄νΈμ¨μ΄ κ°μ μ€κ° κ³μΈ΅μ κ±°μΉλμ§ μ νμκ° μμ΅λλ€. μ΄λ 보μκ³Ό νμ₯μ±μ λμ
λλ€.
π 리μμ€ μ€μ¬ (Resource-Based)
λͺ¨λ λ°μ΄ν°λ 리μμ€λ‘ ννλλ©°, ν΄λΌμ΄μΈνΈλ 리μμ€λ₯Ό μ‘°μν©λλ€. 리μμ€λ JSON, XML λ±μ νμμΌλ‘ ννλ©λλ€.
π HTTP νλ‘ν μ½ νμ©
RESTλ μ£Όλ‘ HTTPλ₯Ό κΈ°λ°μΌλ‘ λμνλ©°, μν μ½λ(200 OK, 404 Not Found λ±)λ₯Ό μ¬μ©ν΄ μμ²μ μ±κ³΅/μ€ν¨ μ¬λΆλ₯Ό μ λ¬ν©λλ€.
π κΈ°ν
- νμ₯μ±: Statelessμ κ³μΈ΅ν λλΆμ μλ² λΆνλ₯Ό λΆμ°νκΈ° μ½μ΅λλ€.
- μ μ°μ±: λ€μν ν΄λΌμ΄μΈνΈ(μΉ, λͺ¨λ°μΌ λ±)μμ μ¬μ© κ°λ₯ν©λλ€.
- λ¨μμ±: μ§κ΄μ μΈ μ€κ³λ‘ κ°λ°κ³Ό μ μ§λ³΄μκ° μ©μ΄ν©λλ€.
μ΄μ κ°μ νΉμ§λ€λ‘ REST APIλ μΈν°λ· μμ μμμ νννκ³ , λ€μν νλ«νΌ λ° μΈμ΄ κ°μ ν΅μ μ κ°μννλ©°, νμ₯μ± μλ μμ€ν
μ ꡬμΆνλ λ° μ¬μ©λ©λλ€.