프로젝트
📚 Django 유저 리스트 & 상세 정보 프로젝트 정리
Chansman
2025. 4. 30. 04:21
📚 Django 유저 리스트 & 상세 정보 프로젝트 정리
이번 프로젝트는 Django를 이용하여
- 유저 리스트 페이지
- 유저 상세 정보 페이지
를 구현하는 것을 목표로 했습니다.
🎯 프로젝트 목표
- users/ : 전체 유저 리스트 출력 (이름 클릭 시 이동)
- users/<int:user_id>/ : 개별 유저 상세 정보 출력
1️⃣ 파일 구성
파일명 설명
fake_db.py | 유저 데이터 (딕셔너리 형태) |
urls.py | URL 패턴 등록 및 뷰 함수 작성 |
templates/user_list.html | 유저 리스트를 보여주는 템플릿 |
templates/user_info.html | 유저 상세 정보를 보여주는 템플릿 |
2️⃣ 주요 코드
✅ fake_db.py (유저 데이터베이스)
user_db = {
1: {'이름': '머용', '나이': 27, '생일': '1998-08-29', '취미': '배드민턴', ...},
2: {'이름': '수현', '나이': 30, '생일': '1995-02-22', '취미': '시체놀이', ...},
...
}
✏️ 설명
- 파이썬 딕셔너리(key-value 쌍)로 사용자 데이터 저장.
- 1, 2, 3처럼 고유한 숫자 id를 키로 사용하고, 값은 유저 정보입니다.
- 키 이름(예: '생일')은 모든 유저에 대해 일관성 있게 유지해야 조회할 때 오류가 안 납니다.
✅ urls.py (뷰 + URL 매핑)
from django.urls import path
from django.shortcuts import render
from django.http import Http404
from fake_db import user_db
_db = user_db
def user_list(request):
names = [{'id': key, 'name': value['이름']} for key, value in _db.items()]
return render(request, 'user_list.html', {'data': names})
def user_info(request, user_id):
if user_id not in _db:
raise Http404('User not found')
info = _db[user_id]
return render(request, 'user_info.html', {'data': info})
urlpatterns = [
path('users/', user_list, name='user_list'),
path('users/<int:user_id>/', user_info, name='user_info'),
]
✅ urls.py - URL과 View 함수
📌 1. 모듈 가져오기
from django.urls import path
from django.shortcuts import render
from django.http import Http404
from fake_db import user_db
- path: URL 경로를 만들기 위해 필요
- render: 템플릿과 데이터를 묶어서 HTML로 변환
- Http404: 없는 유저 ID로 접근 시 404 에러 발생
- fake_db에서 user_db를 가져옴
📌 2. 내부 데이터 연결
_db = user_db
- 앞으로는 코드 안에서 간단하게 _db로 데이터베이스를 다룹니다.
📌 3. user_list() 함수
def user_list(request):
names = [{'id': key, 'name': value['이름']} for key, value in _db.items()]
return render(request, 'user_list.html', {'data': names})
✏️ 설명
- _db.items()로 모든 유저를 순회하면서
- 각 유저의 id와 이름만 딕셔너리로 추려서 리스트에 저장합니다.
- 최종적으로 data라는 이름으로 user_list.html에 넘깁니다.
➡️ 이 리스트를 템플릿에서 for문으로 순회해서 유저 이름 목록을 보여줄 수 있습니다.
📌 4. user_info() 함수
def user_info(request, user_id):
if user_id not in _db:
raise Http404('User not found')
info = _db[user_id]
return render(request, 'user_info.html', {'data': info})
✏️ 설명
- user_id가 _db에 없으면 Http404 발생 (= 없는 유저 접근 방지)
- 있으면 해당 유저의 전체 정보를 가져와 user_info.html에 넘깁니다.
📌 5. URL 패턴 등록
urlpatterns = [
path('users/', user_list, name='user_list'),
path('users/<int:user_id>/', user_info, name='user_info'),
]
- /users/ → user_list 함수 실행
- /users/1/ → user_info 함수 실행
- name='user_list', name='user_info'는 템플릿에서 {% url %} 태그 사용할 때 쓰입니다.
3️⃣ templates/user_list.html (유저 리스트 페이지)
<h1>User List</h1>
<ul>
{% for user in data %}
<li><a href="{% url 'user_info' user.id %}">{{ user.name }}</a></li>
{% empty %}
<li>등록된 사용자가 없습니다.</li>
{% endfor %}
</ul>
✏️ 설명
- for user in data로 리스트를 순회하면서
- 각 유저 이름을 <a> 태그로 출력하고, 클릭하면 해당 유저 상세 페이지로 이동합니다.
- 데이터가 없으면 empty 블럭이 실행되어 "등록된 사용자가 없습니다" 출력.
**여기서 {% url 'user_info' user.id %}**는
URL Reverse 기능을 이용해
→ /users/1/, /users/2/ 같은 링크를 자동으로 만들어줍니다.
4️⃣ templates/user_info.html (유저 상세 페이지)
<h1>{{ data.이름 }}'s Information</h1>
<hr>
<table>
{% for key, value in data.items %}
{% if key != '이름' %}
<tr>
<th>{{ key }}</th>
<td>{{ value }}</td>
</tr>
{% endif %}
{% endfor %}
</table>
✏️ 설명
- data.이름을 제목(h1)으로 표시합니다.
- data.items로 모든 속성(key, value)들을 출력하는데,
- **'이름'**은 이미 제목에서 썼으므로 다시 테이블에 안 나오게 조건문 {% if key != '이름' %} 추가했습니다.
- 깔끔하게 테이블 형태로 정보 정리됩니다.
5️⃣ 최종 작동 흐름
경로 기능
/users/ | 전체 유저 이름 리스트 출력 |
/users/1/ | id=1인 유저 상세 정보 출력 |
없는 id 접근 | 404 에러 발생 |
✨ 추가 발전 방향
- 검색 기능 추가 (?q=이름 파라미터)
- 프로필 이미지 추가
- 페이지네이션 적용 (유저 많을 경우)
- 수정/삭제 기능 확장
- RESTful API 버전 만들기