프로젝트

📚 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 버전 만들기