본문 바로가기
IT CHANNEL/Python

[Django] refresh_from_db() : 메모리 상의 Django 객체와 데이터베이스 동기화하기

by TitanX 2023. 10. 6.

 

refresh_from_db() 를 이용해 데이터를 동기화 시키는 방법을 알아보고자 한다.

어떤 비즈니스 로직과 그에 대한 트랜잭션이 있다.

비즈니스 로직은 반드시 필요한 것이고 그 뒤에 데이터 값 변경이 보장되어야한다.

비즈니스 로직과 세부는 여기서 크게 중요하지 않다

 

 

 

refresh_from_db()란

refresh_from_db() 는 Django의 Model 클래스에서 제공하는 Django 근본 메서드 라고 할수있겠다. 
메모리에 로드된 모델 인스턴스의 필드 값과 데이터베이스의 값은 다를 수 있다는 것을 알아야한다.

 

 

실제 코드로 보는 예시

@action(methods=["PUT"], detail=True, serializer_class=ProjectSerializer, permission_classes=[])
def restart(self, request, pk=None):
    project = self.get_object()
    self.update(request) # 집중
		
		
    upload_json_to_s3(project) # 어떤 로직
    delete_result_files_in_s3(project.user_id, project.id) # 어떤 로직

    project.refresh_from_db() # 집중
    project.ai_status = AiStatusChoice.READY
    project.save()

    return Response(self.get_serializer(project).data, status=status.HTTP_200_OK)

 

 

 

정리

 

  • update() 메서드는 데이터베이스의 데이터를 변경하고, 메모리 상의 project 객체는 자동으로 업데이트되지 않는다.
  • 어떤 로직upload_json_to_s3() 및 delete_result_files_in_s3() 함수를 호출.
    (이 때, project 객체는 아직 변경되지 않은 상태의 메모리 상의 객체를 참조).
  • project.refresh_from_db()를 호출.
    이 함수는 메모리 상의 project 객체의 상태를 데이터베이스로부터 새로고침하여 동기화한다.
    만약 이 단계를 생략한다면, project 객체는 update() 메서드 호출 이전의 상태를 계속 참조한다.
  • project.ai_status를 변경하고 project.save()를 호출하여 변경사항을 데이터베이스에 저장한다.

 

refresh_from_db()를 호출하지 않았을 때의 문제

 

 

  • self.update(request)에서 발생한 데이터베이스 레벨의 변경사항이 메모리 상의 project 객체에 반영되지 않고, self.update(request) 후에 이루어지는 project 객체와 관련된 연산은 오래된 데이터를 기반으로 작동하는 것이다.

refresh_from_db() 메서드로 메모리 상의 객체와 데이터베이스 상의 실제 데이터 의 싱크를 맞춘다고 생각하자.
그럼으로써 코드의 연산에서 최신데이터를 반영할 수 있게 하는 것이다.