본문 바로가기
Python/Django

Django User정보 넣기

by 좌우지간에 2025. 1. 22.

오늘은 Django REST Framework에서 로그인한 사용자 정보를 처리하는 과정을 공부하면서 겪은 시행착오와 배운 점을 간단히 정리해보았습니다.


작성자에 username 넣기

프로젝트를 진행하다 보니, 글을 작성할 때 로그인한 사용자의 정보를 글 작성자(author)로 자동으로 저장하고 싶었습니다. 그런데 처음에는 어떻게 구현해야 할지 막막하더라고요. 그래서 다양한 방법을 시도해봤습니다.


1. 시리얼라이저에서 사용자 정보 처리

처음 시도: to_representation 이용

처음에는 “시리얼라이저에서 to_representation 메서드를 오버라이드하면 되지 않을까?”라고 생각했고, author 필드를 거기서 변경하면 사용자 정보를 저장할 수 있을 거라고 오해했습니다.
하지만 to_representation는 말 그대로 데이터를 “표현”할 때만 사용하는 메서드였습니다. 즉, 실제 데이터베이스에 저장되는 값을 바꾸는 건 불가능했습니다.

올바른 방법: create 메서드 오버라이드

결국, 정확한 해결책은 시리얼라이저의 create 메서드를 오버라이드해서 author 필드에 현재 로그인한 사용자를 직접 지정해주는 것이었습니다.

예를 들어 :

def create(self, validated_data):
    request = self.context.get('request', None)
    if request:
        validated_data['author'] = request.user.username
    return super().create(validated_data)

이렇게 하면 실제 DB에 저장될 때 author 필드에 로그인한 사용자의 username이 들어가게 됩니다.


2. 뷰에서 사용자 정보 전달하기

시행착오: request.data만으로 충분하지 않을까?

처음에는 request.data 안에 사용자 정보가 다 들어 있을 거라고 생각했습니다. 그런데 사실 request.data에는 클라이언트가 요청 바디에 담아 보낸 데이터만 들어 있더라고요. 즉, 로그인 정보나 사용자 객체 정보는 request.data에 자동으로 들어가 있지 않습니다.

해결책: context로 request 객체 전달

그래서 시리얼라이저에서 request 객체 자체를 활용하려면, 뷰에서 시리얼라이저를 호출할 때 context 인자로 request를 넘겨주어야 합니다:

def post(self, request, *args, **kwargs):
    serializer = PostSerializer(data=request.data, context={'request': request})
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

이렇게 해주면 시리얼라이저 내부에서 self.context.get('request')를 통해 request.user에 접근할 수 있습니다.

대안: request.user를 직접 따로 전달

아예 serializer.save(author=request.user.username)처럼 직접 전달하는 방법도 있습니다. 하지만 보통은 확장성과 일관성을 위해 context를 자주 사용합니다.


3. 배운 점 & 정리

  1. • 시리얼라이저에서 DB에 저장되는 값을 조정하려면, create(또는 update) 메서드를 오버라이드해야 한다.
  2. to_representation은 응답으로 내보낼 때 데이터를 가공하는 메서드다. 저장될 데이터를 바꾸려면 안 맞는다.
  3. request.data에는 사용자 정보가 들어 있지 않으므로, context를 통해 요청 객체를 넘겨주는 방법이 좋다.
  4. • 간단한 경우에는 직접 request.user.username을 전달하는 것도 가능하지만, 여러 시리얼라이저나 확장된 기능을 고려한다면 context 사용이 더 유연하다.

오늘 진행한 과정을 통해 Django REST Framework에서 사용자 정보를 다루는 전반적인 흐름을 정리할 수 있었습니다. 앞으로도 프로젝트에서 여러 가지 방법을 시도해보면서 더 깊게 이해하면 좋을 것 같네요.

'Python > Django' 카테고리의 다른 글

Django Serialize 심화  (0) 2025.01.23
DRF(Serializer)  (1) 2025.01.21
Django 에서 commit  (0) 2025.01.20
웹보안을 위해 쿠키, 세션, 해시 그리고 JWT (Django 관점)  (1) 2025.01.17
DRF학습전 API, RESTful API 미리보기  (1) 2025.01.16