팀 프로젝트를 오늘 발제를 하고 맡은 역할인 프로필 수정을 구현하는 과정에서 레퍼런스의 프로필 페이지가
이러한 형태로 생겼는데 소개와 패스워드 변경이 같이 수정이 되는 로직이였다.
그래서 이를 구현하는데 패스워드는 바꿀 패스워드와 패스워드 확인이 존재하는데 데이터 입력의 경우는
- 소개 데이터만 보내는 경우
- 패스워드, 패스워드 확인 데이터만 보내는 경우(패스워드와 패스워드 확인은 같아야 함)
- 소개, 패스워드, 패스워드 확인 데이터를 보내는 경우(패스워드와 패스워드 확인은 같아야 함)
이렇게 나눠지는데 이를 한 로직에서 처리하기 위해 처음에는 막연하게 transaction을 사용하면 될 줄 알고 구현을 했는데 잘 동작하지 않았다.
당연하게도 transaction은 DB에 데이터를 저장할 때 오류가 생길 경우 rollback을 하는데 패스워드의 경우 암호화를 하지 않아도 평문으로 데이터가 들어갈 수 있는데 이를 암호화를 하지 않았다고 rollback을 하면 되지 않을까라는 안일한 생각을 했다.
해결방법으로는 로직의 시작에서 패스워드와 패스워드 확인 데이터 유무를 판단하고 두 값이 다르다면 그에 맞는 응답을 반환하는 것으로 소개, 패스워드 수정을 구현했다.
def put(self, request, username):
password = request.data.get('password')
password2 = request.data.get('password2')
if (password or password2) and (password!=password2):
return Response({'error':"password or password2 not exist or password is not equal"}, status=status.HTTP_400_BAD_REQUEST)
user = self.get_object(username)
serializer = UserUpdateSerializer(user, data=request.data, partial=True)
if serializer.is_valid():
user = serializer.save()
if password:
user.set_password(password)
user.save()
serializer = UserDetailSerializer(user)
return Response(serializer.data, status=status.HTTP_200_OK)