📌 Django OAuth 리팩토링 - 9편: 닉네임 설정 & 중복 확인 API
🔐 OAuth 이후 회원가입을 마무리하는 닉네임 등록 API와
✨ Swagger에 잘 나타나도록 한 GET/POST 중복확인 API까지 정리
🧭 1. 닉네임 설정 흐름
- 소셜 로그인 완료 후 email만 저장된 CustomUser 생성
- 사용자에게 닉네임 입력 화면 제공
- 닉네임을 API로 전송 → 중복 확인 → 등록 완료
🛠️ 2. 닉네임 설정 API
@extend_schema(request=NicknameSetSerializer)
@api_view(["POST"])
@permission_classes([AllowAny])
def set_nickname(request):
serializer = NicknameSetSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = get_object_or_404(CustomUser, email=serializer.validated_data["email"])
user.nickname = serializer.validated_data["nickname"]
user.save()
return Response({"message": "닉네임 설정 완료"})
class NicknameSetSerializer(serializers.Serializer):
email = serializers.EmailField()
nickname = serializers.CharField()
def validate_nickname(self, value):
if CustomUser.objects.filter(nickname=value).exists():
raise serializers.ValidationError("이미 사용 중인 닉네임입니다.")
return value
🔍 3. 닉네임 중복 확인 API (GET & POST 제공)
✅ GET 방식 (Swagger에서 쉽게 테스트 가능)
@extend_schema(
parameters=[
OpenApiParameter(
name="nickname",
required=True,
type=OpenApiTypes.STR,
location=OpenApiParameter.QUERY,
description="중복 확인할 닉네임"
),
],
responses={
200: OpenApiResponse(
description="사용 가능 여부 응답",
examples=[
{"name": "사용 가능", "value": {"is_available": True}},
{"name": "사용 불가", "value": {"is_available": False, "detail": "이미 사용 중인 닉네임입니다."}},
]
)
},
summary="닉네임 중복 확인 (GET)",
description="닉네임이 사용 가능한지 GET 요청으로 확인합니다.",
)
@api_view(['GET'])
@permission_classes([AllowAny])
def check_nickname_get(request):
serializer = NicknameCheckSerializer(data=request.query_params)
if serializer.is_valid():
return Response({'is_available': True}, status=status.HTTP_200_OK)
return Response(
{
'is_available': False,
'detail': serializer.errors.get('nickname', ['유효하지 않은 요청입니다.'])[0]
},
status=status.HTTP_200_OK
)
✅ POST 방식 (프론트 연동 시 유용)
@extend_schema(
request=NicknameCheckSerializer,
responses={200: None},
summary="닉네임 중복 확인 (POST)",
description="닉네임이 사용 가능한지 POST 요청으로 확인합니다."
)
@api_view(['POST'])
@permission_classes([AllowAny])
def check_nickname_post(request):
serializer = NicknameCheckSerializer(data=request.data)
if serializer.is_valid():
return Response({"available": True}, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class NicknameCheckSerializer(serializers.Serializer):
nickname = serializers.CharField()
def validate_nickname(self, value):
if CustomUser.objects.filter(nickname=value).exists():
raise serializers.ValidationError("이미 사용 중인 닉네임입니다.")
return value
🧪 4. Swagger UI에서 테스트 확인
- GET /api/oauth/nickname/check-nickname/ → query param으로 확인
- POST /api/oauth/nickname/check-nickname/ → JSON body로 확인
- POST /api/oauth/nickname/ → 닉네임 최종 등록
✅ 마무리 흐름 요약
단계설명
| 소셜 로그인 |
이메일 정보만으로 유저 생성 |
| 닉네임 입력 요청 |
프론트에서 닉네임 입력 UI 제공 |
| 닉네임 중복 확인 |
GET/POST API로 가능 여부 확인 |
| 닉네임 설정 |
POST /nickname/ 으로 등록 |