admin 페이지에 로그인하기 위해서는 슈퍼 유저(superuser)를 만들어야 한다. 아래와 같이 명령어로 슈퍼 유저(superuser)를 생성한다.
pythonmanage.pycreatesuperuser
그리고 이전에 생성한 model을 admin 페이지에 적용시켜야 정상적으로 model을 확인할 수 있다.
from django.contrib import adminfrom .models import Post# Register your models here.admin.site.register(Post)
from django.contrib import adminfrom .models import User# Register your models here.admin.site.register(User)
서버를 실행시키고 ~/admin 경로로 들어가면 admin 페이지를 볼 수 있다.
과제 관련 회고
migration 에러
단순히 새로운 모델을 추가하는 과정 이후에 migrate 과정을 수행하면 별다른 문제가 발생하지 않지만, 기존 모델의 attribute를 수정하는 등의 작업 이후에 migrate 과정을 수행하면 다음과 같은 에러가 나왔다.
raise IntegrityError( django.db.utils.IntegrityError: The row in table 'posts_post'with primary key '1' has an invalid foreign key: posts_post.writer_id contains a value '***'hat does not have a corresponding value in accounts_user.id. ...
나는 기존 모델의 varchar 형태였던 attribute를 Foreign Key로 바꾸었고, 기존 모델의 데이터는 지워지지 않은 상태였다.
대충 에러의 내용을 읽어보면 Django가 기존 형태인 varchar 형태로 작성된 데이터를 Foreign Key 형태로 읽어와서 생긴 문제라고 보인다.
어찌보면 당연한 이야기인게, 별다른 데이터 가공 과정이 없었으므로 Django는 단순 문자열로 써져 있던 데이터를 Foreign Key로 읽으려고 하니 에러가 발생할 수 밖에 없었을 것이다. 이런 문제를 해결하려면 migration 전에 기존 모델의 데이터를 새로운 모델의 형태에 맞추어 수정하거나, 이전 데이터를 전부 날려버리는 방법이 필요할 것이다.
모델 이름 복수형 전환
모델을 생성하고 관리자 페이지에서 확인했을 때 눈에 띄는 점이 하나 있었다. 모델 이름이 약간 변화한 것이다. 나는 Post 와 Comment 라는 이름으로 클래스를 생성하여 모델을 만들었는데, 관리자 페이지에서는 각각 Posts와 Comments 라는 이름으로 확인할 수 있었다.
확인해 보니 Django는 별다른 설정을 주지 않는다면 모델 이름을 복수형(plural)으로 바꿔준다고 한다. 위에서 언급한 Meta 클래스 안에 verbose_name_plural 옵션을 따로 설정하지 않으면 verbose_name (이것도 설정하지 않으면 class 이름을 그대로 따라간다) 뒤에 s를 붙인다.
models.ForeignKey 메서드
이번 과제로 세션에서 다루지 않은 ForeignKey 메서드로 외래키를 정의했는데, 시행착오를 겪었던 부분들이 몇가지 있었다.
먼저, ForeignKey 메서드의 파라미터 중 db_column 을 따로 설정해주지 않는다면 DB 상의 column 이름을 변수 이름 + _id 로 설정한다. 만약 변수 이름이 writer 라면 별도의 설정이 없을 때 DB에서 writer_id 라고 나온다.
그리고 ForeignKey 메서드의 첫번째 파라미터로 연결시킬 model을 입력할 때, 해당 model이 다른 app에 위치한다면 app이름.model이름 형태로 작성해야 한다. 같은 app에 있는 model( = 하나의 models.py 코드 안에 위치한 model)은 model이름 형태로 적어도 상관없지만, 다른 app에 있는 model은 Django에서 찾을 수 없다. 반드시 app의 이름을 명시해야 한다.
후기
사실 지금까지의 세션에서 실습을 진행할 때 별다른 문제가 없어서 약간 심심했었는데, 이번 세션에서는 드디어(?) 문제가 발생했다. 좀 많이 반가웠다.
결과적으로는 config/urls.py 의 urlpatterns의 대괄호를 중괄호로 바꾸고, 'admin/' 경로에서 뒤에 슬래쉬를 빼버리는 휴먼 에러(Human Error) 때문에 발생한 일이었다. 두 실수는 각각 보면 아주 단순한 형태였지만, 두 문제가 동시에 일어나서 원인을 찾기 힘들어 해결하기 매우 복잡해졌다.
세션 도중에 발생한 문제라 많이 당황했었지만 결국 해결했으므로 신선했던 경험이라고 여겨야겠다.
이번 세션에서는 DB를 학습했다. 나에게 DB에 대한 기억은 정말 골치아팠던 기억밖에 없던 것 같다… DB 환경을 구축하는 것부터 각종 문제가 발생했고 DB의 유지보수 과정은 더욱 끔찍했었다.
하지만 지금 생각해보면 내가 DB에 무지한 상태에서 무작정 시도하려고 하다 발생한 문제였다는 생각이 든다. 멋사 세션과 함께 DB를 올바르게 이해하고 여러 실전 경험들을 쌓는다면 같은 실수를 반복하지는 않을 것이다.
그리고 멋사 세션을 진행하며 한가지 목표가 있다면, Docker 같은 컨테이너를 이용해 DB를 관리하는 방법을 알고 싶다.
비록 컨테이너를 꽤 많이 사용하지는 않았지만 DB든 외부 라이브러리든 환경을 구성할 때 컨테이너를 사용하면 정말 깔끔하게 해낼 수 있었다. 그리고 최근 기업에서도 쿠버네티스를 이용한 컨테이너 오케스트레이션을 많이 사용하므로 배워두면 두고두고 쓸 것이다.
시간이 날 때 한번 Docker에서 SQLite를 Django 프로젝트에 연결시키는 작업을 해볼 계획이다.