될때까지

((WnB)) 일반 회원가입, 로그인, 호스트 등록하기 기능 구현 본문

프로젝트/wecode2차 : WnB

((WnB)) 일반 회원가입, 로그인, 호스트 등록하기 기능 구현

랖니 2022. 10. 20. 14:59
728x90

# 일반 회원가입

1. 기존의 서비스는 카카오 소셜 로그인만 가능했다.
DB의 users 테이블에서 kakao_id, kakao_profile_img 컬럼의 값을 NULL TRUE로 변경해줘야지 회원가입이 가능하다.

# users > models.py 

from decimal        import Decimal
from django.db      import models

from core.models    import TimeStampModel

class User(TimeStampModel):
	...생략...
    kakao_id            = models.BigIntegerField(unique=True, null=True)
    kakao_profile_img   = models.CharField(max_length = 500, null=True)
    ...생략...

    class Meta:
        db_table = 'users'

2. migrations파일을 만들고 DB에 변경사항을 적용한다.

python manage.py makemigrations
python manage.py migrate

3. MySQL Workbench에서 users테이블을 확인한다.
컬럼(kakao_id와 kakao_profile_img) 설정값이 null true로 변경된 걸 확인할 수 있다.

4. 유저의 first_name, last_name, phone_number, email은 필수로 입력받는다.
회원가입에 성공하려면 아래의 조건을 통과해야한다.

  • 키에러
  • 이름, 연락처, 이메일 유효성검사
  • 이메일 중복 검사
  • 연락처 중복 검사
  • 모두 통과하면 201 생성
class SignUpView(View):
    def post(self, request):        
        try :
            data         = json.loads(request.body)

            first_name   = data['first_name']
            last_name    = data['last_name']
            phone_number = data['phone_number']
            email        = data['email']
            
            check_first_name(first_name)
            check_last_name(last_name)
            check_phone_number(phone_number)
            check_email(email)
            
            email_exist_user = User.objects.filter(email=email)
            
            if email_exist_user:
                return JsonResponse({'message':'EMAIL_ALREADY_EXIST'}, status=409)
            
            phone_exist_user = User.objects.filter(phone_number=phone_number) 

            if phone_exist_user:
                return JsonResponse({'message':'PHONE_ALREADY_EXIST'}, status=409)
            
            User.objects.create(
                first_name          = first_name, 
                last_name           = last_name,
                email               = email,
                phone_number        = phone_number
            )
            
            return JsonResponse({'message':'USER_CREATED'}, status=201)
        
        except KeyError:
            return JsonResponse({'message':'KEY_ERROR'}, status=400)
        except ValidationError as e:
            return JsonResponse({'message': f'{e}'}, status=400)

그래도 두달만에 시작한 파이썬인데 많이 해봤던 회원가입이라 금방 구현했다.

여기서 주의해야할 점은 get vs filter의 차이다. get을 사용하고 싶었지만.. 아래 이유 때문에 filter를 사용해서 구현했다.

  • get : 일치하는 객체가 없으면 DoesNotExistError을 일으킨다.
  • filter : 일치하는 객체가 없으면 빈 쿼리셋을 반환한다.

 

# 로그인

로그인을 하려면.. 비밀번호가 필요한데 User테이블에 비밀번호가 없다!

  1. 유저 모델에 password 컬럼 생성
  2. 회원가입 시 password도 입력받기
  3. password 유효성 검사
  4. password 암호화
  5. 회원가입 성공

회원가입 로직을 위처럼 변경하고, 로그인 기능을 구현했다.

  1. 이메일과 비밀번호 입력받기
  2. 이메일 불일치 => DoesNotExistError 반환
  3. 비밀번호 불일치 => 401 에러 반환
  4. 로그인 성공
  5. 토큰 발급

로그인 기능 구현할 때 비밀번호가 일치하지 않으면 401 상태코드를 사용했다.

  • 401 Unauthorized : 인증되지 않았다.
  • 403 Forbidden : 권한이 없다.

그리고 이제까지는 return값으로 메세지와 유저정보를 같이 보내줬는데, data라는 이름으로 데이터들을 한번 더 감싸줬다.
리턴메세지가 훨씬 깨끗해졌다 👍.

return JsonResponse({'message':'LOGIN_SUCCESS', 'data':{'USER_NAME':f'{email_exist_user.last_name}{email_exist_user.first_name}', 'TOKEN':token}}, status=200)

 

# 호스트 등록하기

  1. 로그인 한 유저만 호스트로 등록할 수 있다. => 데코레이터 사용
  2. 이미 호스트로 등록된 유저인지 여부를 확인하기 위해 get_or_create를 사용한다.
  3. 이미 호스트로 등록된 유저라면 409 반환
  4. 새로운 유저라면 201 반환
  • get_or_create : 객체와 생성여부(boolean)를 튜플로 반환한다.
        host_already_exist, is_created = Host.objects.get_or_create(
            user_id = user.id
        )

 

 

이제 저번 프로젝트때 대충 따라했던 호스트 집 등록하기 기능을 구현해보자!

728x90