๐Ÿงฉ 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/1ID๊ฐ€ 1์ธ ์‚ฌ์šฉ์ž ์กฐํšŒ
POST/users์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ƒ์„ฑ
PUT/users/1ID๊ฐ€ 1์ธ ์‚ฌ์šฉ์ž ์ •๋ณด ์ „์ฒด ์ˆ˜์ •
PATCH/users/1ID๊ฐ€ 1์ธ ์‚ฌ์šฉ์ž ์ •๋ณด ์ผ๋ถ€ ์ˆ˜์ •
DELETE/users/1ID๊ฐ€ 1์ธ ์‚ฌ์šฉ์ž ์‚ญ์ œ

๐Ÿ”ท REST API์˜ 6๊ฐ€์ง€ ์„ค๊ณ„ ์›์น™

  1. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ: ํ”„๋ก ํŠธ์™€ ๋ฐฑ ๋ถ„๋ฆฌ
  2. ๋ฌด์ƒํƒœ์„ฑ(Stateless): ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Œ
  3. ์บ์‹œ ๊ฐ€๋Šฅ: ์‘๋‹ต์€ ๋ช…์‹œ์ ์œผ๋กœ ์บ์‹œ ๊ฐ€๋Šฅ
  4. ๊ณ„์ธต ๊ตฌ์กฐ: ์ค‘๊ฐ„ ๊ณ„์ธต(API Gateway ๋“ฑ) ํ—ˆ์šฉ
  5. ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค: URL + ๋ฉ”์„œ๋“œ๋กœ ์กฐ์ž‘
  6. ์ฝ”๋“œ ์˜จ ๋””๋งจ๋“œ(Optional): ์„œ๋ฒ„๊ฐ€ ์ฝ”๋“œ ์ „๋‹ฌ ๊ฐ€๋Šฅ (๊ฑฐ์˜ ์‚ฌ์šฉ ์•ˆ ํ•จ)

โœ… REST API์˜ ์žฅ์ 

  • HTTP ํ‘œ์ค€์„ ํ™œ์šฉ โ†’ ํ•™์Šต ๋น„์šฉ ๋‚ฎ์Œ
  • JSON ์‚ฌ์šฉ โ†’ ๊ฒฝ๋Ÿ‰ ํ†ต์‹ 
  • ๋ฒ”์šฉ์„ฑ ๋†’์Œ โ†’ ์›น, ์•ฑ, IoT ๋“ฑ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๊ฐœ๋ฐœ์ž ์นœํ™”์  URL ๊ตฌ์„ฑ

๐Ÿ” HTTP ์ƒํƒœ ์ฝ”๋“œ ์ž์ฃผ ์“ฐ๋Š” ๊ฒƒ

์ฝ”๋“œ์˜๋ฏธ
200OK: ์š”์ฒญ ์„ฑ๊ณต
201Created: ์ƒ์„ฑ ์„ฑ๊ณต
400Bad Request: ์ž˜๋ชป๋œ ์š”์ฒญ
401Unauthorized: ์ธ์ฆ ํ•„์š”
404Not Found: ๋ฆฌ์†Œ์Šค ์—†์Œ
500Internal Server Error: ์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜

๐Ÿ”ง REST API ์‚ฌ์šฉ ํ™˜๊ฒฝ

์‚ฌ์šฉ ํ™˜๊ฒฝ์„ค๋ช…
๐ŸŒ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜React, Vue ๊ฐ™์€ ํ”„๋ก ํŠธ๊ฐ€ REST API ํ˜ธ์ถœ
๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ์•ฑAndroid, iOS ์•ฑ์ด ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉ
๐Ÿ–ฅ๏ธ ๋ฐ์Šคํฌํƒ‘ ์•ฑElectron, .NET ๊ธฐ๋ฐ˜ ์•ฑ์—์„œ๋„ ์‚ฌ์šฉ๋จ
๐Ÿค– IoT ๊ธฐ๊ธฐ์Šค๋งˆํŠธ๊ธฐ๊ธฐ(CCTV, ์—์–ด์ปจ ๋“ฑ)์™€ ์„œ๋ฒ„ ํ†ต์‹  ์‹œ ์‚ฌ์šฉ
๐Ÿงฉ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ Spring โ†’ FastAPI ๋“ฑ ์„œ๋ฒ„ ๊ฐ„ API ํ†ต์‹ ์— ํ™œ์šฉ๋จ

โŒ REST API๊ฐ€ ์•„๋‹Œ ๊ธฐ์ˆ ๋“ค

๊ธฐ์ˆ ์„ค๋ช…
gRPC๊ณ ์„ฑ๋Šฅ ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ธฐ๋ฐ˜ API. IoT, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—์„œ ์„ ํ˜ธ๋จ
GraphQLํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญ ๊ฐ€๋Šฅ. ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ์— ๊ฐ•ํ•จ
WebSocket์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  (์˜ˆ: ์ฑ„ํŒ…, ๊ฒŒ์ž„ ๋“ฑ)
SOAPXML ๊ธฐ๋ฐ˜ ๋ ˆ๊ฑฐ์‹œ 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));
    }
}
profile
๋ฐฐ์›€์„ ์ถ”๊ตฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€