💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    25 ModelSerializer 필드 구성 & Redis 캐싱 처리 | ✅ 편저: 코담 운영자

    25-ModelSerializer 필드 구성 & Redis 캐싱 처리

    - ModelSerializer 필드 구성 & Redis 캐싱 처리

    🔗 소스 1: bugbytes-io/drf-course-api

    🔗 소스 2: braverokmc79/Django_REST_Framework_Series


    1. 개요

    이번 강의에서는 Django REST Framework(DRF)에서 ModelSerializer의 fields 구성 방식을 비교하고, Redis를 활용한 API 캐싱 처리를 소개합니다. 실무에서 필드 구성 방식을 잘못 사용하면 보안 및 성능에 문제가 생길 수 있으므로 주의가 필요합니다.


    2. ModelSerializer에서 필드 구성 방식

    1) 명시적으로 fields 지정 (권장 방식)

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('username', 'email', 'is_staff')
    
    • 필요한 필드만 선택적으로 반환
    • 가장 명확하고 안전한 방식

    2) fields = '__all__' 사용 (비추천)

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = '__all__'
    
    • 모델의 모든 필드를 자동 포함
    • 단점:
      • password, permissions 등 민감한 정보까지 포함될 수 있음
      • 모델에 새로운 필드가 추가되면 자동으로 노출됨
      • 프론트엔드에 불필요한 필드까지 포함되어 응답 크기 증가

    3) exclude 사용 (비추천)

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            exclude = ('password', 'user_permissions')
    
    • 제외할 필드를 지정하는 방식
    • 단점:
      • 새 필드가 추가되어도 자동 포함됨
      • 속성 또는 커스텀 메서드 필드를 지정할 수 없음

    4) 속성 및 커스텀 메서드 활용 (명시적 fields 방식에서만 가능)

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('username', 'get_full_name', 'is_authenticated')
    
    • get_full_name, is_authenticated 등 모델 메서드/속성 포함 가능
    • fields = '__all__' 또는 exclude 사용 시 오류 발생함
    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('username', 'orders')  # orders는 Order 모델에서의 related_name
    
    • 외래키로 연결된 객체도 포함 가능
    • 필요 시 nested serializer로 확장 가능

    related_name='orders' 로 관계 설정을 해야 UserSerializer 의 fields 에 orders 사용할 수 있음

    class Order(models.Model):
    		...
    	user = models.ForeignKey(User, on_delete=models.CASCADE , related_name='orders')
    	...
    

    7) api/views.py 추가

    api/views.py

    
    class UserListView(generics.ListAPIView):
        queryset = User.objects.all()
        serializer_class = UserSerializer
        pagination_class = None
        
    

    8) api/urls.py 추가

     path('users/', views.UserListView.as_view()),
    

    3. 실무 예외 상황

    • 실무에서는 fields='all'을 사용한 프로젝트도 존재
    • password 해시가 API 응답에 포함되거나, 민감한 사용자 권한 데이터가 노출되는 사례 있음
    • 필드는 반드시 명시적으로 선언할 것

    4. 캐싱 처리 소개 (Redis)

    다음 강의에서는 Redis를 활용해 특정 API 응답을 캐싱하여 성능을 높이는 방법을 다룹니다.

    • 불변 데이터 또는 자주 요청되는 데이터를 Redis에 저장
    • DRF에서는 @cache_page 또는 django-redis 모듈과 함께 사용 가능
    from django.views.decorators.cache import cache_page
    
    @method_decorator(cache_page(60 * 5), name='dispatch')
    class ProductListView(ListAPIView):
        queryset = Product.objects.all()
        serializer_class = ProductSerializer
    
    • 위 코드는 5분 동안 응답 결과를 캐싱함

    5. 요약

    • ModelSerializer의 필드는 명시적으로 정의하는 것이 보안과 유지보수에 가장 안전
    • __all__ 또는 exclude 사용은 예기치 않은 필드 노출 위험
    • 커스텀 속성, 메서드, 역참조 필드를 포함하려면 fields에 명시 필요
    • 다음 강의에서는 Redis 기반의 캐시 적용으로 API 성능 최적화를 구현합니다
    TOP
    preload preload