코인 가상 거래 만들어보기! (2) Account 생성

HEYDAY7·2021년 5월 19일
1

이 프로젝트는 나도 새로운 도전을 하는 것이기에 시행착오와 코드의 번복이 많을 것이다. 따라서 이를 지침서라고 생각하기 보다는, 수난의 과정이라고 생각하면 된다...

프로젝트 시작

Django를 사용해서 프로젝트 셋팅을 한다. 기본 프로젝트 셋팅은 Proj1의 기본 벡엔드 셋팅과 동일하다. 다만 app을 account만 만들고 우선적을 진행한다.

secret key...

이전 프로젝트에서 까먹고 secret key를 git에 바로 올려버렸었다. 사실 개인 프로젝트라 그다지 중요하지는 않지만 잡고 넘어가서 나쁠게 없기에 secret key 부분을 수정하고 간다.
settings.py의 초반부분이다. 원래는 SECRET_KEY 이후에 요상한 문자열이 있을 텐데 이를 감춰주기 위해서 하는 작업이다.
manage.py와 동일한 위치에 secret.json 이라는 파일을 만들고 그 안에 다음과 같이 json 형태로 key를 옮겨주자
그리고 저 위 사진과 같이 코드를 작성해주면 key를 성공적으로 숨기게 된 것이다.
git에 올리게 된다면 꼭 secret.json 파일을 .gitignore안에 집어넣어주자... 그렇지 않으면 무용지물이다.

Account 작성

account app을 먼저 작성한다. django app을 어떻게 해야하는지 모른다면 위로 돌아가 링크된 글을 보고 오자.

models.py

일단 만들려는 서비스는 각자의 계정이 있어야 하고, 그 계정은 자신의 가상 잔고를 가지고 있어야 한다. 그래서 장고에서 기본으로 제공하는 User와 one-to-one으로 대응하는 Account model을 만든다.

# account/model.py

from django.db import models
from django.contrib.auth.models import User


class Account(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    balance = models.PositiveBigIntegerField()

user는 앞서 말했든 one-to-one으로 연결하고, balance는 일단 큰 수가 들어올 수 있으니 PositiveBigIntergerField로 지정했다. 아마 추후에 많은 수정이 있을 수 있는 부분이다 ㅎㅎ

serializers.py

코드가 길다... 우선 UserSerializer와 LoginSerializer는 각각 일전 프로젝트에서 작성했던 방식을 차용했다. 이를 참고하면 된다.
DRF+React로 Blog(유사 velog) 만들어보기 (5) 유저 모델 Serializer, View 만들기 + Urls 연결

from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login
from .models import Account


class UserSerializer(serializers.ModelSerializer):
	confirm = serializers.CharField(max_length=100, write_only=True)
	email = serializers.EmailField(required=True)

	class Meta:
		model = User
		fields = ['id', 'username', 'password', 'email', 'confirm']
	
	def validate(self, data):
		if data['password'] != data['confirm']:
			raise serializers.ValidationError('비밀번호와 비밀번호 확인이 일치하지 않습니다.')
		return data
	
	def create(self, validated_data):
		validated_data.pop('confirm')
		user = User.objects.create(**validated_data)
		user.set_password(validated_data['password'])
		user.save()
		return user

	def update(self, instance, validated_data):
		instance.username = validated_data['username']
		instance.password = validated_data['password']
		instance.email = validated_data['email']
		instance.save()


class LoginSerializer(serializers.Serializer):
	username = serializers.CharField(max_length=100, required=True)
	password = serializers.CharField(max_length=100, required=True)

	def validate(self, data):
		user = authenticate(username=data['username'], password=data['password'])
		if not user:
			raise serializers.ValidationError("아이디 혹은 비밀번호가 잘못되었습니다")
		return data

	def perform_login(self, request):
		user = authenticate(username=request.data['username'], password=request.data['password'])
		login(request, user)
		return user

다음이 account serializer이다. 실상 api를 통해서 조작할 모델은 Account이기 때문에 Account를 create할 때 User 모델도 동시에 만들어 질 수 있도록 serializer를 구성했다. 추후에 Account 모델이 수정되면 이 부분도 충분한 수정이? 있을 것이다.

class AccountSerializer(serializers.Serializer):
	user = UserSerializer(required=True)
	balance = serializers.IntegerField()

	class Meta:
		model = Account
		fiels = ['user', 'balance']

	def validate(self, data):
		user_data = data['user']
		UserSerializer(data=user_data).is_valid(raise_exception=True)
		return data

	def create(self, validated_data):
		user_data = validated_data.pop('user')
		user = UserSerializer.create(UserSerializer(), validated_data=user_data)
		account = Account.objects.create(user=user)

		return account

	def update(self, instance, validated_data):
		user = instance.user
		user_data = validated_data.pop('user')
		user = UserSerializer.update(UserSerializer(), instance=user, validated_data=user_data)
		instance.save()

		return instance

views.py

view는 특별할 게 없다. 설명은 생략한다.

urls.py

account/urls.py를 아래와 같이 간단하게 작성한다. 그리고서 root urls.py에 연결해준다.
이 부분은 별다르게 특별할 게 없다.

next...

다음 글에서는 celery와 redis를 적용하고, 지금까지의 성과를 dockerize해서 깔끔하게 정리할 것이다. 이제부터 시작이다!

profile
(전) Junior Android Developer (현) Backend 이직 준비생

0개의 댓글