팀 프로젝트가 시작되고, 백엔드, 프론트에서 유저쪽을 담당하기로 했다.
소셜 로그인 기능을 구현하고 싶었지만, 현재 백엔드에서 카카오 API를 호출하여 카카오 계정으로 회원가입/로그인 후 access 발급까지 모두 백엔드에서만 이루어져 프로젝트의 프론트에서 해당 API를 연결할 수가 없었다.
우선 소셜 로그인 기능은 잠시 미뤄두고 회원 가입과 탈퇴 기능을 먼저 구현했다.
# views.py
class UserView(APIView):
def post(self, request):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request):
user = request.user
user.delete()
return Response({"message": "회원 탈퇴 완료!"}, status=status.HTTP_200_OK)
# serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
def create(self, validated_data):
user = User(
email=validated_data["email"],
)
user.set_password(validated_data["password"])
user.is_active = True
user.save()
return user
회원가입 및 탈퇴 버튼을 눌러 해당 url로 요청을 보낼 수 있도록 프론트에서 연결해주고, 요청이 들어오면 API가 실행되어 사용자로부터 전달받은 데이터를 serializer를 통해 검증 및 db에 저장을 한다.
회원탈퇴의 경우 로그인 된 이용자만 서비스를 이용할 수 있도록 설정해두었기 때문에 user=request.user로 지정하였고, 탈퇴 기능은 사용자에게 전달받는 데이터가 없기 때문에 serializer를 거치지 않고 db에서 바로 user를 삭제해주었다.
추가적으로 회원가입을 담당하는 serializer에서 user.is_active가 빠지면 회원가입 후 가입한 계정으로 로그인 했을 때 로그인이 되지 않는 현상이 발생한다.
이전에 is_active가 접속중을 의미하는 것이라 생각하여 제외하고 로직을 짰더니 회원가입만 되고 로그인이 되지 않았다.
is_active는 접속중을 의미하는 것이 아니라 유저를 활성화 시키는 것을 의미하여 회원가입을 하는 serializer에 꼭 넣어 주어야한다.
is_active를 활용해서 휴면 계정으로 전환하는 기능도 구현해볼 수 있겠다.