[기업협업] 퀀텀AI -Day 24-

제갈창민·2022년 1월 19일
0

기업협업[퀀텀AI]

목록 보기
17/18

D

Developer 로서의 첫 기업이 끝나갈 무렵, 사수님이 넌지시 과제를 하나 주셨는데,
'이번에 포인트 기능을 추가로 구현 할 생각인데, 모델링부터 로직까지 한번 생각해보라'
하시면서 참고할 자료로 '우아한 형제들 기술 블로그'를 추천하셨다.

우아한 형제들 기술 블로그 : 신규 포인트 시스템 전환기

기술스택부터 화려해 보였다. Java, Spring, AWS Redis, SQS, Jenkins 등..
초보, 비전공자가 시작하기에 어려운 기술 목록에 있던 기술들만 있는 것 같았다.
처음부터 끝까지 찬찬히 읽어 보았지만, 역시나 무슨 소리를 하시는 건지 모르겠더라.
그나마 눈에 들어온 몇 가지 문구만 기록해두고 넘어가겠다.

  • 이번 포인트 시스템의 아키텍처 기조는 DB가 죽어도 문제 없는 서비스였습니다.
  • 테스트 코드를 굉장히 빡빡하게 작성하였습니다. (말만 들어도 겁남)
  • 특히 HTTP API 테스트를 코드로 남긴다는 점이 중요합니다. Postman을 선택할 이유가 하나도 없었습니다.
  • API 문서 자동화 : 수동으로 작성하는 것은 언젠간 코드와 문서간에 간격이 발생
  • 테스트 코드를 작성하면 문서로 자동 완성(Spring Rest Docs 선택)
  • 단일 브랜치 전략을 선택했습니다. master 브랜치만 유지하고 모든 커밋을 master에만 하였습니다.

R

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')

F

Factorials(계승, 상속)의 개념이 난무하는 DRF에서 추가 기능을 구현하고 싶다면
view or serializer 중 한 곳에 로직을 추가 하면 된다. 혹은 Service Layer를 구성해서
따로 관리하는 것도 가능하다.
참고 블로그
serializer 는 validation 이 목적인 클래스이기때문에 일반적으로 비지니스 로직과 혼합되어 있는 것은
그리 보기 좋은 코드가 아니라고 할 수 있겠다. 그렇지만 view 에만 로직을 몰빵한다면 view가
지저분해지고 유지보수에도 불편하다는 단점이 존재한다. '사람이 보기 편하고 누구나 보아도 편한 코드'를
지향하는 것이 내가 바라는 개발자의 덕목 중 하나인만큼, 어느 방법을 쓸 것인지는 앞으로 많은 경험을 통해
체득 해 나갈 것이다.

다음으로 생각해볼 기능은 포인트의 '유효기간 에 대한 로직'이다.

Point 기능 구현 repo

기업 협업에 대한 포스팅은 다음 편이 마지막입니다. 추가로 구현 될 기능들은
github에 올려두고 지속적으로 업데이트 할 예정입니다. 감사합니다.

profile
자기계발 중인 신입 개발자

0개의 댓글