[ 프로젝트 BEP ] 최종장 - 엔지니어로서의 마인드셋에 대해 : 우수한 엔지니어는 누구이고, 가져야할 마인드 셋에 대해

이미지
  들어가면서 이제 2025년도 얼마 남지 않은듯 하다.  조금 길어질 수도 있기 때문에  실제로 업로드 하는 것은 새해 이후가 될 가능성도 있으나  올해는 이 글로 마무리 해보려고 한다. 이제 이 최종장을 끝으로 이 프로젝트를 다소 마무리 할 수 있을 것 같다. 물론 전체적으로 글 자체가 부족한 부분이 여려 곳 보이지만,  이는 천천히 개선하기로 하고 일단 마무리를 잘 지어보려고 한다. 이 프로젝트의 목표는 어디까지나 주니어 엔지니어(넓은 범위로서)에게  도움이 될 수 있는 부분을 정리해 놓은 것 이며, 이를 전달하는 것에 주력을 했다. 정확히는 그 사이에 몇 번이나 직장은 바뀌었지만,  내가 다니고 있는 회사에서 작게는 멘터,  크게는 주니어 교육에 활용하기 위한 초안이였다. 들어가기 앞서서 먼저 개발자는 무엇인가에서 부터 시작해서,  수학은 필요한가, 그리고 학위에 대한 이야기를 나누어보았고, 그 다음으로 컴퓨터가 무엇인가에 대해서는,  가장 첫 장인 컴퓨터 개론에서 메모리 손실과 함께 설명하였다. 다음으로는 개발 방법론과 시스템 설계,  그리고 프로그래밍 언어에 대한 이야기로 간단하고 이론적인 이야기를 하였다. 눈치가 빠른 사람은 알 수 있듯이,  현실에서 가질 수 있는 몇 가지 의문으로 시작해서  컴퓨터라는 하드웨어 부터 시작해서,  프로젝트(개발 방법론), 설계, 프로그래밍 언어 순으로  일부러 점점 컴퓨터 세계로 들어가도록 구성을 해 놓았다. 여기서 한 걸음 더 나아가자면, 알고리즘이 들어갈 수는 있겠으나  어디까지나 가볍게 전달하는대에 목적이 있기도 하고,  개인적으로는 당장은 크게 중요하지 않은 부분이 라고 생각 했기 때문이다. 먼저 이 부분에 대해서 좀 더 자세히 이야기해보도록 하자. 시작 부터 모든 지식을 쌓을 수는 없다 이는 개발 영역에서만 해당되는 이야기는 아니지만,  모든 것에는...

[ Django, Python ] mozilla 튜토리얼 예제로 살펴보는 Django 분석 ⑦ - 3 : listing the current user's books(사용자의 책 목록)

다음으로 
현재 인증되어진 사용자가 빌린 책을 보는 
기능을 작성해보자.

물론 지금 책을 대출하는 기능은 없기 때문에
Django 관리자 페이지에서 데이터를 입력 해주어야 한다.

①Model


catalog/ 경로에 models.py 파일을 열어


from django.contrib.auth.models import User
borrower = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
위와 같이 Django 인증 관련 Model인 User를 import하고
Class 기반 BookInstance Model에 borrower 필드를 추가하자.


from datetime import date
@property
def is_overdue(self):
    if self.due_back and date.today() > self.due_back:
        return True
    return False
또한 date 관련 처리를 하기 위해 
datetime 객체를 import하고

반납 기간이 지났는지를 확인하는 함수인 
is_overdue라는 함수를 작성해보자.

python3 manage.py makemigrations
python3 manage.py migrate

마지막으로 Model을 수정했기 때문에 
다시 한번 마이그레이션 해주자.

②관리자 페이지(Admin)


관리자 페이지에 새로운 필드를 표시하기 위해 


@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('book', 'status', 'borrower', 'due_back', 'id')
    list_filter = ('status', 'due_back')
    
    fieldsets = (
        (None, {
            'fields': ('book','imprint', 'id')
        }),
        ('Availability', {
            'fields': ('status', 'due_back','borrower')
        }),
    )
위와 같이 catalog/ 경로의 admin.py 파일에 
borrower 필드를 추가 한다.

관리지 페이지에 들어가보면
BORROWER 필드가 화면에 표시됨을 알 수 있고,

나는 librarian1이라는 유저에게 두 책을 빌려주었다.

③ 대출(On loan) View


다음으로 현재 사용자가 대출하고 있는 
도서 목록을 가져오는 View를 추가해보자.


from django.contrib.auth.mixins import LoginRequiredMixin

class LoanedBooksByUserListView(LoginRequiredMixin,generic.ListView):
    """Generic class-based view listing books on loan to current user."""
    model = BookInstance
    template_name ='catalog/bookinstance_list_borrowed_user.html'
    paginate_by = 10
    
    def get_queryset(self):
        return BookInstance.objects.filter(borrower=self.request.user).filter(status__exact='o').order_by('due_back')
위와 같이 클래스 매개변수로서 LoginRequiredMixin을 
설정했기 때문에 로그인한 사용자
즉, 인증된 사용자만 이 View를 불러올 수 있다.

template_name을 default값이 아닌
사용하지 않고 설정해주었고,

QuerySet을 현재 인증된 사용자로 제한하기 위한 필터
(borrower=self.request.user)
status 필드의 데이터가 'o'와 일치하는 것을 찾는 필터를 추가
(filter(status__exact='o'))
그리고 due_back 필드의 데이터를 내림 차순으로 정렬한 값을 
(order_by('due_back'))
즉, 가장 오래된 날짜부터 정렬 한 값을 리턴하게 코딩했다.

④ 대출 도서에 대한 URLconf


이제 URL을 추가하자.


urlpatterns += [   
    path('mybooks/', views.LoanedBooksByUserListView.as_view(), name='my-borrowed'),
]
위와 같이 locallibrary/catalog/ 경로
urls.py 파일에 코드를 추가 하자.

⑤ 대출 도서 Template


대출 도서를 나타내는 템플릿을 추가해보자.


{% extends "base_generic.html" %}

{% block content %}
    <h1>Borrowed books</h1>

    {% if bookinstance_list %}
    <ul>

      {% for bookinst in bookinstance_list %} 
      <li class="{% if bookinst.is_overdue %}text-danger{% endif %}">
        <a href="{% url 'book-detail' bookinst.book.pk %}">{{bookinst.book.title}}</a> ({{ bookinst.due_back }})        
      </li>
      {% endfor %}
    </ul>

    {% else %}
      <p>There are no books borrowed.</p>
    {% endif %}       
{% endblock %}
/catalog/templates/catalog/ 경로에 
bookinstance_list_borrowed_user.html 파일을 추가하고
위와 같은 코드를 추가 하자.

추가 한 후 에
http://127.0.0.1:8000/catalog/mybooks/페이지에 들어가면 
빌린 목록을 포함한 연체・비 연체 목록도 알수 있다.

⑥ 사이드 바(Side Bar)에 목록 추가


마지막으로 사이드 바에 
빌린 책의 목록을 볼 수 있도록 추가해보자.

/locallibrary/catalog/templates/ 경로의 
base_generic.html 파일에 


 <ul class="sidebar-nav">
   {% if user.is_authenticated %}
   <li>User: {{ user.get_username }}</li>
   <li><a href="{% url 'my-borrowed' %}">My Borrowed</a></li>
   <li><a href="{% url 'logout'%}?next={{request.path}}">Logout</a></li>   
   {% else %}
   <li><a href="{% url 'login'%}?next={{request.path}}">Login</a></li>   
   {% endif %} 
 </ul>
위와 같이 코드를 추가하자.


에러가 없다면 위와 같이
사이드 바에 빨간색 박스와 같이 
빌린 목록을 볼 수 있는 하이퍼 링크가 추가될 것이다.


이 블로그의 인기 게시물

[ Web ] 웹 애플리케이션 아키텍처 (Web Application Architecture)

[ Web ] 서버 사이드(Sever Side) ? 클라이언트 사이드(Client Side)? 1 [서론, 클라이언트 사이드(Client Side)]

[ Web ] 웹 애플리케이션 서버 아키텍처의 정의 및 유형 ( Define and Types of Web Application Server Architecture )