프로젝트/서평사이트

[고양이와 책을] 로그인과 회원가입 기능 구현

파뱁 2022. 1. 25. 20:25
728x90

코드 자체를 짠지는 좀 시간이 지났지만, 이를 프론트(리액트) 단과의 연결이 성공적인지 등을 확인하느라 업로드가 늦어졌다. (사실 지금도 코드가 완벽하진 않다.)

 

일반적으로 장고로 백엔드를 구현할 때는 REST Framework를 이용해 구현하는 것이 일반적이다. 그러나 나는 기본적인 REST API를 직접 구현해보고자 하여 이를 이용하지 않고 진행해보았다. 

(추후에 이를 이용하는 코드로 변경할 수도 있다.)

 

기본적인 장고 환경구성이 완료된 후, 회원가입과 로그인 기능을 구현할 user앱을 만들었다. 

그리고 앞으로 이 앱에서 사용할 URL을 /user 하단에 넣기 위해

config 폴더 안의 urls.py 파일을 다음과 같이 작성했다.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', include('user.urls')),
]

 

이후 user 앱 내의 urls.py에도 다음과 같이 작성했다.

from django.urls import path

from . import views
from .views import CreateView, LoginView

urlpatterns = [
    path('create', CreateView.as_view()),
    path('login', LoginView.as_view()),
]

이로서 회원가입은 /user/create, 로그인은 /user/login 의 url을 가지게 되었다.

 

우리의 서비스에는 사용자의 이름, 사용자의 이메일, 사용자의 비밀번호를 필요로 하기 때문에, User 모델을 다음과 같이 작성했다.

from django.db import models

class User(models.Model):
    userName = models.CharField(max_length = 20)
    userEmail = models.EmailField(max_length = 30)
    userPw = models.CharField(max_length = 20)

    class Meta:
        db_table = 'users'

이로서 모델설정과 url 설정이 끝났다. 

이제는 views.py에 로그인과 회원가입을 위한 post 코드를 작성해줄 것이다.

import json

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

from .models import User

class CreateView(View):
    def post(self, request):
        data = json.loads(request.body)
        User(
            userName = data['userName'],
            userEmail = data['userEmail'],
            userPw = data['userPw'],
        )

        if User.objects.filter(userEmail = data['userEmail']).exists() == True:
            return JsonResponse({"message" : "이미 존재하는 이메일입니다."}, status = 401)

        else:
            User.objects.create(userEmail = data['userEmail'], userName = data['userName'], userPw = data['userPw'])
            return JsonResponse({"message" : "회원으로 가입되셨습니다."}, status = 200)

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

        if User.objects.filter(userEmail = data['userEmail'],  
        		userPw = data['userPw']).exists() == True :
            return JsonResponse({"message": "로그인에 성공하셨습니다."}, status = 200)
        else:
            return JsonResponse({"message" : "아이디나 비밀번호가 일치하지 않습니다."}, status = 401)

우선 회원가입은 성공했는데, 로그인 코드를 리액트에 연결했을 때 500 에러가 나온다고 해서 이 부분을 보완할 예정이다.

알고 보니 프론트에서 주지도 않는 userName 값을 받도록 잘못 써서 생긴 문제와, 리액트에서 문법적 오류가 같이 생긴 문제 였다. 이 부분 해결하니, 일단 작동은 되고 있다.

 


또한 현재는 비밀번호 해시암호화를 진행하지 않았는데, 이 부분도 보완할 예정이다.

(+ 이에 앞서서 한글 정보 인코딩에러가 있어서 이부분을 진행한 후 로그인 코드의 응답에 사용자 id, name, email 을 실어서 보낼수 있도록 수정하는 작업을 먼저 하려고 한다.)

 

코드를 짜면서 직접 부딫혀가며 이제야 조금씩 장고의 동작 원리가 익혀지는 기분이다.

아직 갈길이 멀긴 하나 일단 작은 성취라도 이뤄 기쁘다.

728x90
반응형