기술블로그-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 응답을 받아 프론트에서 처리 가능

필요 시 언팔로우 처리, 프론트 연동 템플릿, 버튼 상태 변경까지 확장 가능합니다 ✨