get_object_or_404 메서드란?

메서드 사용
def get_object(self, pk, user):
return get_object_or_404(Diary, id=pk, user=user)
def get(self, request, pk):
diary = self.get_object(pk, request.user)
serializer = DiarySerializer(diary)
return Response(serializer.data)
메서드 사용 안할 때
def get(self, request, pk):
try:
diary = Diary.objects.get(id=pk, user=request.user)
serializer = DiarySerializer(diary)
return Response(serializer.data)
except Diary.DoesNotExist:
return Response({"error": "다이어리를 찾을 수 없습니다."},status=404)
get_object 메서드는 특정 조건에 맞는 Diary(모델) 객체를 가져오거나
해당 객체가 없을 경우 자동으로 404 Not found 응답을 반환하는 역할을 한다.
Diary.objects.get대신get_object_or_404를 사용한다.객체를 찾지 못할 경우
get_object_or_404는Diary.DoesNotExist예외를 처리하고
클라이언트에 404 상태 코드를 자동으로 반환한다.해당 메서드를 사용하면 여러 곳에서 객체를 가져올 때 공통 로직으로 재사용 가능하고, 코드 중복을 줄일 수 있다.
Django의 get_object_or_404의 작동 방식
객체를 찾은 경우 : 해당 객체를 반환
객체를 찾을 수 없는 경우 : 404 예외를 발생시키고, 클라이언트에 404 응답 반환
def get_object(self, pk, user) 를 가져올 때 왜 user 인자를 사용하는가?
user 인자는 인증된 사용자가 자신의 다이어리에만 접근하도록 제한하기 위해 사용
→ Diary 모델에는 작성자를 나타내는 user 필드가 있는데, 이를 이용해 요청을 보낸 사용자가 해당 다이어리의 소유자인지 확인한다. 요청자가 자신의 다이어리가 아닌 곳에 접근하면 이를 차단하기 위해 사용한다.
→ user 인자를 사용하지 않으면 다른 사용자의 다이어리에 접근할 가능성이 생긴다.
다이어리를 찾을 수 없습니다와 같은 커스텀 메세지를 추가하고 싶으면,
- try-except를 처리해 원하는 메세지 반환 가능
from django.http import Http404
class DiaryDetailAPIView(APIView):
permission_classes = [IsAuthenticated]
def get_object(self, pk, user):
try:
return Diary.objects.get(id=pk, user=user)
except Diary.DoesNotExist:
raise Http404("다이어리를 찾을 수 없습니다.")
- http404에 포함 가능
from django.shortcuts import get_object_or_404
from django.http import Http404
class DiaryDetailAPIView(APIView):
permission_classes = [IsAuthenticated]
def get_object(self, pk, user):
try:
return get_object_or_404(Diary, id=pk, user=user)
except Http404:
raise Http404("다이어리를 찾을 수 없습니다.")



