Developer 로서의 첫 기업이 끝나갈 무렵, 사수님이 넌지시 과제를 하나 주셨는데,
'이번에 포인트 기능을 추가로 구현 할 생각인데, 모델링부터 로직까지 한번 생각해보라'
하시면서 참고할 자료로 '우아한 형제들 기술 블로그'를 추천하셨다.
우아한 형제들 기술 블로그 : 신규 포인트 시스템 전환기
기술스택부터 화려해 보였다. Java, Spring, AWS Redis, SQS, Jenkins 등..
초보, 비전공자가 시작하기에 어려운 기술 목록에 있던 기술들만 있는 것 같았다.
처음부터 끝까지 찬찬히 읽어 보았지만, 역시나 무슨 소리를 하시는 건지 모르겠더라.
그나마 눈에 들어온 몇 가지 문구만 기록해두고 넘어가겠다.
Roundly(솔직히), 중요한 문구들은 더 많았지만, 기술적인 단어들이 망라되다 보니
읽으면서도 고개를 젓게 되었다. 아무튼, 간단하게라도 코드가 치고 싶어져서 바로 vscode 를 켰다.
models.py
class User(models.Model):
name = models.CharField(max_length=50)
class Point(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
point = models.BigIntegerField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class PointInfo(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
point_log = models.CharField(max_length=50)
status = models.CharField(max_length=50)
description = models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
초간단 모델 3가지와,
class UserViewSet(ModelViewSet):
permission_classes = [AllowAny]
serializer_class = UserSerializer
queryset = User.objects.all()
class PointViewSet(ModelViewSet):
permission_classes = [AllowAny]
serializer_class = PointSerializer
queryset = Point.objects.all()
class PointInfoViewSet(ModelViewSet):
permission_classes = [AllowAny]
serializer_class = PointInfoSerializer
queryset = PointInfo.objects.all()
초초간단 ModelViewSet,
class UserSerializer(serializers.ModelSerializer):
point = serializers.SerializerMethodField()
class Meta:
model = User
fields = '__all__'
def get_point(self, obj):
return Point.objects.filter(user_id=obj).values('point')
class PointSerializer(serializers.ModelSerializer):
class Meta:
model = Point
fields = '__all__'
class PointInfoSerializer(serializers.ModelSerializer):
class Meta:
model = PointInfo
fields = '__all__'
기본 그 자체의 serializer 까지 만드는데에 20분도 안걸렸지 싶다. 거의 모든 것이 고려되지 않고
CRUD의 기능만 가진 베이스 코드이기에 가능한 부분이다. 이제 여기에 살을 좀 붙여볼 차례.
User 를 조회하면 해당 User가 가진 Point 도 같이 나와야 한다.
point = serializers.SerializerMethodField()
def get_point(self, obj):
return Point.objects.filter(user_id=obj).values('point')
User Serializer 에 이 로직을 추가하면 된다. 잊지말고 url 도 미리 추가해 주자.
router = DefaultRouter()
router.register('users', UserViewSet, basename='users')
router.register('points', PointViewSet, basename='points')
router.register('pointinfo', PointInfoViewSet, basename='pointinfo')
Factorials(계승, 상속)의 개념이 난무하는 DRF에서 추가 기능을 구현하고 싶다면
view or serializer 중 한 곳에 로직을 추가 하면 된다. 혹은 Service Layer를 구성해서
따로 관리하는 것도 가능하다.
참고 블로그
serializer 는 validation 이 목적인 클래스이기때문에 일반적으로 비지니스 로직과 혼합되어 있는 것은
그리 보기 좋은 코드가 아니라고 할 수 있겠다. 그렇지만 view 에만 로직을 몰빵한다면 view가
지저분해지고 유지보수에도 불편하다는 단점이 존재한다. '사람이 보기 편하고 누구나 보아도 편한 코드'를
지향하는 것이 내가 바라는 개발자의 덕목 중 하나인만큼, 어느 방법을 쓸 것인지는 앞으로 많은 경험을 통해
체득 해 나갈 것이다.
다음으로 생각해볼 기능은 포인트의 '유효기간 에 대한 로직'이다.
기업 협업에 대한 포스팅은 다음 편이 마지막입니다. 추가로 구현 될 기능들은
github에 올려두고 지속적으로 업데이트 할 예정입니다. 감사합니다.