๐งฉ REST API๋?
REST API๋ HTTP ํ๋กํ ์ฝ ์์์ ๋์ํ๋ ์น ๊ธฐ๋ฐ ๋ฐ์ดํฐ ํต์ ์ํคํ
์ฒ ์คํ์ผ์
๋๋ค.
๋ฆฌ์์ค(์์)๋ฅผ URL๋ก ์๋ณํ๊ณ , **HTTP ๋ฉ์๋(GET, POST ๋ฑ)**๋ฅผ ํตํด ์ด๋ฅผ ์กฐ์ํฉ๋๋ค.
REST = REpresentational State Transfer
์์์ ํํ์ HTTP๋ฅผ ํตํด ์ ์กํ๋ ๋ฐฉ์
๐ง REST API์ ํต์ฌ ํน์ง
- ํ๋กํ ์ฝ: HTTP ๊ธฐ๋ฐ
- ํ์: JSON์ ์ฃผ๋ก ์ฌ์ฉ
- ์์ ์ค์ฌ: URL๋ก ์์์ ๋ช
์์ ์ผ๋ก ํํ
- ํ์คํ๋ ๋์: HTTP ๋ฉ์๋ ์ฌ์ฉ
๐ฆ HTTP ๋ฉ์๋ ์ข
๋ฅ
| ๋ฉ์๋ | ์ค๋ช
|
|---|
GET | ๋ฆฌ์์ค ์กฐํ |
POST | ๋ฆฌ์์ค ์์ฑ |
PUT | ๋ฆฌ์์ค ์ ์ฒด ์์ |
PATCH | ๋ฆฌ์์ค ์ผ๋ถ ์์ |
DELETE | ๋ฆฌ์์ค ์ญ์ |
๐งช REST API ์์
| ๋ฉ์๋ | URL | ์๋ฏธ |
|---|
GET | /users | ์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ |
GET | /users/1 | ID๊ฐ 1์ธ ์ฌ์ฉ์ ์กฐํ |
POST | /users | ์๋ก์ด ์ฌ์ฉ์ ์์ฑ |
PUT | /users/1 | ID๊ฐ 1์ธ ์ฌ์ฉ์ ์ ๋ณด ์ ์ฒด ์์ |
PATCH | /users/1 | ID๊ฐ 1์ธ ์ฌ์ฉ์ ์ ๋ณด ์ผ๋ถ ์์ |
DELETE | /users/1 | ID๊ฐ 1์ธ ์ฌ์ฉ์ ์ญ์ |
๐ท REST API์ 6๊ฐ์ง ์ค๊ณ ์์น
- ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ: ํ๋ก ํธ์ ๋ฐฑ ๋ถ๋ฆฌ
- ๋ฌด์ํ์ฑ(Stateless): ์๋ฒ๋ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ์ ์ฅํ์ง ์์
- ์บ์ ๊ฐ๋ฅ: ์๋ต์ ๋ช
์์ ์ผ๋ก ์บ์ ๊ฐ๋ฅ
- ๊ณ์ธต ๊ตฌ์กฐ: ์ค๊ฐ ๊ณ์ธต(API Gateway ๋ฑ) ํ์ฉ
- ์ผ๊ด๋ ์ธํฐํ์ด์ค: URL + ๋ฉ์๋๋ก ์กฐ์
- ์ฝ๋ ์จ ๋๋งจ๋(Optional): ์๋ฒ๊ฐ ์ฝ๋ ์ ๋ฌ ๊ฐ๋ฅ (๊ฑฐ์ ์ฌ์ฉ ์ ํจ)
โ
REST API์ ์ฅ์
- HTTP ํ์ค์ ํ์ฉ โ ํ์ต ๋น์ฉ ๋ฎ์
- JSON ์ฌ์ฉ โ ๊ฒฝ๋ ํต์
- ๋ฒ์ฉ์ฑ ๋์ โ ์น, ์ฑ, IoT ๋ฑ์์ ์ฌ์ฉ ๊ฐ๋ฅ
- ๊ฐ๋ฐ์ ์นํ์ URL ๊ตฌ์ฑ
๐ HTTP ์ํ ์ฝ๋ ์์ฃผ ์ฐ๋ ๊ฒ
| ์ฝ๋ | ์๋ฏธ |
|---|
200 | OK: ์์ฒญ ์ฑ๊ณต |
201 | Created: ์์ฑ ์ฑ๊ณต |
400 | Bad Request: ์๋ชป๋ ์์ฒญ |
401 | Unauthorized: ์ธ์ฆ ํ์ |
404 | Not Found: ๋ฆฌ์์ค ์์ |
500 | Internal Server Error: ์๋ฒ ๋ด๋ถ ์ค๋ฅ |
๐ง REST API ์ฌ์ฉ ํ๊ฒฝ
| ์ฌ์ฉ ํ๊ฒฝ | ์ค๋ช
|
|---|
| ๐ ์น ์ ํ๋ฆฌ์ผ์ด์
| React, Vue ๊ฐ์ ํ๋ก ํธ๊ฐ REST API ํธ์ถ |
| ๐ฑ ๋ชจ๋ฐ์ผ ์ฑ | Android, iOS ์ฑ์ด ์๋ฒ์ ํต์ ํ ๋ ์ฌ์ฉ |
| ๐ฅ๏ธ ๋ฐ์คํฌํ ์ฑ | Electron, .NET ๊ธฐ๋ฐ ์ฑ์์๋ ์ฌ์ฉ๋จ |
| ๐ค IoT ๊ธฐ๊ธฐ | ์ค๋งํธ๊ธฐ๊ธฐ(CCTV, ์์ด์ปจ ๋ฑ)์ ์๋ฒ ํต์ ์ ์ฌ์ฉ |
| ๐งฉ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ ํต์ | Spring โ FastAPI ๋ฑ ์๋ฒ ๊ฐ API ํต์ ์ ํ์ฉ๋จ |
โ REST API๊ฐ ์๋ ๊ธฐ์ ๋ค
| ๊ธฐ์ | ์ค๋ช
|
|---|
| gRPC | ๊ณ ์ฑ๋ฅ ๋ฐ์ด๋๋ฆฌ ๊ธฐ๋ฐ API. IoT, ๋ง์ดํฌ๋ก์๋น์ค์์ ์ ํธ๋จ |
| GraphQL | ํด๋ผ์ด์ธํธ๊ฐ ์ํ๋ ๋ฐ์ดํฐ๋ง ์์ฒญ ๊ฐ๋ฅ. ๋ณต์กํ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ์ ๊ฐํจ |
| WebSocket | ์ค์๊ฐ ์๋ฐฉํฅ ํต์ (์: ์ฑํ
, ๊ฒ์ ๋ฑ) |
| SOAP | XML ๊ธฐ๋ฐ ๋ ๊ฑฐ์ API (์ํ, ๊ณต๊ณต๊ธฐ๊ด ๋ฑ์์ ์ฌ์ ํ ์ฌ์ฉ) |
WebSocket๋ REST์๋ ์ ํ ๋ค๋ฅธ ๋ฐฉ์!
โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
| ์ง๋ฌธ | ๋ต๋ณ |
|---|
| REST API๋ ์น ์ ์ฉ์ธ๊ฐ์? | โ ์น ์ค์ฌ์ด์ง๋ง, IoT/์ฑ ๋ฑ์์๋ ์ฌ์ฉ๋ฉ๋๋ค. |
| REST๋ ํ์ค์ธ๊ฐ์? | โ
์ฌ์ค์ ์น API ์ค๊ณ์์ ํ์ค์ฒ๋ผ ์ฌ์ฉ๋ฉ๋๋ค. |
| JSON๋ง ์จ์ผ ํ๋์? | ์๋์, XML ๋ฑ๋ ๊ฐ๋ฅํ์ง๋ง JSON์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์
๋๋ค. |
| REST API๋ฅผ ์ฐ๋ฉด ์ข์ ์ด์ ๋? | ์ง๊ด์ ์ด๊ณ , ํ์ฅ์ฑ ์๊ณ , ๋๋ถ๋ถ์ ์์คํ
๊ณผ ํธํ๋ฉ๋๋ค. |

๐งญ ๋ง๋ฌด๋ฆฌ
- REST API๋ ํ๋ ์น/์ฑ ๊ฐ๋ฐ์ ํต์ฌ ํ์ค
- HTTP + ์์ ์ค์ฌ URL + ํ์ค ๋ฉ์๋(GET, POST ๋ฑ)
- JSON์ ํตํด ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ํต์ ์ด ๊ฐ๋ฅ
- FastAPI, Spring Boot ๋ฑ ๋ค์ํ ํ๋ ์์ํฌ์์ ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
๐งช ์์ ์ฝ๋ (FastAPI)
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id, "name": "ํ๊ธธ๋"}
๐งช ์์ ์ฝ๋ (Spring Boot)
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.findById(id));
}
}