#1 ๋ฌด์(What)์ ๋ํ API์ธ๊ฐ?
#1-1 ๊ฐ์
REST(REpresentational State Transfer) ๋๋ RESTful API๋ ์๋ฒ์ ์์(Resource)์ ๋๊ณ , ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ๋ฐฉ๋ฒ์ ๊ท์ ํ๋ API(Application Programming Interface)๋ค. ์์์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ค. ๋ธ๋ก๊ทธ๋ฅผ ์๋ก ๋ค๋ฉด ๊ฒ์๊ธ, ๋๊ธ ๋ฑ์ด ์์์ด๋ค.
์ด ์์์ ์๋ก ๊ตฌ๋ถํ ์ ์๋ ๊ณ ์ ํ ์๋ณ์(URI)๋ฅผ ๊ฐ์ง๊ณ ์๋ค. REST API์์๋ URI์ ์ํ๋ ํ์ ๋ฒ์ฃผ์ธ URL์ ์์์ ์๋ณ์๋ก์ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด URL์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ผ์ ์ํ์์ ์ฌ์ฉํ๋ ๋จ์ด์ธ ์ธํฐ๋ท ์ฃผ์๋ค.
#1-2 URL(Uniform Resource Locator)์ ๊ตฌ์กฐ
URL์ ์ ์ฒด ๊ตฌ์กฐ๋ ์์ ๊ฐ๋ค.
#1-3 Scheme
http
https
ftp
ssl
...
ํต์ ์ ์ํ ์ฒด๊ณ(Scheme)๋ก, ํ๋กํ ์ฝ์ด๋ผ๊ณ ํ๋ค.
#1-4 Host
www.naver.com
123.789.456.777
...
์๋ฒ์ ๋๋ฉ์ธ ์ด๋ฆ์ด๋ IP ์ฃผ์๋ฅผ ์ง์ ํ๋ค.
#1-5 Port (์๋ต ๊ฐ๋ฅ)
:123
:777
:80
:443
...
์๋ฒ์ ์ด๋ค ํฌํธ์ ํต์ ํ ์ง๋ฅผ ์ง์ ํ๋ค. ์๋ต ์์๋ ๊ธฐ๋ณธ ํฌํธ ๋ฒํธ๊ฐ ํ ๋น๋๋๋ฐ, HTTP์ ๊ธฐ๋ณธ ํฌํธ ๋ฒํธ๋ 80์ด๊ณ HTTPS์ ๊ธฐ๋ณธ ํฌํธ ๋ฒํธ๋ 443์ด๋ผ๊ณ ํ๋ค.
#1-6 Path (์๋ต ๊ฐ๋ฅ)
/137
/posts
/posts/4
...
์์์ ์์น๋ค. ์ฌ๋ฌ ํด๋์ ๊ฒน๊ฒนํ ์ธ์ฌ์๋ ํ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด ๋ณธ ๊ฒ์๊ธ #2-1์ ์ด๋ฏธ์ง ํ๋จ์ ์๋ ์ถ์ฒ ๋งํฌ์์๋ /@abhirup.acharya009/uri-vs-urn-vs-url-key-distinctions-explained-dec8e02ebd18๊ฐ Path๋ค.
#1-7 Query Parameters (์๋ต ๊ฐ๋ฅ)
?id=2
?grade=1&major=computer%20science
...
๋ถ๋ฌ์ฌ ์์์ ์ ๋ณํ๋, ํํฐ๋งํ๋ ์ผ์ข
์ ์กฐ๊ฑด๋ฌธ์ด๋ค. ํด๋ผ์ด์ธํธ๋ ์์ ์ด ํ์ํ ์ ๋ณด๋ง์ ์๋ฒ์ ์์ฒญํ ์ ์์ด ์ข๊ณ , ์๋ฒ๋ ๋ณด๋ด์ค ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฝํ๋ ํจ๊ณผ๊ฐ ์๊ธฐ์ ์ด๋์ด๋ค.
#1-8 Fragment Identifier (์๋ต ๊ฐ๋ฅ)
#summary
#inherited-fields
...
์์์ ํน์ ๋ฌธ๋จ์ ์๋ฏธํ๋ค. Fragment Identifier๊ฐ ํฌํจ๋ URL์ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฉด, ํด๋น ๋ฌธ๋จ๊น์ง ์คํฌ๋กค์ด ๋ด๋ ค๊ฐ ์ํ๋ก ์น ํ์ด์ง๊ฐ ์ด๋ฆฐ๋ค. ์๋ฅผ ๋ค์ด, ์ด ๋งํฌ์ ์ด ๋งํฌ๋ Fragment Identifier๊ฐ ์๋ก ๋ค๋ฅด์ง๋ง, ๋๋จธ์ง๋ ๋๊ฐ์ URL ๋งํฌ๋ค. ๊ทธ๋ผ์๋ ๋ธ๋ผ์ฐ์ ๋ก ์ด์์ ๋ ๋ณด์ด๋ ๋ด์ฉ์ด ๋ค๋ฅด๋ค.
#2 ์ด๋ป๊ฒ(How) ์์์ ์์ฒญ(Request)ํ๋๊ฐ?
#2-1 CRUD์ ๊ตฌํ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ณธ์ ์ธ ๋์์ Create, Read, Update, Delete๋ก ์ฐ๋ฆฌ๋ง๋ก ํ๋ฉด ์ฐจ๋ก๋๋ก ๋ฐ์ดํฐ ์์ฑ, ์ฝ๊ธฐ, ๊ฐฑ์ , ์ญ์ ๋ค. ์์ด ์ ๊ธ์๋ฅผ ํ๋์ฉ ๋ฐ์ CRUD๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. #1์์ REST API๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ์์์ ๋ค๋ฃจ๋ API๋ผ๊ณ ํ๋ค. ๋ฐ๋ผ์ REST API์๋ CRUD์ ๊ตฌํ(์์)ํ๋ ๋์์ด ์๋ค. Create๋ฅผ ๊ตฌํํ Post, Read๋ฅผ ๊ตฌํํ Get, Update๋ฅผ ๊ตฌํํ Patch ๋๋ Put, Delete๋ฅผ ๋๊ฐ์ ์ด๋ฆ์ผ๋ก ๊ตฌํํ Delete๊ฐ ๊ทธ๊ฒ์ด๋ค. ์ด Post, Get, Patch, Put, Delete๋ฅผ HTTP ๋ฉ์๋๋ผ๊ณ ํ๋ฉฐ, REST API๋ HTTP ๋ฉ์๋๋ฅผ ํตํด ์์์ ์์ฒญํ๋ค. ์ด๋ฆ์์ ์ ์ ์๋ฏ HTTP ๋ฉ์๋๋ HTTP ํ๋กํ ์ฝ์ ์ผ๋ถ๋ค.
์ฌ๋ด์ผ๋ก ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์, HTTP ํ๋กํ ์ฝ์ REST API์ ์ ์ ๋ฌผ์ด ์๋๋ผ๋ ๊ฒ์ด๋ค. REST API๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ์ ๋ง์ API ์ค ํ๋์ ๋ถ๊ณผํ๋ค.
#2-2 HTTP (Hypertext Transfer Protocol) ์์ฒญ์ ๊ตฌ์กฐ
[HTTP ๋ฉ์๋] [Path + Query Parameter + Fragment Identifier] [HTTP ๋ฒ์ ]
Host: [Host + Port]
User-Agent: [ํด๋ผ์ด์ธํธ์ ์ํํธ์จ์ด(์ด์์ฒด์ , ๋ธ๋ผ์ฐ์ ๋ฑ) ์ข ๋ฅ์ ๋ฒ์ ๋ช ์]
Content-Type: [(Body๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง) ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๋ณด๋ด๋ ๋ฏธ๋์ด ํ์ (์ฝํ ์ธ ์ ํ) ๋ช ์]
Content-Length: [(Body๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง) ๋ณธ๋ฌธ(Body)๋ง์ ๊ธธ์ด(๋ฐ์ดํธ ๋จ์)๋ฅผ ๋ช ์. Body๊ฐ ์๋ค๋ฉด 0์ผ๋ก ๋๊ฑฐ๋ ์๋ต]
Accept: [(์๋ต ๊ฐ๋ฅ) ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก๋ถํฐ ๋ฐ๊ธฐ๋ฅผ ์ํ๋ ๋ฏธ๋์ด ํ์ (์ฝํ ์ธ ์ ํ) ๋ช ์]
Accept-Language: [(์๋ต ๊ฐ๋ฅ) ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ ์ธ์ด์ ์ฐ์ ์์๋ฅผ ์ง์ ]
Referer: [(์๋ต ๊ฐ๋ฅ) ์ด์ ํ์ด์ง์ URL. ์ฌ์ฉ์๊ฐ ์ด๋์์ ์๋์ง ๋ช ์]
Cache-Control: [(์๋ต ๊ฐ๋ฅ) ์บ์ ์ฌ์ฉ์ ๋ํ ์ค์ ]
Connection: [(์๋ต ๊ฐ๋ฅ) ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ฐ๊ฒฐ์ ์ ์งํ ๊ฒ์ธ์ง์ ๊ดํ ๋ด์ฉ]
[Body (๋ณธ๋ฌธ)]
์ ์ฒด์ ์ธ ๋ฌธ๋ฒ์ ์์ ๊ฐ๋ค. HTTP Method๋ HTTP ํ๋กํ ์ฝ์ Header๋ง ์ฐ๋๊ฐ? ์๋๋ฉด Body๊น์ง ์ฐ๋๊ฐ?๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋ ์ ์๋ค. [Body]์ ์ ๋ถ๋ถ์ด ์ ๋ถ Header๋ค. Body๋ ์๋ฒ์ ์ด๋ค ์ ๋ณด๋ฅผ ๋ณด๋ด๊ธฐ ์ํ ๊ณต๊ฐ์ด๋ค. ๊ธ๊ณผ ์ฌ์ง์ด ์๋ฉ ์ฒจ๋ถ๋ ๊ฒ์๊ธ์ ์ธํฐ๋ท ๊ฒ์ํ์ ์์ฑํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ก ๋ค ์ ์๋ค. Post, Patch, Put์ด Body๊น์ง ์ฐ๋(ํ์๋ก ํ๋) HTTP Method๋ค. ๋ฐ๋ฉด, Get๊ณผ Delete๋ ์์์ ๋จ์ ์ฐธ์กฐ, ๋จ์ ์ญ์ ์ด๊ธฐ ๋๋ฌธ์ Body๊ฐ ํ์์๋ค.
์๋๋ ๊ทธ ์์๋ค์ด๋ค.
#2-3 Post
POST /api/users HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 63
{
"name": "John Doe",
"email": "john.doe@example.com"
}
http://www.example.com/api/users์ ์ user๋ฅผ ์ถ๊ฐ(Create)ํ๋ Post Request๋ค. ํฌํธ ๋ฒํธ๋ ์๋ต๋์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ ํฌํธ ๋ฒํธ๋ก ์์ฒญ๋๋ค.
#2-4 Get
GET /api/resource?id=123 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: application/json
Accept-Language: en-US,en;q=0.9
Referer: https://www.google.com/
Cache-Control: max-age=0
Connection: keep-alive
www.example.com/api/resource?id=123์ Get(=Read)ํ๋ ์์ฒญ(request)์ด๋ค. ์ด ํด๋ผ์ด์ธํธ๋ ํด๋น ์์์ JSON ํ์์ผ๋ก ๋ฐ๊ธฐ๋ฅผ ์ํ๊ณ ์๋ค.
#2-5 Patch
PATCH /api/users/123 HTTP/1.1
Host: http://www.example.com
Content-Type: application/json
Content-Length: 40
{
"email": "new.email@example.com"
}
Patch๋ ๋ถ๋ถ ์์ ์ด๋ค. ๋ฐ๋ผ์, ์์ ์ด ํ์ํ ๋ถ๋ถ๋ง ์๋ก ๋ณด๋ธ๋ค. ๋ณด๋ด์ง ์์ ๋ถ๋ถ์ ๊ธฐ์กด์ ์์์ด ๊ทธ๋๋ก ์ ์ง๋๋ค.
#2-6 Put
PUT /api/users/123 HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 67
{
"name": "John Smith",
"email": "john.smith@example.com"
}
HTTP ๋ฉ์๋๋ฅผ ์ ์ธํ๋ฉด Post์ ์์ ํ ๋๊ฐ๋ค. ๋ค๋ง, Post๋ ์กด์ฌํ์ง ์๋ ์์์ ์ฒ์์ผ๋ก ๋ง๋๋ ์์ฒญ์ด์ง๋ง, Put์ ์ด๋ฏธ ์กด์ฌํ๋ ์์์ ๊ฐํ๋ ์์ฒญ์ด๋ผ๋ ์ฐจ์ด๊ฐ ์๋ค.
#2-7 Delete
DELETE /api/users/123 HTTP/1.1
Host: www.example.com
ํด๋น Path์ ์์์ ์ญ์ ํ๋ค.
#3 ์ด๋ป๊ฒ(How) ์์์ ์๋ต(Response)ํด ์ฃผ๋๊ฐ?
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ(Request)ํ์ผ๋ฏ๋ก, ์ด์ ๋ ์๋ฒ๊ฐ ์๋ต(Response)ํด์ค ์ฐจ๋ก๋ค.
#3-1 HTTP (Hypertext Transfer Protocol) ์๋ต์ ๊ตฌ์กฐ
[HTTP ๋ฒ์ ] [์ํ ์ฝ๋] [(์๋ต ๊ฐ๋ฅ) ์ํ ๋ฉ์์ง]
Data: [์๋ต์ด ์์ฑ๋ ๋ ์ง์ ์๊ฐ]
Content-Type: [์๋ต์ ๋ฏธ๋์ด ํ์ (์ฝํ ์ธ ์ ํ) ๋ช ์]
Content-Length: [๋ณธ๋ฌธ(Body)๋ง์ ๊ธธ์ด(๋ฐ์ดํธ ๋จ์)๋ฅผ ๋ช ์]
Location: [(์ฃผ๋ก ์ํ์ฝ๋๊ฐ 3xx์ผ ๋) ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ ์์์ ์์น]
Server: [(์๋ต ๊ฐ๋ฅ) ์๋ฒ์ ์ํํธ์จ์ด(์ด์์ฒด์ , ๋ธ๋ผ์ฐ์ ๋ฑ) ์ข ๋ฅ์ ๋ฒ์ ๋ช ์]
Cache-Control: [(์๋ต ๊ฐ๋ฅ) ์บ์ ์ฌ์ฉ์ ๋ํ ์ค์ ]
Expires: [(์๋ต ๊ฐ๋ฅ) ์๋ต์ ์ ํจ๊ธฐ๊ฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ ค์ค. ์ ํจ๊ธฐ๊ฐ ์ดํ์๋ ํด๋น ์๋ต์ ๋ค์ ์์ฒญํด์ผ ํจ]
Set-Cookie: [(์๋ต ๊ฐ๋ฅ) ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ฟ ํค๋ฅผ ์ค์ ํ๋๋ก ์ง์ํ๋ ๋ฐ ์ฌ์ฉ]
[Body (๋ณธ๋ฌธ)]
์ ์ฒด์ ์ธ ๋ฌธ๋ฒ์ ์์ ๊ฐ๋ค. ์ํ ์ฝ๋๋ 3์๋ฆฌ ์ซ์๋ก, ํฌ๊ฒ 5๊ฐ์ง์ ๋ฒ์ฃผ๋ก ๋๋ ์ง๋ค. ์ํ์ฝ๋์ ๋ฐฑ์ ์๋ฆฌ ์ซ์๊ฐ 1์ธ ๊ฒฝ์ฐ ์ฆ ์ํ์ฝ๋๊ฐ 1XX์ธ ๊ฒฝ์ฐ๋ ์ ๋ณด, ์๋ฅผ ๋ค์ด ํด๋ผ์ด์ธํธ์ ๋จ์ ์์ฒญ์ ๋ ๋ฐ์ ์ค๋น๊ฐ ๋์๋ค๋ ๊ฒ๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ๋ ์๋ต์ด๋ค. ์ํ์ฝ๋๊ฐ 2XX๋ ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ ์๋์์์ ์๋ฏธํ๋ค. 3XX๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ์์ฑ๋๊ธฐ ์ํด์ ๋ฆฌ๋ค์ด๋ ์
๋ฑ์ ์ถ๊ฐ์ ์ธ ์กฐ์น๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค. 4XX๋ ํด๋ผ์ด์ธํธ ์ธก์ ์ค๋ฅ๋ก ์ธํด ์์ฒญ์ด ์คํจํ์์, 5XX๋ ์๋ฒ ์ธก์ ์ค๋ฅ๋ก ์์ฒญ์ด ์คํจ๋์์ ์๋ฏธํ๋ค. (์ฐธ์กฐ: ์ ์ฒด ์๋ต ์ฝ๋์ ๋ฆฌ์คํธ)
์๋๋ ๊ทธ ์์๋ค.
#3-2 ์ํ ์ฝ๋ 1XX
HTTP/1.1 100 Continue
Date: Tue, 01 Jan 2024 12:00:00 GMT
Server: Apache/2.4.38 (Ubuntu)
Content-Length: 0
Connection: keep-alive
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ด๊ธด ๋ณธ๋ฌธ์ด ๋ค ์๋ฒ๋ก ์ฌ ๋๊น์ง ๊ณ์ํด์ ๋ณด๋ด๋ผ๋ ์๋ฒ ์ธก์ ์๋ต
#3-3 ์ํ ์ฝ๋ 2XX - ๋ณธ๋ฌธ(Body)์ด HTML ํ์์ธ ์๋ต
HTTP/1.1 200 OK
Date: Tue, 01 Jan 2024 12:00:00 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 129
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
#3-4 ์ํ ์ฝ๋ 2XX - ๋ณธ๋ฌธ(Body)์ด JSON ํ์์ธ ์๋ต
HTTP/1.1 200 OK
Date: Tue, 01 Jan 2024 12:00:00 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 61
{
"name": "John",
"age": 30,
"city": "New York"
}
#3-5 ์ํ ์ฝ๋ 3XX
HTTP/1.1 301 Moved Permanently
Date: Tue, 01 Jan 2024 12:00:00 GMT
Server: Apache/2.4.38 (Ubuntu)
Location: https://www.example.com/new-page
Content-Length: 0
Connection: keep-alive
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ์์์ด ์ ์์น๋ก ์ด๋๋์์์ ๋ํ๋ด๋ ์๋ต์ด๋ค. ํด๋ผ์ด์ธํธ๋ Location์ ๋ช
์๋ ์์์ผ๋ก ์๋์ผ๋ก ์ด๋๋๋ค.
#3-6 ์ํ ์ฝ๋ 4XX
HTTP/1.1 404 Not Found
Date: Tue, 01 Jan 2024 12:00:00 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 13
404 Not Found
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ์์์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์ ์๋ต.
#3-7 ์ํ ์ฝ๋ 5XX
HTTP/1.1 500 Internal Server Error
Date: Tue, 01 Jan 2024 12:00:00 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 18
500 Internal Error
์๋ฒ ๋ด๋ถ ์ค๋ฅ.
#4 REST API๋ฅผ ๊ตฌํํ๋ ์๋ฒ๊ฐ ์ง์ผ์ผํ ๊ท์น
#4-1 Stateless
ํด๋ผ์ด์ธํธ: "์๋ฒ์ผ, A ์๋ ค์ค."
์๋ฒ: "๋ค."
...
ํด๋ผ์ด์ธํธ: "์๋ฒ์ผ, A ์๋ ค์ค."
์๋ฒ: "์๊น ์ ์ ์ด๋ฏธ ๋ด๊ฐ ์ ๋ณด๋ฅผ ์๋ ค์คฌ๋ ํด๋ผ์ด์ธํธ์์? ๊ทธ๋ฌ๋๊น ์ ๋ผ."
ํด๋ผ์ด์ธํธ: "์ด ์๋ฒ Stateless ์ ์งํค๋ค..."
์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ํด ์๋ฌด๊ฒ๋ ๊ธฐ์ตํ์ง ์์์ผ ํ๋ค.
#4-2 Idempotent (๋ฉฑ๋ฑ์ฑ)
ํด๋ผ์ด์ธํธ: "(์ธํฐ๋ท ์ผํ ์ค) ์ปดํจํฐ๊ฐ ๋ ์ด ์ฌํด์, ์ค์๋ก ์ฃผ๋ฌธ ์๋ฃ ๋ฒํผ์ด 5๋ฒ ํด๋ฆญ๋ผ๋ฒ๋ ธ๋ค."
์๋ฒ: "์์ฒญํ์ 5๊ฑด์ ์ฃผ๋ฌธ์ด ์๋ฃ๋์์ต๋๋ค."
ํด๋ผ์ด์ธํธ: "์ด ์๋ฒ ๋ฉฑ๋ฑ์ฑ ์ ์งํค๋ค..."
๋ฉฑ๋ฑ(ๅช็ญ): ์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ ์ฉํ๋๋ผ๋ ๊ฒฐ๊ด๊ฐ์ด ๋ฌ๋ผ์ง์ง ์๋ ์ผ.
#4-3 Cacheability
ํด๋ผ์ด์ธํธ: "(๋์์ ์ฌ์ดํธ ์ด์ฉ ์ค) ์ด ๋ฎค์ง ๋น๋์ค ๋ฐ๋ณต ์ฌ์ ์ค์ ํด์ ํ์ด๋์ผ์ง."
...
ํด๋ผ์ด์ธํธ: "๋ฒ์จ ํด๋ํฐ ๋ฐ์ดํฐ๊ฐ ๋ค ์์ง๋๋ค ์์ง?"
ํด๋ผ์ด์ธํธ: "์... ์ด ์ฌ์ดํธ๊ฐ ๋์์์ ์บ์์ ์ ์ฅ์๊ณ , ๋ฐ๋ณต ์ฌ์๋ ๋๋ง๋ค ์๋ก ๋ค์ด๋ก๋ํ๊ณ ์์๊ตฌ๋."
ํด๋ผ์ด์ธํธ: "์ด ์๋ฒ Cacheability ์ ์งํค๋ค..."
ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ์๋ก์ ๋ํด '๊ธฐ์ต'ํ์ง ์์์ผ ํ์ง๋ง, ๊ฐ๊ฐ ์ด๋ค ์๋ต์ ๋ณด๋ด๊ฑฐ๋ ๋ฐ์๋์ง๋ ๊ธฐ์ตํด๋๋ ๊ฒ ์ข๋ค. ํด๋ผ์ด์ธํธ ์ธก์ Cacheability๋ฅผ ๋ค๋ฃฌ ์ ์์์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก, ์๋ฒ ์ธก์ Cacheability๋ ๊ทธ๋ ๋ค. ์๋ฅผ ๋ค์ด, ๋๋ถ๋ถ์ ํด๋ผ์ด์ธํธ๋ค์ด ์์ฒญํ๋ ์ธ๊ธฐ ์์์ด ์๋ค๋ฉด, ์๋ฒ์ ์บ์ ์ ์ฅ์์ ๋ฌ์ ์ฌ๋นจ๋ฆฌ ์๋ตํด์ค ์ ์๊ฒ ํ๋ค.
#5 ์์ฝ
REST API๋ ์๋ฒ์ ์์(Resource)์ ๋๊ณ , ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ๋ฐฉ๋ฒ์ ๊ท์ ํ๋ API๋ค.
#6 ์ด ๊ฐ๋ ์ด ์ฌ์ฉ๋ ๊ธ
-
'๊นจ์ ๊ฐ๋ ๐ > ๊ธฐํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Unit Testing - Test double (0) | 2024.06.30 |
---|---|
์์กด์ฑ ์ฃผ์ (Dependency Injection) (0) | 2024.06.20 |
API (Application Programming Interface) (0) | 2023.12.18 |
API, Framework, SDK, Tool, Project, Architecture, IDE, Library, Package์ ๊ด๊ณ (0) | 2023.12.12 |
[Java] ์ค์น, JRE์ JDK์ ์ฐจ์ด, ํ๊ฒฝ ๋ณ์ ์ค์ (2) | 2023.12.08 |