๐ฃ๏ธ ๋ผ์ฐํ ์ค๊ณ ๊ฐ์ด๋: ์น ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ฒฝ ์๋ด์
๋ผ์ฐํ ์ค๊ณ๋? ๐ฆ
๋ผ์ฐํ (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 ์ฒดํฌ๋ฆฌ์คํธ ๐
- ๋ช ํํ ๋ฆฌ์์ค ์๋ณ: URL๋ก ๋ฆฌ์์ค๊ฐ ๋ฌด์์ธ์ง ์ ์ ์๋๊ฐ?
- RESTful ์์น ์ค์: HTTP ๋ฉ์๋์ URL ๊ตฌ์กฐ๊ฐ ์ผ๊ด์ ์ธ๊ฐ?
- ๊ณ์ธต์ ๊ตฌ์กฐ ๋ฐ์: ๋ฆฌ์์ค ๊ฐ ๊ด๊ณ๊ฐ URL์ ๋๋ฌ๋๋๊ฐ?
- URL ๊ธธ์ด ์ต์ํ: ๋ถํ์ํ๊ฒ ๊ธด URL์ ์๋๊ฐ?
- ๋ค์ด๋ฐ ์ปจ๋ฒค์ ํต์ผ: ํ์ดํ, ์๋ฌธ์ ๋ฑ ๊ท์น์ด ์ผ๊ด์ ์ธ๊ฐ?
- ๋ฒ์ ๊ด๋ฆฌ: API ๋ฒ์ ์ด ํ์ํ ๊ฒฝ์ฐ ๋ช ํํ ๊ตฌ๋ถ๋๋๊ฐ?
- ๋์ /์ ์ ๋ผ์ฐํธ ๊ตฌ๋ถ: ๋์ ํ๋ผ๋ฏธํฐ์ ์ ์ ๊ฒฝ๋ก๊ฐ ๋ช ํํ๊ฐ?
- ๋ณด์ ๊ณ ๋ ค: ๋ฏผ๊ฐ ์ ๋ณด๊ฐ URL์ ๋ ธ์ถ๋์ง ์๋๊ฐ?
- SEO ์ต์ ํ: ๊ฒ์ ์์ง ์นํ์ ์ธ URL ๊ตฌ์กฐ์ธ๊ฐ?
- ์๋ฌ ์ฒ๋ฆฌ: ์๋ชป๋ ๋ผ์ฐํธ ์ ๊ทผ ์ ์ ์ ํ ์๋ฌ๋ฅผ ๋ฐํํ๋๊ฐ?
| ์ฒดํฌ๋ฆฌ์คํธ ํญ๋ชฉ | ์ค๋ช | ์์/๋น๊ณ |
|---|---|---|
| ๋ช ํํ ๋ฆฌ์์ค ์๋ณ | 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: ๋ผ์ฐํ ์ค๊ณ ์ด๊ธฐ์ ํ์๋ค๊ณผ ์ปจ๋ฒค์ ์ ํฉ์ํ๊ณ , ๋ฌธ์ํํด๋๋ฉด ์ ์ง๋ณด์๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค!
๋ผ์ฐํ ์ค๊ณ ๊ฐ์ด๋ ๊ฒฐ๋ก ๐ฏ
๋ผ์ฐํ ์ค๊ณ๋ ์น ์๋น์ค์ ๋ผ๋๋ฅผ ๋ง๋๋ ์์ ์ ๋๋ค. ๋ช ํํ๊ณ ์ผ๊ด๋ ๋ผ์ฐํ ๊ตฌ์กฐ๋ ๊ฐ๋ฐ ํจ์จ์ฑ, ์ ์ง๋ณด์, ์ฌ์ฉ์ ๊ฒฝํ, ๋ณด์๊น์ง ๋ชจ๋ ์ข์ฐํฉ๋๋ค. ์์ ์ฒดํฌ๋ฆฌ์คํธ์ ์์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ, ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์ ์ต์ ํ๋ ๋ผ์ฐํ ์ค๊ณ๋ฅผ ์์ฑํด๋ณด์ธ์! ๐ฃ๏ธ
์ฌ๋ฐ๋ฅธ ๋ผ์ฐํ ์ค๊ณ๋ ์ฑ๊ณต์ ์ธ ์น ์๋น์ค์ ์์์ ๋๋ค. ์ง๊ธ ๋ฐ๋ก ํ๋ก์ ํธ์ ๋ผ์ฐํ ๊ตฌ์กฐ๋ฅผ ์ ๊ฒํด๋ณด์ธ์!