코드 위의 하루 (A Day on the Code)

🧑‍🍳 Python 프로젝트 레시피: Part 6 본문

🍳Python 프로젝트 레시피

🧑‍🍳 Python 프로젝트 레시피: Part 6

code.with.siyeon 2025. 5. 12. 17:42

자주 썼던 코드 스니펫

실전에 바로 쓰는 코드 레시피 모음

✅ 1. 회원가입 API (Django + DRF)

# 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():
            user = serializer.save()
            user.set_password(user.password)  # 비밀번호 해시화
            user.save()
            return Response({"message": "회원가입 완료"}, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

✅ 비밀번호는 반드시 set_password()로 해시화 후 저장해야 로그인 시 오류가 발생하지 않아요!


✅ 2. 커스텀 예외 응답 포맷 설정

# config/settings.py
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'utils.exceptions.custom_exception_handler',
}
# utils/exceptions.py
from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)

    if response is not None:
        response.data = {
            "status_code": response.status_code,
            "errors": response.data
        }
    return response

✅ 예외 응답을 일관된 포맷으로 만들어 프론트엔드와의 연동이 쉬워집니다.


✅ 3. Serializer 유효성 검사 + 커스텀 메시지

# users/serializers.py
from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['email', 'password']
        extra_kwargs = {
            'password': {'write_only': True, 'min_length': 6},
        }

    def validate_email(self, value):
        if User.objects.filter(email=value).exists():
            raise serializers.ValidationError("이미 등록된 이메일입니다.")
        return value

 

✅ validate_필드명() 함수를 사용하면 특정 필드의 조건을 세부적으로 설정할 수 있어요.


✅ 4. JWT 토큰 기반 로그인 응답

# 로그인 성공 후 응답 예시
{
    "message": "로그인 성공",
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "user": {
        "email": "test@example.com",
        "nickname": "시연공주"
    }
}

✅ 토큰 발급 후 user 정보를 함께 넘기면 프론트에서 바로 유저 상태를 갱신할 수 있어요.


📌 실전 경험 메모

Docverse 프로젝트에서 회원가입 기능을 구현할 때, 처음엔 set_password()를 누락해서 로그인할 수 없다는 오류를 겪었어요.
이 문제를 통해 Django의 사용자 인증 시스템을 정확히 이해하는 것이 얼마나 중요한지를 깨달았습니다.
또한 프론트엔드 팀과 협업하면서 예외 응답 포맷을 통일하자고 제안했고, 커스텀 핸들러를 도입하게 되었어요.


🧾 마무리 요약

코드 목적포인트 요약
회원가입 API set_password()로 반드시 비밀번호 해시화
커스텀 예외 응답 일관된 JSON 포맷으로 에러 처리
유효성 검사 validate_email 같은 커스텀 로직 구현 가능
로그인 응답 포맷 토큰 + 유저 정보 함께 전달로 UX 향상