📌 오늘의 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 구현 시 예외 처리를 신경 써야 한다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 2025.02.07TIL: GIT협업 WORK FLOW (1) | 2025.02.07 |
|---|---|
| 2025.02.06 TIL : 가상환경 설정 문제 (0) | 2025.02.06 |
| 2025.02.04 TIL : Django - Serializer (0) | 2025.02.04 |
| 2025.02.03 TIL Django : DetailView (0) | 2025.02.03 |
| 2025.01.31TIL : 클래스 복습 (0) | 2025.01.31 |