Django 프론트& 백엔드 개발

Django에서 서버 에러 대신 404로 응답하기: get_object_or_404 사용 이유

Data Jun 2026. 1. 13. 22:48

Django에서 상세 페이지를 구현할 때 가장 흔한 로직은
ID로 객체를 조회하는 것입니다.

post = Post.objects.get(id=post_id)

하지만 해당 ID의 데이터가 존재하지 않는다면
DoesNotExist 예외가 발생하고,
처리를 하지 않으면 **서버 에러(500)**로 이어질 수 있습니다.

 

1. try-except로 404 처리하기 (기본 방식)

def post_detail(request, post_id):
    try:
        post = Post.objects.get(id=post_id)
    except Post.DoesNotExist:
        raise Http404()

    return render(request, 'posts/post_detail.html', {'post': post})

이 방식은 동작에는 문제가 없지만 코드가 길어지고 같은 패턴이 여러 뷰에서 반복됩니다.

 

2. get_object_or_404 사용하기 (권장 방식)

from django.shortcuts import get_object_or_404

def post_detail(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    return render(request, 'posts/post_detail.html', {'post': post})

Django는 “객체 조회 → 없으면 404 반환” 이라는 패턴이 너무 자주 등장하기 때문에 이를 공용 함수로 미리 만들어 제공합니다.

 

3. 왜 get_object_or_404가 더 효율적일까?

✅ 코드가 짧고 읽기 쉽다
✅ 실수로 500 에러를 노출할 가능성이 줄어든다
✅ Django가 의도한 예외 처리 방식
✅ 실무에서 가장 많이 사용되는 패턴

 

4. 정리하면

존재하지 않는 데이터 요청은
서버 에러가 아니라 404로 응답하는 것이 맞고,
Django에서는 get_object_or_404가 그 표준이다.