티스토리 뷰
일단 우리는 지난 시간까지 한 작업은 Django의 auth 앱에서 사용하는 사용자 정보를 확장하여 우리 입맛대로 수정한 다음에 DB에 반영하고 관리자까지 한명 등록해봤다. 오늘은 이제 Serializing이라는 과정을 통해 사용자 정보를 가져오는 API를 하나 만들어보려고 한다.
왜 Serializing하는 것일까?
일단 DB에서 가져온 어떤 데이터를 그대로 사용자에게 전달 할 수 없고 이것을 "직렬화(Serializing)"라는 과정을 통해 데이터를 전달할 수 있도록 포멧을 변경하게 된다. 이 과정을 처음 겪는 사람들은 이를 귀찮다고 생각할 수 있는데 이 과정은 꽤 필수적인 과정이고 이 과정이 없어보이는 다른 프로그래밍 언어들도 눈에는 보이지 않지만 사실 이 직렬화라는 과정을 거쳐서 데이터를 전달하고 있다. 이 과정이 필요한 이유는 무엇일가?
DB에서 Ptyhon으로 데이터를 전달하는 과정을 고민해보면 이 Serializing이라는 과정의 필요성을 알 수 있다.
DB에서 Python으로 데이터를 전달하는 방법은 Byte라고 부르는 데이터의 한 형태로 전달되는데 이 Byte형태의 데이터는 일반적인 HTTP의 text/html나 application/json포멧의 데이터 형태와는 달라서 사용자(브라우저)에게 직접적으로 데이터를 전달 할 수 없다.(Byte형태의 데이터는 파일로써만 전달 할 수 있어서 텍스트 형태만 전달 할수 있는 text나 json 포멧으로는 데이터를 전달할 수가 없다)
그래서 이를 직렬화하여 사용자가 받아볼 수 있는 포멧으로 전달할 수 있도록 데이터의 형태를 변경하는 거다.
간단하게 설명하면 3명의 사람들이 있다고 생각을 하자. 한사람의 이름이 DB고 두번째 사람은 Python이다. 그리고 세번째 사람은 브라우저라는 사람이다. DB와 Python은 전구에 불이 몇번 깜빡이느냐에 따라 의사소통을 하고 있다. Python은 브라우저에게 DB한테 들은 이야기를 전달하고 싶은데 브라우저는 전구 깜빡이는 걸로는 의사소통을 할 수가 없는거다. 그래서 전구 깜빡이는 소리를 브라우저가 알아듣는 소리로 바꾸는 과정을 "직렬화". Serializing 이라고 하는거다.....
음.. 다시 한번 더 쉽게 정리하자면......... 그림을 그리면서 설명해주겠다.
위의 이미지 처럼 Python이 데이터베이스에서 데이터를 가져와서 사용자에게 전달하는 중간과정에서 사용자가 알아볼 수 있는 데이터의 모양대로 변환해주는게 Serializing이라는 과정이다.
User, Auth 모델 시리얼 라이징 하기
처음에 account 폴더 안에 serializers.py 라는 파일을 만들고나서 코딩을 시작하도록 하자.
from django.contrib.auth import get_user_model
from rest_framework import serializers
from .models import User, Auth
class AuthSerializer(serializers.ModelSerializer):
class Meta:
model = Auth
fields = [
'id'
, 'user'
, 'role'
]
class UserSerializer(serializers.ModelSerializer):
auths = AuthSerializer(many=True, read_only=True)
class Meta:
model = User
fields = [
'id'
, 'email'
, 'secret'
, 'status'
, 'is_active'
, 'last_login'
, 'auths'
, 'created_at'
, 'updated_at'
]
이 코드에서 봐줘야 할 것이 16번째 있는 auths 라는 코드다. 이 auths 어디서 본 기억이 나야한다.
models.py 코드를 보면 Auth 클래스에 아래와 같은 코드를 작성했었다.
시리얼라이징 할때 이렇게 이름으로 엮어주면서 사용자 권한 정보를 전달 받을 수 있도록 한다.
나중에 테스트를 해보면 위와 같이 시리얼라이징할때 auths 이름을 맞춰주지 않으면 권한 정보를 받아볼 수 없는 것을 확인할 수 있다.
일단 이렇게 했으면 시리얼라이징은 대충 된 것 같고 이제 views.py와 urls.py 파일을 수정해보자.
account.views
/* 생략 */
class UserInfo(APIView):
name = 'user-info'
def get(self, request, *args, **kwargs):
user_id = request.query_params.get("id")
query = User.objects.get(id=user_id)
serializer = UserSerializer(query, many=False)
return Response( serializer.data )
account.urls
from django.conf.urls import url
from .views import *
urlpatterns = [
url(r'^v1/hello', HelloView.as_view(), name=HelloView.name)
, url(r'^v1/get-user', UserInfo.as_view(), name=UserInfo.name)
]
위와 같이 코딩을 했으면 이제 브라우저에 대고 "http://localhost:8000/v1/get-user/?id=1" 이라고 입력해보자.
이렇게 나온다면 DB에서 id 값이 1인 사용자 정보를 가져오는데 성공한거다.
account의 views에 들어간 코드가 이해가 안가도 아직 괜찮다. 지금은 아무것도 이해할 필요 없이 왜 시리얼라이징이 필요하고 API를 하나 만들어서 우리가 코딩을 정상적으로 한 것이 맞는지 확인해보는게 더 중요하다.
views에 들어가는 코드는 차차 이해가 될 것이고 조금 더 복잡하고 어려운 코드를 작성할 수 있게 될거니까 너무 고민하지 않아도 괜찮다.
이제 다음 단계로 로그인을 한번 만들어보도록 하자.
이메일과 패스워드를 넣고 JWT를 이용해 토큰을 전달해주는 로그인은 다음시간에.
오늘은 안녕!
'Dev > 프로그래밍 잘하기' 카테고리의 다른 글
[짤방검색기] 14. JWT 세팅 마무리하기 (0) | 2019.07.03 |
---|---|
[짤방 검색기] #13. 로그인 하기(JWT로 토큰 받기) (0) | 2019.07.03 |
[짤방 검색기] #11. Django 사용자 정보 만들기(下) (2) | 2019.06.13 |
[짤방 검색기] #10. Django 사용자 정보 만들기(上) (0) | 2019.06.11 |
[짤방 검색기]#9. 본격 개발 준비 중 - 클래스란 무엇인가요? (0) | 2019.06.11 |