[Django] 좋아요 기능 구현과 F Expression

2026. 6. 3. 22:55·Django
반응형

 

좋아요 기능은 단순히 게시글의 좋아요 수를 1 증가시키는 기능이다.

하지만 여러 사용자가 동시에 좋아요를 누를 수 있기 때문에 단순히 Python 코드에서 `+= 1`을 사용하는 방식은 주의가 필요하다.

 

좋아요 View 구현

def post_like_view(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    
    post.points = F("points") + 1 # post.points = F()
    post.save()
    
    post.refresh_from_db()
    
    return render(
        request, template_name="post_detail.html", context={"post": post}
    )

 

get_object_or_404()

` post = get_object_or_404(Post, id=post_id)`

  • 데이터가 존재하지 않으면 DoesNotExist 예외를 직접 처리하지 않고, 자동으로 404 응답 반환

 

F Expression

`F()`: Django에서 제공하는 표현식

  • Python에서 값을 계산하는 것이 아니라 데이터베이스에서 직접 값을 계산하도록 SQL을 만들어줌
post.points = F("points") + 1
post.save()

# 위 코드는 아래와 유사하게 동작

UPDATE post
SET points = points + 1
WHERE id = 1;

 

 

경쟁 상태(Race Condition)

  • 두 개 이상의 프로세스나 스레드가 공유 자원(데이터, 파일 등)에 접근하여 이를 읽거나 쓰는 과정에서 실행 순서에 따라 예상치 못한 결과가 발생하는 상황

만약, 사용자 A와 사용자 B가 동시에 좋아요를 누를 경우, 둘 다 동일한 값을 읽어 +1을 했기 때문에 계산이 누락될 수 있다.

`F()`를 사용하면 Python에서 값을 읽고 계산하는 것이 아니라, 데이터베이스가 직접 현재 값을 기준으로 증가시키므로 동시에 요청이 들어와도 안전하다.

 

refresh_from_db()

`F()`를 사용해 저장한 직후에는 Python 객체의 post.points 값이 실제 숫자가 아니라 F("points") + 1 표현식 상태로 남아 있을 수 있다.

따라서 변경된 값을 다시 확인하거나 템플릿에 최신 값을 넘기려면 데이터베이스에서 값을 다시 가져와야 하는데 `refresh_from_db()`를 사용한다.

이 코드를 실행하면 DB에 저장된 최신 값으로 post 객체가 갱신된다.

 

 

[참고] 실전! Django 입문 강의

반응형
'Django' 카테고리의 다른 글
  • [Django] 장고 회원 시스템 (User 모델과 Admin 페이지)
  • [Django] Function-Based View와 Class-Based View
  • [Django] ORM으로 데이터 생성, 조회, 수정, 삭제(CRUD) 해보기
  • [Django] 장고 Model과 Migration 이해하기
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (226) N
      • SSAFY (10)
      • Algorithm (123)
        • 이론 (6)
        • 백준 (BOJ) (114)
        • 프로그래머스 (2)
        • 코드트리 (1)
      • Trouble Shooting (11)
      • Frontend (7)
      • React (17)
      • Next.js (5)
      • Vue (4)
      • Django (12) N
      • Node.js (2)
      • HTML (9)
      • DevOps (4)
        • Git (4)
      • Language (13)
        • JavaScript (0)
        • Java (13)
      • Embedded (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
      • 자격증 (2)
      • 기타 (1)
        • Tistory (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    블록체인
    Algorithm
    티스토리챌린지
    싸피
    그리디
    bfs
    오블완
    중복순열
    SSAFY
    파이썬
    백트래킹
    Heap
    순열
    django
    html5
    Next.js
    브루트포스
    구현
    알고리즘
    dfs
    힙
    SSAFYcial
    백준
    Java
    우선순위큐
    수학
    DP
    강의
    Error
    React
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
올콩
[Django] 좋아요 기능 구현과 F Expression
상단으로

티스토리툴바