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

제갈창민·2021년 12월 29일
1

기업협업[퀀텀AI]

목록 보기
2/18

오늘도 달려보자 언젠간 bottom to top

[ Clover, La Vida Loca 중에서 ]

D

Django 의 화려한 본 모습을 목격한 다음날 부터 본격적으로 DRF에 대한 공부가 시작되었다. 사수님이 본인 계정으로 DRF 온라인 강의를 수강해주셔서 DRF공식문서와 함께 병행하며 튜토리얼 뽀개기를 시작했다. 그리고 앞으로 백엔드가 하게 될 업무에 대해서도 설명을 들었는데, 현재 개발중인 프로젝트에서 관리자(admin page)와 유저(User page)가 있는데 관리자 페이지는 만들어진 코드가 거의 없어서 처음부터 손대야하는 상황이고 유저 페이지는 베타 서비스 중이라 히스토리는 있지만 버그가 많다고 했다. 사수 두 분과 논의 끝에 나는 관리자 페이지를 맡게 되었다

R

알아듣기 힘든 인도 강사의 발음, 더 알아보기 힘든 구글번역기와 사투를 해야 했지만, 강의 내용과 공식문서의 튜토리얼이 워낙 잘 되어 있어서 어렵지만 조금씩 눈에 들어오기 시작했다. 그리고 기업협업간 벨로그는 일기&TIL 형태로 작성 해 나갈 계획이다.

F

free 한 사무실 분위기는 다소 적막했지만 특별한 제약사항들이 없어서 집중하기에도 좋고, 원할때 마음대로 쉬어도 되어서 상당히 좋았다. 미국 회사 생활을 해본 나로써 그닥 다를 바 없는 분위기였다. 위워크에서 최상의 업무환경을 영위하다가 갑자기 이런 공간에 오게 되면 당황하거나 적응이 힘든 분들이 많은데, 그냥 내 입장에선 어리광이지 않나 싶을 뿐이다. 타고난 금수저 아니고서야 시설, 설비, 장비 풀세팅 된 공간에서 받고 싶은만큼 받아가며 근무한다? 그런건 영화고 드라마고 소설이며 공상이다. 현실비하가 아닌 실제를 직시하고 인정하는 것이 내가 배운 첫 번째 삶의 지혜였다.

TIL

1. Serializers

2가지 타입의 serializer

  • serializers.Serializer
  • serializers.ModelSerializer
    -> .Serializer 보다 ModelSerializer 가 한 단계 더 추상화 된 것.
serializers.py
class SnippetSerializer(serializers.Serializer):
    id 	= serializers.IntegerField(read_only=True)
    title = serializers.CharField(required=False, allow_blank=True, max_length=100)
    code = serializers.CharField(style={'base_template':'textarea.html'})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES)
    style = serializers.ChoiceField(choices=STYLE_CHOICES)

---------------------------------------------------------------------------------
class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ['id', 'title', 'code', 'linenos', 'language', 'style']

※ models.py 의 모델을 직렬화(serializing) 하여 model name과 fields name 을 따로 지정해 줄 수 있고, 기획에 맞게 로직 커스터마이징도 가능하며, 가독성도 높아진다.

2. Function Based vs Class Based View

1) Function Based Views

  • 장점
    • @api_view() 와 같은 D.R.F가 제공하는 decorator를 사용하기 간편하다.
    • 구현이 빠르고 간단하며 읽기 쉽다.
    • 코드가 명시적이고 직관적이다.

  • 단점
    • 코드를 확장하고 재사용하기 어렵다.
    • 조건부 분기를 통한 HTTP 메소드 처리가 불가피 하다.

  • 함수형 뷰 예시
@api_view(['GET', 'POST'])
def movie_list(request):
    if request.method == 'GET':
        movies = Movie.objects.all()
        serializer = MovieSerializer(movies, many=True)
        return Response(serializer.data)

    if request.method == 'POST':
        serializer = MovieSerializer(data=request.data)
        if  serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

2) Class Based Views

  • 장점
    • 확장이 쉽고 코드를 재사용 할 수 있다.
    • mixin(다중상속)과 같은 기술이 사용 가능하다.
    • 별도의 클래스 메소드로 HTTP 메소드 처리가 가능하다.

  • 단점
    • 읽기가 어럽다.
    • 암시적인 코드의 흐름.
    • 부모 클래스의 숨겨진 코드가 존재 할 수 있다(믹스 인).
    • decorator를 사용하려면 추가 가져오기 또는 메소드 재정의가 필요하다.

  • 클래스 뷰에 사용 할 수 있는 다중상속 클래스 뷰들
    • APIView
      • Generic views
      • Mixins
      • Concrete View Classes
      • ViewSets
  • 클래스형 뷰 예시
class MovieListAV(APIView):
    def get(self, request):
        movies = Movie.objects.all()
        serializer = MovieSerializer(movies, many=True)
        return Response(serializer.data)        
    
    def post(self, request):
        serializer = MovieSerializer(data=request.data)
        if  serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

유효성 검사(validator)

  • serializer 를 정의할 때, serializers.Serializer로 상속받게 되면 아래와 같이 유효성 검사에 대한 로직을 정의 해 줘야 한다.
serializers.py
class MovieSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()
    description = serializers.CharField()
    active = serializers.BooleanField()
    
    def create(self, validated_data):
        return Movie.objects.create(**validated_data)
    
    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.description = validated_data.get('description', instance.description)
        instance.active = validated_data.get('active', instance.active)
        instance.save()
        return instance

※ instance 와 validated_data 의 속성
def update(self, instance, validated_data):
 -> instance(old value), validated_data(new value)

  • 하지만 serializers.ModelSerializer로 상속받게 되면 아래와 같이 구현 할 수 있다.
class MovieSerializer(serializers.ModelSerializer):
	(생략)    
    def validators(self):
        return super().validators

DRF 예제실습 블로그

실패해도 좋아 멈추지마 alright.(Please don't ever let you down)

[ Clover, La Vida Loca 중에서 ]

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

0개의 댓글