🗂️ Docverse
🔐 Docverse – UserSerializer & 회원가입 API 구현
code.with.siyeon
2025. 5. 11. 21:40
1. 구현 목적
사용자 회원가입 기능은 Docverse 플랫폼의 기초 진입 지점입니다.
안전한 사용자 등록과 이메일 중복 방지, 비밀번호 보안 처리, 에러 응답을 고려하여 설계했습니다.
2. 기능 흐름
[프론트엔드]
↓ 이름, 이메일, 비밀번호 입력
↓ POST /signup
[백엔드 - Django]
→ UserSerializer로 데이터 검증
→ 비밀번호 set_password()로 해시처리
→ DB에 저장
→ 성공 메시지 응답
↓ 이름, 이메일, 비밀번호 입력
↓ POST /signup
[백엔드 - Django]
→ UserSerializer로 데이터 검증
→ 비밀번호 set_password()로 해시처리
→ DB에 저장
→ 성공 메시지 응답
3. 시리얼라이저 정의
📁 users/serializers.py
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email', 'password']
extra_kwargs = {
'password': {'write_only': True}
}
def create(self, validated_data):
user = User(
username=validated_data['username'],
email=validated_data['email']
)
user.set_password(validated_data['password']) # 해시 처리
user.save()
return user
✅ 비밀번호는 평문으로 저장하지 않고 set_password()로 암호화
✅ extra_kwargs['password'] = write_only 설정으로 응답에 비밀번호 포함 안되도록 처리
4. API View 정의
📁 users/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializers import UserSerializer
class SignupView(APIView):
def post(self, request):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'message': '회원가입이 완료되었습니다.'}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
✅ serializer.is_valid()로 유효성 검사 → 통과 시 저장, 실패 시 에러 반환
📎 이메일 중복 체크는 모델에서 unique=True로 처리되어 있음
5. URL 연결
📁 users/urls.py
from django.urls import path
from .views import SignupView
urlpatterns = [
path('signup/', SignupView.as_view(), name='signup'),
]
📁 config/urls.py
from django.urls import path, include
urlpatterns = [
path('api/', include('users.urls')),
]
📎 /api/signup/으로 POST 요청 시 회원가입 처리됨
6. 테스트 및 결과 확인
- Postman이나 Swagger로 POST 요청 확인
- 정상 응답 예시:
{
"message": "회원가입이 완료되었습니다."
}
7. 문제 해결 & 회고
비밀번호 평문 저장 | set_password() 누락 | create() override에서 해시 처리 |
응답에 비밀번호 포함 | 기본 시리얼라이저 설정 | extra_kwargs 설정으로 write_only 처리 |
이메일 중복 오류 | 중복 허용 상태 | models.py에서 email = unique=True로 수정 |
비밀번호 보안 처리와 응답 보안 설정 등 보안에 대한 고려가 특히 중요했던 기능이었습니다.
Django REST framework의 serializer.is_valid()와 save() 흐름을 정확히 이해하게 되었고,
에러 응답 구조 설계에 대해 고민하는 계기가 되었습니다.