🔄 Django에서 access_count += 1 vs F("access_count") + 1 완전 비교

2025. 5. 14. 13:26·기술블로그-Django편

🔄 Django에서 access_count += 1 vs F("access_count") + 1 완전 비교


✅ 개요

Django에서 숫자 필드를 1 증가시킬 때 두 가지 방식이 있습니다:

  • 일반 방식: access_count += 1
  • F 객체 방식: access_count = F("access_count") + 1

언뜻 보면 비슷하지만, 데이터베이스 처리 방식과 동시성 안정성에서 큰 차이가 있습니다.


1️⃣ 일반 방식: += 1

short_url = ShortURL.objects.get(id=1)
short_url.access_count += 1
short_url.save()

⚙️ 동작 흐름

1. DB에서 현재 값 조회 → access_count = 10
2. Python에서 1 더함 → access_count = 11
3. save() → DB에 11 저장

❌ 문제점: Race Condition 발생

두 명의 사용자가 동시에 접근할 경우:

사용자 A: access_count = 10 → 11
사용자 B: access_count = 10 → 11 (같은 값!)
→ 최종 DB 값: 11 (접근은 2번인데 1만 증가)

2️⃣ F 객체 방식: F("access_count") + 1

from django.db.models import F

short_url.access_count = F("access_count") + 1
short_url.save()

⚙️ 동작 흐름

1. F 객체로 연산 명령 지정
2. save() 실행 시 다음 SQL 수행:

   UPDATE shortener_shorturl
   SET access_count = access_count + 1
   WHERE id = 1;

✅ 이 쿼리는 DB에서 직접 연산하기 때문에 동시 요청에도 정확히 처리됩니다.

예:

  • A 요청 → +1 → 11
  • B 요청 → +1 → 12 (정확히 반영)

📊 비교 정리표

항목 += 1 방식 F() + 1 방식

연산 위치 Python 메모리 DB 내부 (SQL)
동시성 문제 ❌ 있음 (Race 발생) ✅ 없음 (DB가 직접 연산)
사용 대상 간단한 환경 실제 서비스, 트래픽 多

🧠 실전 팁

  • ✅ 데이터 증가, 조회 수, 좋아요 수처럼 여러 사용자가 동시에 갱신할 가능성이 있는 경우 → 무조건 F() 객체 사용하세요.
  • ❌ 단순 += 1은 장고가 DB에서 가져온 값을 메모리에 보관했다가 다시 저장하기 때문에, 최근 값과 충돌할 수 있음

🔁 시각적 흐름도

[ 사용자 요청 1 ]      [ 사용자 요청 2 ]
     ↓                     ↓
access_count = 10      access_count = 10
+1 → 11               +1 → 11
     ↓                     ↓
save() → DB 저장       save() → 덮어쓰기
⇒ 최종: 11 (❌ 오류)
[ 사용자 요청 1 ]      [ 사용자 요청 2 ]
     ↓                     ↓
access_count = F(...)   access_count = F(...)
save() → +1             save() → +1
⇒ DB가 직접 계산 → 정확히 2 증가 (✅)

✅ 결론

F 객체는 단순한 편의 기능이 아니라, 실제 서비스를 안정적으로 운영하기 위한 동시성-safe 기능입니다.

👍 조회 수, 클릭 수, 좋아요 수 같이 "증가"가 빈번한 상황에서는 F 객체 사용이 필수입니다!

'기술블로그-Django편' 카테고리의 다른 글

🔍 Django ORM: get() vs filter() 차이점 완벽 정리  (0) 2025.05.14
🔧 Django에서 HTML 폼으로 DELETE 요청 처리하기 — Middleware 활용법  (0) 2025.05.14
[Django 3일차] Django에서의 요청(request)과 뷰(view)의 모든 것 1/4 (short_url 프로젝트)(250514)  (0) 2025.05.14
🔍 Django에서 Model.objects.get(code=code)가 뭔 뜻이야?  (0) 2025.05.14
🧩 Django의 request 객체 쉽게 이해하기 (왜 첫 번째 인자?)  (0) 2025.05.14
'기술블로그-Django편' 카테고리의 다른 글
  • 🔍 Django ORM: get() vs filter() 차이점 완벽 정리
  • 🔧 Django에서 HTML 폼으로 DELETE 요청 처리하기 — Middleware 활용법
  • [Django 3일차] Django에서의 요청(request)과 뷰(view)의 모든 것 1/4 (short_url 프로젝트)(250514)
  • 🔍 Django에서 Model.objects.get(code=code)가 뭔 뜻이야?
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (777) N
      • Python (32)
      • 프로젝트 (101) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    classaction
    btsdischarge
    gpterror
    btsjungkook
    travel ban
    homebartrend
    youngprofessionals
    hotcoffeecase
    btscomeback
    bts
    remittance
    RM
    btsreunion
    newpoliticalparty
    titaniumcase
    life reflection
    americanlaw
    americaparty
    lawsuitculture
    뷔
    global politics
    chinanightlife
    chatgpterror
    college reunions
    self-growth
    trumpmuskclash
    livebroadcast
    urbantrends
    smartphonedurability
    basalcellcarcinoma
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
🔄 Django에서 access_count += 1 vs F("access_count") + 1 완전 비교
상단으로

티스토리툴바