Django ORM 의 문제점
ORM
ORM이란 Object Relation Mapper의 줄임말입니다.
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑 해주는 것을 말합니다. 객체를 통해 간접적으로 데이터베이스 데이터를 다룹니다.
ORM 장점
-
객체 지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 도와줍니다.
-
재사용 및 유지보수에 용이합니다.
-
DBMS에 대한 종속성이 줄어듭니다.
ORM 단점
-
ORM으로만 완벽한 서비스를 구현할 수 없습니다.
-
프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵습니다.
-
프로젝트의 복잡성이 크면 구현하는 난이도가 상승합니다.
Django ORM N+1 쿼리 이슈
주로 어플리케이션단에서 발생하는 문제입니다.
어플리케이션에서 한번의 호출로 N개의 모델을 가져온 뒤 N개의 모델을 순회 하면서 각각 모델 관련된 릴레이션 모델에 접근 할 때,
DB에 또 다시 호출하게 되는데 이때 N번 호출하게 되어 성능에 좋지 않는 영향을 끼치게 됩니다.
django ORM은 Lazy-Loading 방식입니다.
Lazy-Loading 방식을 사용하면 ORM에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는 것이 아니라
모든 명령 처리가 끝나고 실제로 데이터를 불러와야 할 시점이 왔을 때 데이터베이스에 쿼리를 실행하는 방식입니다.
결과 전체가 필요하지 않을떄 쿼리셋 캐시가 문제가 됩니다.
결과 전체를 순회하지 않고 단지 레코드가 최소한 하나는 존재하는지 알아보고 싶을 수도 있습니다.
이 경우, 쿼리 셋에 if 문을 사용하면 if 문 때문에 쿼리셋이 평가되고, 이에 따라 쿼리셋 캐시에도 전체 레코드가 저장되는데
이를 피하기 위해서는 exists() 메서드를 사용합니다.
이 메서드는 최소한 하나의 레코드가 존재하는지 여부를 확인하여 알려줍니다.
하지만 그럼에도 불구하고 문제는 계속됩니다.
쿼리셋 이 큰 경우 쿼리셋 캐시의 문제
몇 천 개 단위의 레코드를 다뤄야 할 경우, 이 데이터를 한 번에 가져와 메모리에 올리는 행위는 매우 비효율적입니다.
더 나쁜 점은, 거대한 쿼리가 서버의 프로세스를 잠궈(lock) 버려서 웹 애플리케이션이 죽을 수도 있다는 사실입니다.
이런식으로 문제가 계속 되기 때문에 큰 규모의 프로젝트나 복잡한 프로젝트에는 Django ORM 이 적합하지않습니다.
결론
한줄 결론 : 대규모나 복잡한 프로젝트에서는 ORM 이 해가 될수 있습니다.