본문 바로가기
장고

[Django/DRF] 장고의 DRF 설계 튜토리얼

by mangji12 2025. 12. 8.

비유: API는 자판기

데이터베이스(DB)를 자판기 내부의 창고라고 생각해 봅시다. 거기엔 음료수도 있지만, 사장님의 돈통(비밀번호)도 있고, 재고 관리 장부(민감 데이터)도 있습니다.

 

우리가 만든 API(GET 요청)는  자판기 버튼입니다. 손님이 버튼을 누른다고 해서 자판기 문이 활짝 열리고 돈통이 쏟아져 나오나요? 아닙니다. 딱 우리가 전시해 둔(허용한) 음료수 하나만 톡 떨어집니다.

 

DRF에서는 이 전시통제를 담당하는 3명의 문지기가 있습니다.


🛡️ 1단계 방어막: Serializer (필드 필터링)

첫 번째 문지기인 Serializer어떤 항목(Column)을 보여줄지 결정합니다.

예를 들어, DB에 User 테이블이 있고 거기에 password와 phone_number가 있다고 가정해 봅시다.

# models.py (DB 실제 모습)
class User(models.Model):
    username = models.CharField(...)
    password = models.CharField(...)      # 🚨 절대 보여주면 안 됨!
    phone_number = models.CharField(...)  # 🚨 개인정보!
    nickname = models.CharField(...)

하지만 Serializer에서 fields를 지정하면, 지정하지 않은 필드는 API 응답에서 아예 증발해 버립니다.

# serializers.py (보여줄 것만 선택)
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        # [핵심] 여기에 적은 것만 나갑니다. 패스워드는 아예 안 보임!
        fields = ['id', 'username', 'nickname']

누군가 API를 호출해도 password 필드는 JSON에 존재하지조차 않습니다. Serializer가 중간에서 잘라버렸기 때문이죠.

Tip: 입력받을 땐 필요하지만 보여줄 땐 숨겨야 하는 필드(예: 비밀번호 생성)는 extra_kwargs = {'password': {'write_only': True}} 옵션을 쓰면 됩니다.


🛡️ 2단계 방어막: View & QuerySet (행 필터링)

Serializer가 가로(컬럼)를 막았다면, 두 번째 문지기인 View세로(행, Row) 데이터를 거릅니다. DB에 데이터가 100만 개가 있어도, 개발자가 쿼리셋(QuerySet)으로 조건을 걸면 그 조건에 맞는 데이터만 나갑니다.

 

예를 들어, 삭제된 글이나 작성 중인 글을 숨기고 싶다면?

# views.py
class ReportViewSet(viewsets.ModelViewSet):
    serializer_class = ReportSerializer

    def get_queryset(self):
        # [핵심] DB를 다 털어주는 게 아니라, status가 'published'인 것만 가져옵니다.
        return QualityReport.objects.filter(status='published')

이제 해커가 아무리 요청을 보내도 status='draft'인 비밀 글은 절대 조회되지 않습니다.


🛡️ 3단계 방어막: Permissions (접근 권한)

마지막 문지기는 아예 출입증을 검사합니다. 로그인하지 않은 사용자가 URL을 알아내서 요청을 보내도, 문전박대할 수 있습니다.

# views.py
from rest_framework.permissions import IsAuthenticated

class UserInfoViewSet(viewsets.ModelViewSet):
    # [핵심] 로그인한 사람(Token 보유자)만 통과
    permission_classes = [IsAuthenticated]

이 코드가 있으면 인증 토큰이 없는 요청은 즉시 401 Unauthorized 에러를 뱉으며 차단됩니다.


📝 결론

Django REST Framework는 기본적으로 개발자가 명시하지 않은 것은 보여주지 않는다는 철학을 가지고 있습니다.

  1. Serializer로 보여줄 항목을 고르고,
  2. View(get_queryset)로 보여줄 데이터를 거르고,
  3. Permission으로 볼 수 있는 사람을 정합니다.
반응형