📘 DRF - 회원 가입 

  1. pip install
  2. Django 시작하기
  3. Github에 Pull request 후 Push 완료하기
  4. 회원 가입 구현하기
    1. models.py
    2. admin.py
    3. urls.py
    4. serializers.py
    5. views.py
  5. 서버 및 오류들 한국어로 설정하기

‼️ 본문의 모든 내용을 포함한 목차는 아니에요


✨ Branch 생성하고 Checkout✨

# branch 생성하기
$ git branch <branch name>
# branch 위치로 가기
$ git checkout <branch name>

 

이 상태에서 작업해 주세요!

🔝


⚙️ pip install 하기

DRF를 하기 위해 pip install List

# Django 설치하기
$ pip install django
# Django rest framework 설치하기
$ pip install djangorestframework
# Json Web Token 구현하기
$ pip install djangorestframework-simplejwt

 

↓ Django REST framework simple JWT?

https://bmk0703.tistory.com/236

더보기
Django REST framework simple JWT??
🧩 JWT(JSON Web Token)
→ 웹 표준으로, 당사자 간에 안전하게 정보를 JSON 객체로 전송하는 방법
→ 인증과 권한 부여에 널리 사용됨
→ 서버는 JWT를 생성하여 클라이언트에게 전달하고, 클라이언트는 이후 요청 시, JWT를 포함하여 서버에 사용자 인증을 수행

🧩 djangorestframework-simplejwt
→ DRF 환경에서 JWT를 사용하여 인증 시스템을 구축하는 과정을 간소화해 주는 패키지

 

필요한 pip를 모두 설치해 주었으면, 

# pip 목록 저장하기
$ pip freeze > requirements.txt

 

이렇게 남겨주어야 나중에 다른 분들이

# requirements.txt 목록 설치하기
$ pip install -r requirements.txt

 

를 통해서 쉽게 같은 pip list를 가지게 할 수 있어요!

🔝


⚙️ Django 시작하기

저는 Backend라는 폴더를 따로 만들어서 깔끔하게 관리했어요

# Django 시작
$ django-admin startproject <project name> .
# 회원 기능 구현을 위해 accounts app 만들기
$ python manage.py startapp accounts

 

settings.py 설정

더보기
 APP 등록
# settings.py에 app 등록하기
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    # RESTful한 API를 지원해주는 framework
    'rest_framework',
    
    # Created App List
    'accounts', # 회원 기능 app
]

 

SECRET_KEY 숨기기

 

REST Framework 추가하기
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

🔝


⚙️ Github에 Pull request 후 Push 완료하기

 

초기 Django 설정을 다 끝냈으면,

github에 Pull Request 해주었어요!

내용도 상세히 적어서 올렸어요. 그래야 다른 팀원분이 보더라도 이해가 쉬워지겠죠?

 

 

push 완료!

🔝


⚙️ 회원 가입 구현하기

 

프로젝트의 SA 문서 중에서 ERD에 명시해 둔 대로 만들어줄 거예요!


사람마다 구현하는 순서가 다르긴 해요!

얼마든지 취향껏 진행해 주시면 돼요

 

저는 주로, 이 순서로 구현을 해요!

# 저의 DRF 구현 순서
models.py -> urls.py -> serializers.py -> views.py 

🌵  1. accounts/models.py

더보기
from django.db import models
from django.contrib.auth.models import AbstractUser

# 기본 user 모델
class User(AbstractUser):
    # 원하는 필드 추가하기
    nickname = models.CharField(max_length=30, blank=True)
    
    # 객체의 문자열 표현 정리 : User를 view에서 쓸 때 username이 return 됨, username말고 다른 거 해도 됨
    def __str__(self):
        return self.username
    
    class Meta:
        verbose_name = "사용자" # 관리자 페이지에서 보여지는 단수 이름
        verbose_name_plural = "사용자 목록" # 관리자 페이지에서 보여지는 복수 이름

 

기본적으로 Django에서는 AbstractUser를 제공해 줘서 쉽게 회원 가입을 구현할 수 있어요

 

기존 User 모델 필드

https://docs.djangoproject.com/en/4.1/ref/contrib/auth/

필드명 타입 설명 필수 여부
username 문자열 로그인 시, 입력할 ID
중복 불허
O
first_name 문자열 이름 X
last_name 문자열 X
email 문자열 이메일 X
password 문자열 비밀번호 O

 

🌵 1.1. settings.py에 AUTH_USER_MODEL 선언하기

더보기
# user 모델 선언
AUTH_USER_MODEL = "accounts.User"

🌵 1.2. migrate 하기

더보기
$ python manage.py makemigrations
$ python manage.py migrate

🔝


🌵 2. admin.py에 모델 등록하기

더보기
from django.contrib import admin
from .models import User

# 관리자 페이지에 등록
admin.site.register(User)

🔝


🌵 3. urls.py

url도 API 명세서에 명시해 둔 대로 설정할게요!

더보기
main/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/account/', include('accounts.urls')), # accounts의 url 불러 쓰기
]

 

accounts/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('signup/', views.SignUpView.as_view(), name="signup"), # 회원 가입
]

🔝


🌵 4. accounts/serializers.py

더보기
from rest_framework import serializers
from django.contrib.auth import get_user_model

# settings.py에 선언했던 AUTH_USER_MODEL 데려옴
# accounts/models.py.User
User = get_user_model()

# 회원 가입 serializer
class UserSignUpSerializer(serializers.ModelSerializer):
    # 비밀번호 재확인
    # write_only=True : 필수 요소
    password2 = serializers.CharField(write_only=True)
    
    class Meta:
        model = User
        fields = ('username','nickname', 'password', 'password2')
        extra_kwargs = {'password': {'write_only': True}}
        
    def validate(self, attrs):
        # 첫 번째로 입력한 비번이랑 두 번째 입력한 비번이 다르면
        if attrs['password'] != attrs['password2']:
            # 비밀번호가 일치하지 않다는 메시지가 뜨게끔 만들기
            raise serializers.ValidationError("비밀번호가 일치하지 않습니다.")
        return attrs
    
    def create(self, validated_data):
        
        # validated_data에서 'password2' 키를 제거
        # 'password2'는 비밀번호 확인을 위해 사용되는 필드이기 때문에 저장 안 해도 됨
        validated_data.pop('password2')
        
        # validated_data에서 'password' 키를 제거하고, 그 값을 password 변수에 저장
        # 'password'는 사용자가 입력한 비밀번호이며, 이 값을 사용하여 사용자 객체의 비밀번호를 해싱(암호화)해야 합니다.
        password = validated_data.pop('password')
        
        # validated_data에 남아있는 데이터를 사용하여 User 객체를 생성
        # User 객체는 비밀번호를 제외한 사용자 정보(예: username, email)를 포함
        user = User(**validated_data)
        
        # 사용자 객체의 비밀번호를 설정합니다.
        # set_password() 메서드는 비밀번호를 해싱하고, 해싱된 비밀번호를 사용자 객체에 저장
        user.set_password(password)
        user.save()
        return user

🔝


🌵 5. accounts/views.py

🔗 Generics??

🔗 serializer_class?

더보기
from rest_framework import generics
from .serializers import UserSignUpSerializer
from django.contrib.auth import get_user_model

User = get_user_model()
# 회원 가입 view
class SignUpView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSignUpSerializer

 

  • queryset = User.objects.all()
    • 필수사항은 아니라서 굳이 적지 않아도 돼요!

🔝


🌵 python manage.py runserver

 

DB에 잘 저장됐네요 👍🏻

🔝


⚙️ 서버 및 오류들 한국어로 설정하기

settings.py

🔝


⚙️ Github에 Pull request 및 merge 하기

🔝

🐾Recent posts