프로젝트/서평사이트

[고양이와 책을] 비밀번호 변경 ( patch, QuerySet - update )

파뱁 2022. 2. 17. 22:49
728x90

sql에서 update와 연결되는 api는 put과 patch가 있다.

이 둘의 차이를 간단하게 이야기 하자면, update 할때 어디까지 정보를 가져와서 변환하는 가 이다.

put은 데이터 한 열을 통으로 가져와 수정하고, 그 통으로 저장한다면,
patch는 데이터 중 일부 속성을 가져와서 수정하고, 그 일부를 다시 저장한다는 것이 차이다.

 

이번에 구현할 '비밀번호 변경' 기능은 유저 데이터의 비밀번호 데이터만 변경하면 되는 것이라

put 보다는 patch가 적합하다는 판단을 내려 patch로 개발하게 되었다.

 

post, get등과 마찬가지로 클래스를 선언한 후, patch 메소드를 구현했다.

import json
from django.views import View
from django.http import JsonResponse
from .models import User

class ChangePw(View):
    def patch(self, request):
        data = json.loads(request.body)
        newPw = data['newPw']
        userEmail = data['userEmail']
        userPw = data['userPw']
        User(
            userEmail = userEmail,
            userPw = userPw
        )

        if User.objects.filter(userEmail=userEmail, userPw=userPw).exists():
            userData = User.objects.filter(userEmail = userEmail)
            userData.update(userPw=newPw)

            return JsonResponse({"message": "비밀번호가 변경되었습니다."}, 
            	json_dumps_params={'ensure_ascii': False}, status=200)
        else:
            return JsonResponse({"message" : "기존 비밀번호가 올바르지 않습니다."}, 
            	json_dumps_params={'ensure_ascii': False}, status=401)

프론트로 부터 이메일, 기존 비밀번호, 새 비밀번호를 받아온 후

현재 계정의 비밀번호가 맞다면 새 비밀번호로의 변경을 하는 코드로 작성했다.

 

여기서 QuerySet의 update()를 이용해 간단하게 비밀번호 속성 값을 변경해주었다. 

별도의 save() 코드가 필요 없이 바로 업데이트가 적용되는 코드라 용이하다. 

다만 유저 이메일이 단일한 값이 아니었다면 같은 이메일을 가진 데이터의 비밀번호가 모두 변경되었을 것이다.

여기서는 회원가입시 이메일 중복을 확인하기 때문에 논리적으로 문제가 없을 것이라 생각해서 위와 같이 진행했다.

 

그리고 코드를 조금 리팩토링해보았는데, 이전 코드들에서

data['newPw']

이런 식의 코드를 자주 부르는데, 각각을 변수로 지정해서 한번만 할당하는 것이 효율적일 것이라 생각해서 기존의 로그인과 회원가입의 코드도 다 다음과 같은 형식으로 저장한 후에 이용했다.

newPw = data['newPw']

 

또한 이전에 아스키 코드 인코딩이 문제를 일으킨 적이 있었고, 이번에 비밀번호 변경 코드의 message도 인코딩이 깨지는 현상을 발견해 모든 JsonResponse에 아래와 같은 코드를 추가했다.

json_dumps_params={'ensure_ascii': False}

 

원래는 비밀번호 암호화를 하려고 했는데, 잠시 이 기능 개발을 보류하고 클라우드 서버를 구축해서 그 곳에 올리는 작업을 선행하기로 했다.

일단은 GCP에 올릴 예정이긴한데, 조금 조사해보고 결정할 것이다.

(AWS는 진짜 아차 하면 요금이 나와서 일단 다른 것을 이용해보고자 한다.)

728x90
반응형