🗂️ Docverse

🔐 Docverse – UserSerializer & 회원가입 API 구현

code.with.siyeon 2025. 5. 11. 21:40

1. 구현 목적

사용자 회원가입 기능은 Docverse 플랫폼의 기초 진입 지점입니다.
안전한 사용자 등록과 이메일 중복 방지, 비밀번호 보안 처리, 에러 응답을 고려하여 설계했습니다.


2. 기능 흐름

[프론트엔드]
  ↓ 이름, 이메일, 비밀번호 입력
  ↓ 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() 흐름을 정확히 이해하게 되었고,
에러 응답 구조 설계에 대해 고민하는 계기가 되었습니다.