📌 오늘의 TIL - Django APIView를 활용한 PostDetail 구현

오늘은 Django에서 APIView를 활용하여 특정 게시글의 상세 정보를 가져오는 API 엔드포인트를 구현했다.


📝 코드 분석

class PostDetail(APIView):  
    # 요청
    def get(self, request, pk):  # 이 pk는 urls.py에서 전달받은 값
        # 처리 -> 'id 값을 이용해서 특정 게시글 가져오기'
        post = Post.objects.get(id=pk)  # id가 pk와 일치하는 게시글을 가져옴
        serializer = Post.serializer(post)  # DB에서 가져온 데이터를 직렬화
        # 응답
        return Response(serializer.data, status=status.HTTP_200_OK)  

1️⃣ APIView

  • Django REST framework(DRF)의 APIView를 사용하여 클래스 기반 뷰(CBV)로 API를 작성함.
  • get() 메서드를 정의하여 GET 요청을 처리하도록 구현함.

2️⃣ get(self, request, pk)

  • pk는 urls.py에서 전달된 게시글의 기본키(primary key) 값.
  • Post.objects.get(id=pk):
    • id=pk인 게시글을 데이터베이스에서 조회.
    • 만약 존재하지 않는 pk를 요청하면 DoesNotExist 예외가 발생할 수 있음.

3️⃣ serializer = Post.serializer(post)

  • post 객체를 직렬화(Serialization) 하여 JSON 형식으로 변환.
  • 하지만 serializer = Post.serializer(post) 부분은 오류 가능성이 있음.
    • Post.serializer가 아니라 PostSerializer(post)처럼 직렬화 클래스를 직접 호출해야 함.
    • 예를 들어 serializer = PostSerializer(post)가 되어야 함.

4️⃣ Response(serializer.data, status=status.HTTP_200_OK)

  • Response 객체를 사용하여 JSON 응답 반환.
  • serializer.data를 JSON 형식으로 변환하여 클라이언트에게 전달.
  • status=status.HTTP_200_OK: 요청이 성공적으로 처리되었음을 나타냄.

✅ 오늘의 교훈 & 개선할 점

1️⃣ 예외 처리 필요

  • Post.objects.get(id=pk)를 사용할 경우, 해당 pk가 존재하지 않으면 DoesNotExist 예외 발생.
  • get_object_or_404(Post, id=pk)를 사용하여 안전하게 처리하는 것이 좋음.

2️⃣ 직렬화 오류 수정

  • serializer = Post.serializer(post) → serializer = PostSerializer(post)로 변경해야 함.

3️⃣ 구현 개선 (수정된 코드)

from django.shortcuts import get_object_or_404
from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView
from .models import Post
from .serializers import PostSerializer  # 직렬화 클래스 임포트

class PostDetail(APIView):  
    def get(self, request, pk):  
        # 안전한 데이터 조회
        post = get_object_or_404(Post, id=pk)  
        serializer = PostSerializer(post)  # 수정된 직렬화 코드  
        return Response(serializer.data, status=status.HTTP_200_OK)  

get_object_or_404 사용
올바른 PostSerializer 사용


💡 오늘의 깨달음

  • DRF의 APIView를 사용하여 RESTful API를 쉽게 만들 수 있다.
  • 데이터 조회 시 get_object_or_404를 사용하면 예외 처리가 간결해진다.
  • 직렬화(serializer)는 모델이 아니라 별도의 직렬화 클래스를 직접 호출해야 한다.
  • API 구현 시 예외 처리를 신경 써야 한다.

 

+ Recent posts