Django Rest Framework: 사용자 레코드 매핑 가이드
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

Django Rest Framework에서 사용자에게 레코드 매핑하기

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • 대상자: Django Rest Framework(DRF)를 사용하는 백엔드 개발자
  • 난이도: 중급(사용자 권한 관리 및 쿼리셋 필터링 기초 지식 필요)

핵심 요약

  • ForeignKey 사용: User 모델과 연결하여 레코드 소유자를 명확히 정의 (models.ForeignKey(User, on_delete=models.CASCADE))
  • 쿼리셋 필터링: self.request.user를 사용해 사용자별 데이터 접근 제한 (return Task.objects.filter(user=self.request.user))
  • 권한 처리 강화: IsAuthenticated 및 커스텀 권한(IsOwnerOrReadOnly) 적용으로 보안 강화

섹션별 세부 요약

1. 문제 정의: 사용자 데이터 유출 방지

  • 기본 설정의 위험성: 인증된 사용자가 모든 레코드에 접근 가능
  • 필요한 해결책:

- 사용자 인증 시 자동으로 레코드 할당

- 사용자별 쿼리셋 필터링

- 비인가 접근 차단

2. 모델 정의: 사용자와 레코드 연결

  • 필수 필드: user 필드를 ForeignKey로 정의 (models.ForeignKey(User, on_delete=models.CASCADE))
  • 예시 코드:

```python

class Task(models.Model):

title = models.CharField(max_length=255)

user = models.ForeignKey(User, on_delete=models.CASCADE)

```

3. 뷰셋 구현: 사용자별 데이터 제한

  • 쿼리셋 필터링: get_queryset() 메서드에서 self.request.user 사용
  • 레코드 생성 시 사용자 할당: perform_create() 메서드에서 serializer.save(user=self.request.user)
  • 코드 예시:

```python

class TaskViewSet(viewsets.ModelViewSet):

def get_queryset(self):

return Task.objects.filter(user=self.request.user)

def perform_create(self, serializer):

serializer.save(user=self.request.user)

```

4. 권한 설정: 보안 강화

  • 기본 권한: IsAuthenticated 적용 (permission_classes = [IsAuthenticated])
  • 고급 권한: IsOwnerOrReadOnly 커스텀 클래스로 소유자만 수정 허용
  • 추가 기능:

- 팀/그룹 기반 접근 제어 구현

- Django 신호(signals)로 자동화 로직 추가

5. 고급 팁: 확장성 및 보안

  • 권한 확장: IsOwnerOrReadOnly 클래스로 작성자만 수정 가능
  • 보안 강화: Django signals로 복잡한 비즈니스 로직 추가
  • 예시:

```python

from rest_framework.permissions import BasePermission

class IsOwnerOrReadOnly(BasePermission):

def has_object_permission(self, request, view, obj):

if request.method in ['GET', 'HEAD', 'OPTIONS']:

return True

return obj.user == request.user

```

결론

  • 핵심 팁: ForeignKey로 사용자 연결, get_queryset()perform_create() 활용, IsAuthenticated 및 커스텀 권한 적용
  • 실무 적용 예시: TaskViewSet에서 사용자별 데이터 필터링 및 생성 시 자동 할당
  • 확장성: 팀 기반 접근 제어, Django signals 활용으로 보안 및 자동화 강화