[ Essay - Technology, Essay - Intuition ] Chat GTP시대의 도래와 생각하는 방식에 대해 : 개발자의 미래에 대해

이미지
벌써 올해도 반쯤 지나 뜨거운 여름이 다가왔다. 굉장히 빠르게 지나간듯한 느낌이 드는데  아마 의미있는 시간을 보냈다는 이야기이기 때문에  그렇게 나쁜 신호는 아닐 것 이다. 괴로운 시간이였다면, 1초가 1년 같이 느껴졌을테니 말이다. 더위에 매우 약한 나에게 있어서는 지옥과 같은 시기이기도 하지만 늘 그렇던 것 처럼 에어컨 덕분에 어찌저찌 버틸 수 있을 것 같다. 어쨋든, 이번에는 저번의 에세이 주제, Chat GTP시대의 도래와 생각하는 방식에 대한 이야기에 이어서  과연 개발자의 미래는 어떻게 될 것인가에 대해 이야기를 나누어보려고 한다. 어쩌면 모두가 인식하고 있듯이 지금 2025년 현재,  꽤나 중요한 시기에 직면하고 있는지도 모른다. 왜냐하면, 생성AI의 발전 속도가 생각보다 빠르게 발전하고 있고,  그에 따라 실제 업무에서도 빠르게 사용되어지고 있기 때문이다. 이러한 상황에서 개발자에게 있어서 가장 두려운 점은  당연히 생성AI에 의해 개발자가 대체될 것 이라는 두려움일 것 이다. 이는 개발자에게만 한정된 이야기는 아니지만 말이다. 아마 필드에서 나와 같이 일하고 있거나  개발자로서 직업을 가지려는 생각이 있는 사람이라면  한번쯤은 생각해볼법한 주제라 생각 한다. 물론 미래가 정확히 어떻게 될 지는 알 수 없으나  이런 생각을 함으로써 몇 가지 힌트는 얻게 될지도 모르니  만약 얻게 된다면 미래에 대한 방향성을 조금이나마 올바른 쪽으로 돌릴 수 있을 것 이다. 이 글을 끝맽을 때는 조금이라도 힌트에 도달하기를 바란다. 과거의 역사 이러한 의문에 대한 해결책으로서 일반적으로 자주 사용하는 방법이 있다. 바로 역사를 보는 것 이다. 물론 이러한 역사를 해결책을 찾는거에 대한 전제조건은  우리가 '구 인류'라는 전제조건이 있었을 때 의미가 있다. 그러니깐 현대인도 기원전 8세기의 고대 로마인도  본질적으로 다르지 않다는 것을 인정해야만 한다. 예컨데...

[ Django, Python ] mozilla 튜토리얼 예제로 살펴보는 Django 분석 ⑤ - 2 : Book Detail View


Book Detail View


URL catalog/book/<id>(<id> : book의 primary key)에 접근해서 
Book의 특정 정보를 보여주는 상세 페이지를 추가할 것이다.

① URL Mapping


/catalog/urls.py 파일을 열어 아래와 같이 수정하자.


urlpatterns = [
    path('', views.index, name='index'),
    path('books/', views.BookListView.as_view(), name='books'),
    path('book/<uuid:pk>', views.BookDetailView.as_view(), name='book-detail'),
]

② Passing additional options in your URL maps


path() 함수의 3번째 인수를 추가함으로써 
동일한 View를 다른곳에 재활용하거나 
각 상황에 맞게 조절하려고 할 때 사용하기 위한 옵션을 지정할 수 있다.

path('url/', views.my_reused_view, {'my_template_name': 'some_path'}, name='aurl'),
path('anotherurl/', views.my_reused_view, {'my_template_name': 'another_path'}, name='anotherurl'),
이 옵션들은 사전형 자료형으로 정의된다.

③ View(클래스 기반)


catalog/views.py파일에 아래와 같이 코드를 추가해보자.


class BookDetailView(generic.DetailView):
    model = Book
이제 이 Detail View를 나타낼 Template를 만들면 된다.

④ Detail View 템플릿 생성하기


/locallibrary/catalog/templates/catalog/에 
book_detail.html파일을 만들어 아래와 같이 코드를 추가하자.


{% extends "base_generic.html" %}

{% block content %}
  <h1>Title: {{ book.title }}</h1>

  <p><strong>Author:</strong> <a href="">{{ book.author }}</a></p> <!-- author detail link not yet defined -->
  <p><strong>Summary:</strong> {{ book.summary }}</p>
  <p><strong>ISBN:</strong> {{ book.isbn }}</p> 
  <p><strong>Language:</strong> {{ book.language }}</p>  
  <p><strong>Genre:</strong> {% for genre in book.genre.all %} {{ genre }}{% if not forloop.last %}, {% endif %}{% endfor %}</p>  

  <div style="margin-left:20px;margin-top:20px">
    <h4>Copies</h4>

    {% for copy in book.bookinstance_set.all %}
      <hr>
      <p class="{% if copy.status == 'a' %}text-success{% elif copy.status == 'm' %}text-danger{% else %}text-warning{% endif %}">{{ copy.get_status_display }}</p>
      {% if copy.status != 'a' %}
        <p><strong>Due to be returned:</strong> {{copy.due_back}}</p>
      {% endif %}
      <p><strong>Imprint:</strong> {{copy.imprint}}</p>
      <p class="text-muted"><strong>Id:</strong> {{copy.id}}</p>
    {% endfor %}
  </div>
{% endblock %}
위의 코드 중에 book.bookinstance_set.all() 함수는 눈여겨 볼만하다.


이 메소드는 Django에 의해 자동으로 만들어진 메소드로
Book과 관련된 BookInstance 레코드 집합을 반환한다.

이제 지금 까지 코딩했던 것들이 
정상적으로 작동하는지 화면을 확인해보자.


메인 화면에서 All books 하이퍼링크를 눌렀을 때,
등록했던 책들이 표시되면 된다.

그리고 책의 하이퍼링크를 클릭해 


위와 같은 화면이 표시된다면 
모든 책을 보여주고, 상세 정보를
보여주는 페이지는 완성했다고 볼 수 있다.

Pagination(페이징 처리)


레코드가 몇개 없다면 괜찮겠지만,
수백, 수천개의 레코드를 가지고 있다면 
점차 페이지를 가져오는데 시간이 걸릴 것이다.

이를 방지하기 위해 
나눠서 페이지를 보여주는 Pagination(페이징) 기능을
추가하는 것이 좋다.

① Views


catalog/views.py에 아래와 같이 코드를 추가해보자.


class BookListView(generic.ListView):
    model = Book
    paginate_by = 10
이것으로 10개 이상의 레코드를 갖게되면
View는 template에 보내는 데이터에 
Pagination(페이징)을 하게될 것이다.

사실 이 페이징 처리를 하기 위해서
꽤나 복잡한 코드를 작성해야 되지만,
재사용성을 강조하는 최근의 패러다임에 맞게
Django에서는 페이징 기능을 지원한다.

② Templates


/locallibrary/catalog/templates/base_generic.html에 
pagination 블록을 추가하자.


{% block content %}{% endblock %}
  
{% block pagination %}
  {% if is_paginated %}
    <div class="pagination">
      <span class="page-links">
        {% if page_obj.has_previous %}
          <a href="{{ request.path }}?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}
        <span class="page-current">
          <p>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</p>
        </span>
        {% if page_obj.has_next %}
          <a href="{{ request.path }}?page={{ page_obj.next_page_number }}">next</a>
        {% endif %}
      </span>
    </div>
  {% endif %}
{% endblock %} 
위의 화면과 같이 
<div>태그에 정확히 넣지 않으면 
페이징 레이아웃이 이상한 곳으로 가기 때문에 주의하도록 하자.


정상적으로 추가했다면 위와 같이
페이징 기능이 정상적으로 작동할 것이다. 




이 블로그의 인기 게시물

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

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

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