DoesNotExist vs MultipleObjectsReturned - ORM 예외처리
·
python/Django
ORM을 사용해서 개발을 하다 보면 아래 오류가 종종 발생하고는 합니다.User.DoesNotExist: User matching query does not exist. 처음에는 ORM이 잘 작동했지만 서비스에서 트랙픽이 증가하고, 데이터가 누적되기 시작하면서예외가 빈번하게 발생했습니다. 먼저 발생원인에 대해 확인하면get( ) 메서드의 핵심 특징을 알아야합니다. get( )은 단 하나의 레코드만 존재할 때만 성공합니다.그 외엔 무조건 예외를 발생시킵니다. 예외 발생 조건 원인 DoesNotExist해당 조건에 맞는 결과가 0개삭제되었거나 조건이 잘못됨MultipleObjectsReturned결과가 2개 이상일 때중복 데이터 또는 unique 제약 누락 예외를 처리하지 않으면 서버에서 500에러가 발..
OperationalError 해결 방법 – DB 커넥션 끊김 (MySQL)
·
python/Django
Django 프로젝트를 하던 중 django.db.utils.OperationalError: (2006, "MySQL server has gone away") 서버 로그에서 위와 같은 오류가 발생했다. 검색을 해보니트래픽이 몰렸을 때서버가 일정 시간 이상 대기 상태였다가 재접속할 때Celery worker가 DB에 오래 연결되어 있었을 때 먼저 OperationalError란?Django에서 DB와 통신 중 운영 레벨(DB 커넥션, 네트워크, 설정 등)의 문제가 발생하면OperationalError가 발생한다. 유형 설명 DB 커넥션 타임아웃일정 시간 사용하지 않으면 DB가 커넥션을 끊어버림DB 커넥션 풀 한도 초과동시에 너무 많은 요청으로 커넥션 부족MySQL 서버 설정 문제wait_timeout, ..
transaction.atomic() 트랙잭션 처리하기
·
python/Django
회원가입 시 사용자(User)와 프로필(Profile) 데이터를같은 요청에서 동시에 저장하려고 했습니다. 처음에는 별 문제가 없었는데중간에 Profile.objects.create() 단계에서 오류가 나면User는 저장됐고 Profile은 저장이 안 되는 데이터 불일치 현상이 발생했습니다. 즉, 가입은 성공 했는데 프로필이 없는 유저가 생겨난 겁니다. 원인 분석Django ORM은 기본적으로 각 쿼리를 독립적으로 실행합니다.따라서 여러 개 쿼리를 실행하다가중간에 하나라도 실패하면 앞에서 실행된 쿼리는 그대로 DB에 남게 됩니다.→ 트랜잭션을 명시적으로 걸지 않으면, 중간 실패 시 롤백이 일어나지 않습니다. 예를 들어django.db.utils.IntegrityError: NOT NULL constrain..
ValidationError – API/Form 검증
·
python/Django
API 개발하면서, Form이나 API Serializer를 통해 입력 값을 검증해야합니다. 근데 사용자가 잘못된 데이터를 보내거나, 빠뜨리거나, 이상한 형식으로 보내면 ValidationError가 발생합니다.rest_framework.exceptions.ValidationError: 문제는, 서버에서 ValidationError를 제대로 잡지 않으면 500에러가 발생하고, API 클라이언트(앱/프론트앤드)에서는 "서버 오류" 처럼 오해할 수 있습니다. → 사용자 탓인데 서버 오류처럼 보이게 되는 셈이죠. 원인 분석Django Form, ModelForm, DRF Serializer 모두 내장 검증(validation) 기능을 가지고 있습니다.이 검증 과정에서 문제가 발생하면 ValidationErr..
IntegrityError – 대량 저장 중 충돌 해결
·
python/Django
개발을 하다가 대량의 데이터를 한꺼번에 저장하는 기능이 필요한 적이 있었다. Django ORM의 bulk_create()를 이용해 수천 건을 한 번에 insert하려고 했는데, 간헐적으로 IntegrityError가 발생하면서 작업에 실패했었다. 특히,Primary Key가 수동으로 지정되는 경우Unique 제약조건이 걸린 필드가 중복되는 경우ForeignKey로 연결된 테이블에 없는 값이 들어오는 경우원인 분석bulk_create()는 내부적으로 INSERT INTO ... VALUES (), () ... 식으로 한 번에 SQL을 보낸다.트랜잭션을 걸지 않으면 한 레코드라도 오류 나면 전체가 실패한다.트랜잭션을 걸어도, IntegriryError가 발생하면 모든 데이터가 롤백된다. 즉,데이터가 하나라..
DRF(Django REST Framework) 란?
·
python/Django
💡DRF란? Django 기반 REST API 서버 구축을 위한 라이브러리 Django와 다르게 프론트엔드를 개발하지 않기 때문에 Model과 View 그리고 Serializer가 됩니다. DRF의 구조에 대해서 지칭하는 패턴은 없습니다. 백엔드의 용도로 사용하기 때문에 Template을 사용하지 않습니다. 대신, JSON파일의 형식으로 프론트엔드와 데이터를 주고받습니다. Django와의 차이점 DRF 로직 🧗🏻DRF 모듈 설명 DRF 모듈 설명 models.py 모델 정의 데이터베이스 테이블을 추상화한 개념 Django ORM을 통해 파이썬 문법으로 데이터를 처리할 수 있음 Django에서 데이터는 JSON이나 유사한 포맷이 아닌, 파이썬 객체의 형태로 저장됨 class Product(models.Mo..