5. Admin 기능 사용하기

등록일 : 2020.12.15. 19:28


Django Admin 기능 이용해 보기

웹사이트 들을 돌아다니다 보면 '관리자 페이지' 라고 보이는 버튼이나 메뉴를 본 적이 있을 것이다. 일반적인 사용자 라면 접근할 일이 없지만, 이제 당신은 서비스 제공자로 투표 앱에 대한 질문과 답변을 관리해야 한다.

우리는 질문과 답변을 관리하기 위해 데이터베이스를 사용하기로 했었다. 이를 DB에 접속해 직접 추가하고 삭제한다면 머리아픈 SQL문을 사용해야 한다. 이 부분은 중수 이상이 되면 필요하겠지만 여기서 당장은 필요 없다. Django 를 사용하는 가장 많은 이유가 이런 데이터를 쉽게 관리해 줄 수 있는 Admin 기능이 있기 때문이다. Admin 기능에 모든 것을 맡겨보자.

Django Admin Superuser 만들기

웹사이트의 관리자 페이지는 아무나 접근해서는 안 된다. 보통 클릭하면 아이디와 비밀번호를 입력하고 승인된 사용자만 볼 수 있어야 한다. 투표사이트의 admin 관리자를 바로 만들어보자. 터미널로 이동해보겠다.

터미널에서 python manage.py createsuperuser 명령어를 통해 가능하다. 슈퍼유저는 슈퍼맨과 같이 Django에서 모든 데이터를 접근할 수 있는 막강한 권한을 가진 유저이다.

(venv)  $ python manage.py createsuperuser

Username (leave blank to use 'yourname'): admin   # 본 강좌에서는 admin으로 생성
Email address:
Password:
Password (again):

Superuser created successfully.

여기에 입력한 아이디와 비밀번호는 잘 기억해두자. 여기서는 편의상 admin으로 만들겠다. 너무 흔한 아이디와 패스워드는 실제 인터넷 환경에서 사용되는 서비스의 관리자 계정을 만들 때는 보안에 좋지 않을 수 있다. 또한, 너무 짧은 비밀번호는 여러 번 반복하면 쉽게 뚫릴 수 있으므로 8자 이상 복잡하게 만드는 것을 추천한다. 보안은 생명이다. 해커에게 아이디와 비밀번호가 유출된다면 당신의 데이터는 모두 삭제 될 수도 있고, 당신의 데이터를 훔쳐가서 돈을 요구할 수도 있다. 여기서는 연습이니까 쉽게 만들어도 문제가 되지는 않는다.

Djago Admin 페이지 접속해 보기

이제 관리자 계정도 만들었으니 한번 다시 서버를 실행해보자. 터미널로 이동하여 개발 서버 실행 명령어인 python manage.py runserver 명령어를 실행한다. 서버 실행 메시지를 확인했다면 http://127.0.0.1:8000/ 을 다시 접속해 보자.

이전 시간에 이야기했던 의도된 에러 페이지에 polls/ 말고도 하나의 경로가 더 있었다. 그것이 바로 admin/ 이었다. 이미 우리는 admin페이지로 접속할 수 있도록 작업이 되어 있다. 궁금하다면 urls.py를 열어 확인해 보자. 이제 admin 페이지로 접속하기 위해 http://127.0.0.1:8000/admin/ 을 브라우저에 입력하면 된다.

위와 같은 로그인 창이 나왔다면 성공한 것이다.

생성한 Superuser 계정으로 접속해보기

Username 필드에는 조금 전 createsuperuser 명령어로 입력했던 username을 입력한다. 예시에서는 admin으로 입력했었다. 비밀번호는 설정한 비밀번호를 입력 후 로그인을 해보자.

로그인에 성공하면 Django administration 페이지가 나온다. 기본적으로 Groups / Users 항목이 등록되어 있다. 장고의 가장 쉽고 강력한 기능 중 하나가 이 사용자관리와 그룹관리이다. 직접 만들려면 시간도 오래걸리고 힘들지만, 장고는 사용자 및 로그인 기능을 이처럼 쉽게 붙일 수 있는 것이 장점이다. 다만 이번 강좌에서는 다루지는 않는다. 프로젝트로 만드는 투표 앱은 로그인 기능을 사용하지 않고, 투표와 답변을 관리하는 부분만 superuser가 사용한다.

Admin에 Question, Choice 모델 등록하기

이제 admin 화면에서 지난 시간 만들어 둔 Question과 Choice 모델을 사용할 수 있다. polls의 두 모델을 admin에서 관리 할 수 있도록 등록해주자.

polls/admin.py를 다음과 같이 수정해보자.

from django.contrib import admin

from .models import Question
from .models import Choice

admin.site.register(Question)
admin.site.register(Choice)

파일 수정이 완료되었다면, 다시 admin 페이지로 돌아와 새로 고침 버튼을 눌러보자.

위 화면처럼 기존에 보이지 않았던 Polls - Questions와 Choices 항목이 보일 것이다. Django Admin에서는 이렇게 데이터를 관리 할 수 있게 해준다. 지금은 투표 질문 / 답변에 대한 것들을 추가할 수 있고, 화면 구성도 입맛에 맞게 수정 가능하다.

나중에 당신이 블로그를 만든다면 블로그 게시글 콘텐츠 관리를 할 수도 있고 쇼핑몰을 만든다면 상품 관리 재고관리 사용자 관리 페이지들을 관리 할 수 있게 해준다. 다만 지금은 복잡한 부분을 생각할 필요가 없다. 우리는 단순히 투표 질문과 그에 대한 선택지들만 보여주면 된다.

자 이제 투표를 한번 추가해보자. 어드민 사이트에서 Questions의 +Add 버튼을 누른다.

question_text와 pub_date가 보일 것이다. 이것은 우리가 models.py에서 만든 그대로 잘 적용되어 있다. 예시 투표 내용이 기억나는가?

투표 예시
Q1. 선호하는 떡볶이 맵기 강도는?  -2020. 11. 24일 배포-
A1   순한맛 :  0 명 투표
A2   보통맛 :  0 명 투표
A3   매운맛 :  0 명 투표
A4  아주 매운맛 : 0 명 투표

question_text에는 '선호하는 떡볶이 맵기 강도는?' 를 입력하자. 그리고 Date published의 Date / Time은 Today 버튼과 now 버튼을 각각 클릭하면 현재 시간으로 표시된다. 날짜와 시간이 현재 시간과 맞지 않을 것이다.

이 부분은 mysite/settings.py 를 열어보자.

mysite/settings.py

# ...생략...

TIME_ZONE = 'Asia/Seoul'    # TIME_ZONE = 'UTC'에서 변경

# ...생략...

TIME_ZONE 부분이 보일 것이다. 이 부분을 'Asia/Seoul'로 변경하면 된다. 그다음 웹 브라우저에서 Admin 페이지를 새로고침 하고 Date, Time을 확인해 보면 현재 시간으로 적용될 것이다. 이것이 완벽한 해결책은 아니지만 여기서는 한국시간 기준으로 처리하는 것까지만 고려하겠다. 날짜와 시간도 선택했다면 SAVE를 클릭하자.

저장을 하면 Question object (1)이라는 문구와 링크가 보이는데 이 부분을 클릭해 보자. 앞서 저장한 내용이 잘 저장되어 있음을 알 수 있다.

이제 Choices도 같은 방식으로 등록해보도록 하자. choices의 +Add버튼을 누른다.

question 필드는 방금 등록한 question object (1)을 선택한다. 모델 설계에서 question에 종속되게 만들었기 때문에 선택해야만 저장할 수 있다. choice_text에 각각 순한맛, 보통맛, 매운맛, 아주 매운맛을 입력하고 저장한다. votes는 기본으로 0이 들어 있으므로 변경하지 않는다. pub_date는 해당 choice 모델에서는 선언하지 않았기에 사용되지 않는다. 이는 Question에서만 사용한다. 잘 저장했다면 다음과 같이 보일 것이다.

클릭해 보면 각각의 값이 잘 보일 것이다.

이제 DB에 저장했으므로 데이터는 잘 보관 되었으며, 장고 어드민을 통해 확인하고 쉽게 데이터를 추가 / 수정 / 삭제할 수도 있다. 그렇지만 DB 데이터 수정과 삭제는 주의해야 하는 작업이다. 이 책에서는 실습의 원활한 진행을 위해 요청하지 않은 데이터의 삭제와 수정은 주의하도록 하자.

DB 테이블에서 Question, Choice 모델 데이터 맛보기

지금은 편리하게 admin에서 보고 있지만, DB 테이블에서는 다음과 같은 형식으로 데이터가 들어가 있다.

Question 테이블의 id와 Choice Table의 id는 별개이다. 우리가 선언하지 않았지만, 자동 증가로 인해 1번부터 id번호가 할당되었다. Choice 각 행의 question_id가 1이며 이는 Question Table의 1과 매핑되어 바라본다고 할 수 있다. 모두가 1번 Question에 해당하는 선택지여서 아이디가 모두 1로 등록되었다.

DB를 사용하고 Admin을 통해 등록하여 관리하는 여정은 아주 간단하지는 않았지만, 모델 만든 후 등록만 해두면 보기 편한 UI를 제공해 편리하게 사용할 수 있을 것이다.

그러면서 한편으로는 DB를 써서 이렇게까지 복잡하게 데이터를 저장해야 하나? 라는 의문이 들 수 있다. 시간이 지나 투표 데이터가 수백 개가 되고 선택 데이터가 수백 수천 개가 되고 누가 얼마나 투표했는지를 다른 방식으로 관리한다면 관리하기가 매우 어려울 수 있다. 지금은 물론 간단한 예제지만 기초를 잘 다져 놓는다면 나중에 후회할 일이 없다.

다음 장에서는 이 데이터들을 실제로 웹에서 보여 줄 수 있게 만드는 과정을 설명한다.