오늘은 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. 배운 점 & 정리
- • 시리얼라이저에서 DB에 저장되는 값을 조정하려면,
create(또는update) 메서드를 오버라이드해야 한다. - •
to_representation은 응답으로 내보낼 때 데이터를 가공하는 메서드다. 저장될 데이터를 바꾸려면 안 맞는다. - •
request.data에는 사용자 정보가 들어 있지 않으므로,context를 통해 요청 객체를 넘겨주는 방법이 좋다. - • 간단한 경우에는 직접
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 |