Django로 게시글 목록과 상세 페이지를 구현하던 중,
분명히 URL과 View를 연결했다고 생각했는데 계속 404 Page not found 에러가 발생했다.
처음엔 단순한 URL 매핑 문제라고 생각했지만,
결국 원인은 정말 사소한 문법 하나였다.
1. 발생한 문제
게시글 상세 페이지를 위해 다음과 같이 URL을 정의했다.
# posts.urls.py
path('<int: post_id>/', views.post_detail),
그리고 브라우저에서 다음 주소로 접근했다.
http://127.0.0.1:8000/posts/2/
하지만 결과는 계속 404 에러였다.
Django가 출력한 메시지는 다음과 같았다.
The current path, posts/2, didn't match any of these.
2. 처음에 했던 잘못된 추측들
문제를 해결하기 위해 여러 가능성을 의심했다.
- 프로젝트 urls.py와 앱 urls.py 연결 문제인가?
- include()를 잘못 쓴 걸까?
- View 함수가 실행되지 않는 건가?
- DB에 해당 id의 데이터가 없는 건가?
- 슬래시(/) 문제인가?
하나씩 점검했지만 모두 문제가 없었다.
3. 원인
결국 문제는 URL path 문법에 있었다.
<int: post_id>
여기서 int: 와 post_id 사이에 공백이 들어가 있었다.
Django의 URL converter 문법(URL에서 들어온 문자열을 어떤 타입으로 해석할지 정해주는 규칙)은 다음 형식을 정확히 요구한다.
<converter:name>
즉, 올바른 문법은 아래와 같다.
path('<int:post_id>/', views.post_detail),
공백 하나 때문에 Django는 이 URL을 전혀 매칭하지 못했고,
그 결과 View까지 도달하지 못한 채 404를 반환하고 있었다.
4. 왜 더 헷갈렸을까?
이 문제는 더 헷갈리기 쉬운 이유가 있다.
- ❌ SyntaxError가 발생하지 않는다
- ❌ 서버도 정상 실행된다
- ❌ Django는 단순히 “URL이 매칭되지 않는다”고만 말해준다
그래서 자연스럽게
“경로는 찾았는데 페이지가 없는 건가?”
“View 쪽 문제인가?”
라는 방향으로 생각하게 된다.
하지만 실제로는 URL 패턴 자체가 성립하지 않았던 것이다.
5. 이번 경험으로 배운 점
이번 문제를 통해 확실히 배운 점은 다음과 같다.
- Django URL 매칭은 문자 단위로 매우 엄격하다
- <int:변수명> 문법에서 공백은 절대 허용되지 않는다
- 404 에러라고 해서 항상 View나 데이터 문제는 아니다
- “아주 사소한 문법 실수”가 가장 찾기 어렵다
6. 정리하며
이번 404 에러는 경로를 찾았지만 페이지가 없는 문제가 아니라,
경로 자체가 잘못 정의된 문제였다.
Django를 배우면서 느끼는 건,
프레임워크가 친절한 만큼 규칙을 정확히 지켜야 한다는 점이다.
이번 경험 덕분에
URL 라우팅 구조와 Django의 요청 흐름을 훨씬 명확하게 이해하게 되었다.
다음에 같은 문제를 다시 만난다면,
아마 가장 먼저 공백부터 의심할 것 같다.
'Django 프론트& 백엔드 개발' 카테고리의 다른 글
| Django Form으로 입력 폼 빠르게 만들기 (0) | 2026.01.10 |
|---|---|
| URL Name을 활용한 템플릿 태그 사용법 (0) | 2026.01.10 |
| Django Model API란? (0) | 2026.01.10 |
| [Model] 하드 코딩을 피하고, Django답게 화면 만들기 (0) | 2026.01.04 |
| [Model] Django 관리자(Admin) 생성과 모델 관리하기 (0) | 2026.01.04 |