될때까지

((WnB)) 8일차 : get_or_created의 defaults 본문

프로젝트/wecode2차 : WnB

((WnB)) 8일차 : get_or_created의 defaults

랖니 2022. 8. 8. 13:48
728x90
class KakaoOauthView(View):
    def get(self, request):
        token = request.META.get('HTTP_AUTHORIZATION')

        KAKAO_URL = 'https://kapi.kakao.com/v2/user/me'
        HEADER    = {'Authorization': token}
        
        user_info = requests.get(KAKAO_URL,headers=HEADER).json()
        
        kakao_id          = user_info['id']
        kakao_profile_img = user_info['kakao_account']['profile']['profile_image_url']
        email             = user_info['kakao_account']['email']
        
        user, created = User.objects.get_or_create(
            kakao_id = kakao_id
        ) 
        
        if created:
            user.kakao_profile_img = kakao_profile_img
            user.email             = email
            user.save()
            
            return JsonResponse({'message':'SIGNUP_SUCCESS'}, status=201)

처음 작성했던 카카오 회원가입/로그인의 로직은 위와 같다. 멘토님의 리뷰가 'get_or_create() defaults 옵션을 이용해보세요!' 라고 달렸다. get_or_create()에 defaults 옵션이 뭘까? 

 

get_or_create 

  • 객체를 검색하는데 해당 객체가 없다면 인스턴스를 생성한다.
  • defaults는 인스턴스가 새로 생성될 때에만 사용되는 옵션이다.
user, created = User.objects.get_or_create(
    'first_name' = '이름',
    'last_name' = '성',
    defaults = {
        'birth_day' : '2022-08-08'
    }
)
  • get_or_create는 (object, created)의 튜플 형태로 반환한다.
  • created에는 생성이면 true가 담기고, 이미 해당 객체가 있다면 false의 불린값을 담아 반환한다.
  • 이름이 이름, 성이 성인 객체가 있다면 user에 해당 객체가 담기고 created는 false가 된다.
  • 이름이 이름, 성이 성인 객체가 없다면 created는 true가 되고 인스턴스가 새로 생성된다.
  • defaults에 적어둔 내용은 인스턴스가 새로 생성될 때에만 생성되기 때문에 이름=이름, 성=성, 생년월일=2022-08-08인 인스턴스가 생성된다.
import requests
import jwt

from django.conf        import settings
from django.http        import JsonResponse
from django.views       import View

from users.models       import User

class KakaoOauthView(View):
    def get(self, request):
        token = request.META.get('HTTP_AUTHORIZATION')

        KAKAO_URL = 'https://kapi.kakao.com/v2/user/me'
        HEADER    = {'Authorization': token}
        
        user_info = requests.get(KAKAO_URL,headers=HEADER).json()
        
        kakao_id          = user_info['id']
        kakao_profile_img = user_info['kakao_account']['profile']['profile_image_url']
        email             = user_info['kakao_account']['email']
        
        # kakao_id가 일치하는 객체가 있다면, user에 해당 객체가 담기고 created는 false가 된다.
        # kakao_id가 일치하는 객체가 없다면, 해당 인스턴스를 생성하고 created는 true가 된다. 
        # defaults는 생성될 때만 사용된다.
        user, created = User.objects.get_or_create(
            kakao_id = kakao_id,
            defaults = {
                'kakao_profile_img': kakao_profile_img,
                'email'            : email
            }
        ) 
    
        # created가 false면 이미 존재한다는 뜻 => 회원가입되어있으므로 => 로그인이다! => not false는 true가 되서 아래 코드들을 실행하고 로그인 성공을 반환한다.
        if not created:
            
            user.kakao_proifile_img = kakao_profile_img
            user.save()
            
            token = jwt.encode({'id':user.id}, settings.SECRET_KEY, settings.ALGORITHM)
            return JsonResponse({'message':'SIGNIN_SUCCESS', 'token':token}, status=200)
    
        return JsonResponse({'message':'SIGNUP_SUCCESS'}, status=201)
728x90