기술블로그-Django편
📌 Django 클래스 기반 뷰(CBV)의 흐름 완전 이해 + AJAX 연동 설명
Chansman
2025. 5. 16. 13:12
📌 Django 팔로우 뷰의 흐름 완전 이해 + AJAX 연동 설명
✅ 개요
팔로우 기능을 구현할 때, Django에서 클래스 기반 뷰(CBV)를 활용해 사용자 간 팔로우 처리를 합니다. 이때 URL 파라미터, 요청 유저 정보, 모델 조회, 예외 처리까지 전반적인 흐름을 이해하는 것이 중요합니다. 또한, 이 뷰는 자바스크립트의 AJAX 요청으로 호출되는 경우가 많아 연동 방법까지 함께 알아봅니다.
🧱 핵심 코드 구조
class UserFollowingView(LoginRequiredMixin, View):
def post(self, *args, **kwargs):
pk = kwargs.get('pk', 0)
to_user = get_object_or_404(User, pk=pk)
if to_user == self.request.user:
raise Http404
# 팔로우 로직 예시 (추가 가능)
UserFollowing.objects.get_or_create(
from_user=self.request.user,
to_user=to_user
)
return JsonResponse({'status': 'ok'})
🔍 한 줄씩 흐름 상세 분석
1️⃣ class UserFollowingView(LoginRequiredMixin, View)
- 로그인한 유저만 접근 가능 (LoginRequiredMixin)
- POST 방식 요청을 처리하는 CBV
2️⃣ def post(self, *args, **kwargs)
- 브라우저 또는 AJAX에서 들어온 POST 요청 처리 메서드
- URL의 파라미터가 kwargs로 전달됨
3️⃣ pk = kwargs.get('pk', 0)
- URL에서 전달된 <int:pk> 값을 받아 유저 ID로 사용
- 예: /user/5/follow/ → pk = 5
4️⃣ to_user = get_object_or_404(User, pk=pk)
- pk에 해당하는 유저가 존재하지 않으면 404 에러 발생
- 존재한다면 to_user 변수에 저장 (팔로우 대상)
5️⃣ if to_user == self.request.user:
- 자신을 팔로우하려는 경우를 막음
- self.request.user: 현재 로그인된 유저
6️⃣ raise Http404
- 자기 자신을 팔로우하는 요청은 무시 (예외 처리)
7️⃣ UserFollowing.objects.get_or_create(...)
- 이미 팔로우한 적이 있다면 아무 일도 하지 않음
- 없다면 새로운 팔로우 관계 생성
8️⃣ return JsonResponse({'status': 'ok'})
- 응답을 JSON 형태로 반환 (AJAX 요청 처리에 적합)
⚙️ AJAX란?
항목 설명
정의 | JavaScript로 서버에 비동기 요청을 보내는 방식 (Asynchronous JavaScript and XML) |
목적 | 페이지를 새로고침하지 않고 서버와 데이터를 주고받기 위함 |
사용 도구 | fetch(), axios, XMLHttpRequest, jQuery.ajax() 등 |
✅ AJAX 예시 코드 (fetch 버전)
fetch('/user/5/follow/', {
method: 'POST',
headers: {
'X-CSRFToken': csrftoken,
'Content-Type': 'application/json'
},
body: JSON.stringify({})
})
.then(response => response.json())
.then(data => {
if (data.status === 'ok') {
alert('팔로우 성공!');
}
});
📌 주의사항:
- CSRF 토큰을 반드시 포함해야 Django가 요청을 허용합니다
- 응답은 JSON 형식으로 받는 것이 일반적
🧠 요약
개념 설명
kwargs.get('pk') | URL에서 전달된 유저 pk 추출 |
get_object_or_404() | 존재하는 유저인지 확인하고 없으면 404 처리 |
self.request.user | 로그인된 현재 사용자 정보 |
예외 처리 | 자기 자신을 팔로우하지 못하도록 404 발생 |
팔로우 로직 | UserFollowing.objects.get_or_create()로 중복 방지 |
AJAX 연동 | JSON 응답을 받아 프론트에서 처리 가능 |
필요 시 언팔로우 처리, 프론트 연동 템플릿, 버튼 상태 변경까지 확장 가능합니다 ✨