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() 메서드로 메모리 상의 객체와 데이터베이스 상의 실제 데이터 의 싱크를 맞춘다고 생각하자.
그럼으로써 코드의 연산에서 최신데이터를 반영할 수 있게 하는 것이다.
'Develop' 카테고리의 다른 글
[Django/Postgresql] Geo Django(DRF), DB Extension(PostGIS)으로 지리데이터 사용하기 (1) | 2023.10.23 |
---|---|
[AWS] RDS 및 Aurora SSL/TLS C인증서 업데이트 및 자동교체여부 확인하기 (0) | 2023.10.18 |
[Django/AWS S3] File Chunk Upload | File Multipart Upload로 대용량 파일 업로드 진행상황 확인하고, 효율적으로 업로드하기 (0) | 2023.09.10 |
[Django] webp ,바이트 스트림(Byte Stream) 개념과 이미지 webp 형식으로 변환하기 (0) | 2023.09.01 |
[AWS] CloudFormation : 문법 및 스택정책을 쉽게 이해하기 (0) | 2023.08.27 |