๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํšŒ๋กœ๊ด€๋ จ

๋ผ์šฐํŒ… ์„ค๊ณ„ ๊ฐ€์ด๋“œ ์™„๋ฒฝ ๊ฐ€์ด๋“œ – ๊ผญ ์•Œ์•„์•ผ ํ•  ํ•ต์‹ฌ ์ •๋ณด

๐Ÿ›ฃ๏ธ ๋ผ์šฐํŒ… ์„ค๊ณ„ ๊ฐ€์ด๋“œ: ์›น ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์™„๋ฒฝ ์•ˆ๋‚ด์„œ

๋ผ์šฐํŒ… ์„ค๊ณ„๋ž€? ๐Ÿšฆ

๋ผ์šฐํŒ…(Routing)์€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ URL์„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ํ•ธ๋“ค๋Ÿฌ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ํšจ์œจ์ ์ธ ๋ผ์šฐํŒ… ์„ค๊ณ„๋Š” ์œ ์ง€๋ณด์ˆ˜, ํ™•์žฅ์„ฑ, ๋ณด์•ˆ, ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

TIP: ๋ผ์šฐํŒ… ์„ค๊ณ„๋Š” ๋‹จ์ˆœํžˆ URL์„ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์„œ๋น„์Šค์˜ ๊ตฌ์กฐ์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊นŒ์ง€ ์ขŒ์šฐํ•˜๋Š” ์ค‘์š”ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.


๋ผ์šฐํŒ… ์„ค๊ณ„์˜ ํ•ต์‹ฌ ์›์น™ โœ…

1. ๋ช…ํ™•ํ•˜๊ณ  ์ง๊ด€์ ์ธ URL ๊ตฌ์กฐ

  • URL์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜๋ฏธ ์—†๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋ณต์žกํ•œ ๊ฒฝ๋กœ๋Š” ํ”ผํ•˜์„ธ์š”.
# ์ข‹์€ ์˜ˆ์‹œ
GET /users/123/profile

# ๋‚˜์œ ์˜ˆ์‹œ
GET /profile?id=123&type=user

2. RESTful ์›์น™ ์ค€์ˆ˜

RESTful ๋ผ์šฐํŒ…์€ HTTP ๋ฉ”์„œ๋“œ์™€ URL ๊ตฌ์กฐ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

HTTP ๋ฉ”์„œ๋“œ ์„ค๋ช… ์˜ˆ์‹œ URL
GET ์กฐํšŒ /posts/1
POST ์ƒ์„ฑ /posts
PUT/PATCH ์ˆ˜์ • /posts/1
DELETE ์‚ญ์ œ /posts/1

3. ๊ณ„์ธต์  ๊ตฌ์กฐ์™€ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜

  • ๋ฆฌ์†Œ์Šค ๊ฐ„ ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ URL์— ๋ฐ˜์˜ํ•˜์„ธ์š”.
  • ๋ณต์ˆ˜ํ˜• ๋ช…์‚ฌ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
# ๊ณ„์ธต์  ๊ตฌ์กฐ ์˜ˆ์‹œ
GET /users/123/posts/456/comments

4. ์ผ๊ด€์„ฑ ์žˆ๋Š” ํŒจํ„ด ์œ ์ง€

  • ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ๋™์ผํ•œ ๋ผ์šฐํŒ… ๊ทœ์น™์„ ์ ์šฉํ•˜์„ธ์š”.
  • ๋Œ€์†Œ๋ฌธ์ž, ํ•˜์ดํ”ˆ(-), ์–ธ๋”์Šค์ฝ”์–ด(_) ๋“ฑ ๋„ค์ด๋ฐ ๊ทœ์น™์„ ํ†ต์ผํ•˜์„ธ์š”.

๋ผ์šฐํŒ… ์„ค๊ณ„ Top 10 ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๐Ÿ†

  1. ๋ช…ํ™•ํ•œ ๋ฆฌ์†Œ์Šค ์‹๋ณ„: URL๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  2. RESTful ์›์น™ ์ค€์ˆ˜: HTTP ๋ฉ”์„œ๋“œ์™€ URL ๊ตฌ์กฐ๊ฐ€ ์ผ๊ด€์ ์ธ๊ฐ€?
  3. ๊ณ„์ธต์  ๊ตฌ์กฐ ๋ฐ˜์˜: ๋ฆฌ์†Œ์Šค ๊ฐ„ ๊ด€๊ณ„๊ฐ€ URL์— ๋“œ๋Ÿฌ๋‚˜๋Š”๊ฐ€?
  4. URL ๊ธธ์ด ์ตœ์†Œํ™”: ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ธด URL์€ ์—†๋Š”๊ฐ€?
  5. ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ํ†ต์ผ: ํ•˜์ดํ”ˆ, ์†Œ๋ฌธ์ž ๋“ฑ ๊ทœ์น™์ด ์ผ๊ด€์ ์ธ๊ฐ€?
  6. ๋ฒ„์ „ ๊ด€๋ฆฌ: API ๋ฒ„์ „์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„๋˜๋Š”๊ฐ€?
  7. ๋™์ /์ •์  ๋ผ์šฐํŠธ ๊ตฌ๋ถ„: ๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ •์  ๊ฒฝ๋กœ๊ฐ€ ๋ช…ํ™•ํ•œ๊ฐ€?
  8. ๋ณด์•ˆ ๊ณ ๋ ค: ๋ฏผ๊ฐ ์ •๋ณด๊ฐ€ URL์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๊ฐ€?
  9. SEO ์ตœ์ ํ™”: ๊ฒ€์ƒ‰ ์—”์ง„ ์นœํ™”์ ์ธ URL ๊ตฌ์กฐ์ธ๊ฐ€?
  10. ์—๋Ÿฌ ์ฒ˜๋ฆฌ: ์ž˜๋ชป๋œ ๋ผ์šฐํŠธ ์ ‘๊ทผ ์‹œ ์ ์ ˆํ•œ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฐ€?
์ฒดํฌ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ ์„ค๋ช… ์˜ˆ์‹œ/๋น„๊ณ 
๋ช…ํ™•ํ•œ ๋ฆฌ์†Œ์Šค ์‹๋ณ„ URL๋งŒ ๋ณด๊ณ  ๋ฆฌ์†Œ์Šค ํŒŒ์•… ๊ฐ€๋Šฅ /products/123
RESTful ์›์น™ ์ค€์ˆ˜ HTTP ๋ฉ”์„œ๋“œ์™€ URL ์ผ๊ด€์„ฑ GET /users, POST /users
๊ณ„์ธต์  ๊ตฌ์กฐ ๋ฐ˜์˜ ๊ด€๊ณ„๊ฐ€ URL์— ๋“œ๋Ÿฌ๋‚จ /users/1/orders/2
URL ๊ธธ์ด ์ตœ์†Œํ™” ๋ถˆํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ๊ฑฐ /products/123 (O)
๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ํ†ต์ผ ํ•˜์ดํ”ˆ, ์†Œ๋ฌธ์ž ๋“ฑ ๊ทœ์น™ ์ผ๊ด€ /user-profile (O)
๋ฒ„์ „ ๊ด€๋ฆฌ /v1, /v2 ๋“ฑ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ /api/v1/users
๋™์ /์ •์  ๋ผ์šฐํŠธ ๊ตฌ๋ถ„ ๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” {} ๋˜๋Š” :๋กœ ๊ตฌ๋ถ„ /users/{id}
๋ณด์•ˆ ๊ณ ๋ ค ๋ฏผ๊ฐ ์ •๋ณด URL ๋…ธ์ถœ ๊ธˆ์ง€ /reset-password/token (O)
SEO ์ตœ์ ํ™” ํ‚ค์›Œ๋“œ ํฌํ•จ, ์˜๋ฏธ ์žˆ๋Š” URL /blog/seo-guide
์—๋Ÿฌ ์ฒ˜๋ฆฌ 404, 405 ๋“ฑ ์ ์ ˆํ•œ ์—๋Ÿฌ ๋ฐ˜ํ™˜ /not-found

๋ผ์šฐํŒ… ์„ค๊ณ„ ์˜ˆ์‹œ ์ฝ”๋“œ ๋ชจ์Œ ๐Ÿ“ฆ

Express.js ๋ผ์šฐํŒ… ์˜ˆ์‹œ

const express = require('express');
const router = express.Router();

// ์‚ฌ์šฉ์ž ๋ชฉ๋ก ์กฐํšŒ
router.get('/users', userController.list);

// ํŠน์ • ์‚ฌ์šฉ์ž ์กฐํšŒ
router.get('/users/:id', userController.detail);

// ์‚ฌ์šฉ์ž ์ƒ์„ฑ
router.post('/users', userController.create);

// ์‚ฌ์šฉ์ž ์ •๋ณด ์ˆ˜์ •
router.put('/users/:id', userController.update);

// ์‚ฌ์šฉ์ž ์‚ญ์ œ
router.delete('/users/:id', userController.delete);

module.exports = router;

Django URL ํŒจํ„ด ์˜ˆ์‹œ

from django.urls import path
from . import views

urlpatterns = [
    path('users/', views.user_list),
    path('users/<int:id>/', views.user_detail),
    path('users/<int:id>/posts/', views.user_posts),
]

๋ผ์šฐํŒ… ์„ค๊ณ„ ์‹œ ์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜์™€ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ• โš ๏ธ

  • ๋™์ผํ•œ URL์— ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ ํ˜ผํ•ฉ: URL ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜์ง€ ๋งˆ์„ธ์š”.
  • HTTP ๋ฉ”์„œ๋“œ ๋‚จ์šฉ: GET ์š”์ฒญ์— ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์„ ๋„ฃ์ง€ ๋งˆ์„ธ์š”.
  • ๋ฏผ๊ฐ ์ •๋ณด ๋…ธ์ถœ: ํ† ํฐ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ์€ URL์ด ์•„๋‹Œ ํ—ค๋”๋‚˜ ๋ฐ”๋””์— ํฌํ•จํ•˜์„ธ์š”.
  • ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ˆ„๋ฝ: API๋Š” ๋ฐ˜๋“œ์‹œ ๋ฒ„์ „์„ ๋ช…์‹œํ•˜์„ธ์š”.

TIP: ๋ผ์šฐํŒ… ์„ค๊ณ„ ์ดˆ๊ธฐ์— ํŒ€์›๋“ค๊ณผ ์ปจ๋ฒค์…˜์„ ํ•ฉ์˜ํ•˜๊ณ , ๋ฌธ์„œํ™”ํ•ด๋‘๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค!


๋ผ์šฐํŒ… ์„ค๊ณ„ ๊ฐ€์ด๋“œ ๊ฒฐ๋ก  ๐ŸŽฏ

๋ผ์šฐํŒ… ์„ค๊ณ„๋Š” ์›น ์„œ๋น„์Šค์˜ ๋ผˆ๋Œ€๋ฅผ ๋งŒ๋“œ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ณ  ์ผ๊ด€๋œ ๋ผ์šฐํŒ… ๊ตฌ์กฐ๋Š” ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ, ์œ ์ง€๋ณด์ˆ˜, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜, ๋ณด์•ˆ๊นŒ์ง€ ๋ชจ๋‘ ์ขŒ์šฐํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์™€ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ์ตœ์ ํ™”๋œ ๋ผ์šฐํŒ… ์„ค๊ณ„๋ฅผ ์™„์„ฑํ•ด๋ณด์„ธ์š”! ๐Ÿ›ฃ๏ธ

์˜ฌ๋ฐ”๋ฅธ ๋ผ์šฐํŒ… ์„ค๊ณ„๋Š” ์„ฑ๊ณต์ ์ธ ์›น ์„œ๋น„์Šค์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฐ”๋กœ ํ”„๋กœ์ ํŠธ์˜ ๋ผ์šฐํŒ… ๊ตฌ์กฐ๋ฅผ ์ ๊ฒ€ํ•ด๋ณด์„ธ์š”!