
ORM이란❓
Object Relation Mapper
객체(Object)와 관계형 데이터베이스(Relational)을 연결(Mapping)해 주는 것을 의미.
데이터베이스의 테이블을 객체(Object)와 연결하여 테이블에 CRUD를 할 때, SQL 쿼리문을 사용하지 않고도 데이터베이스의 데이터를 다룰 수 있게 해줌.
Python 외에도 JAVA, C++ 등 다른 언어에도 존재.
장고에서는 자주 사용했던 .filter(), .all(), .get() 등을 예시로 들 수 있다.
Django ORM은 Lazy-Loading(지연 로딩)방식을 사용.
ORM에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는 것이 아닌,
모든 명령 처리가 끝나고 실제 데이터를 불러올 때 데이터베이스에 쿼리를 실행하는 방식.
n+1 문제란 성능 이슈를 야기한다.
Eager loading (즉시 로딩)
로딩시 참조해야 하는 정보를 미리 명시해서 N+1 쿼리 문제의 해결을 통해 성능 향상 가능, 지연 로딩의 반대 개념
select_related, prefetch_related 함수를 이용해 DB에 접근하는 횟수를 줄일 수 있다.
하나의 QuerySet을 가져올 때, 미리 related objects들까지 다 불러오고 (eager loading) SQL문이 캐시에 저장되기 때문에 쿼리의 개수를 줄인다.
one-to-one (1:1)many-to-one(1:n) 관계에서 n시점foreign keymany-to-many (m:n)one-to-many (1:n) 관계에서 1시점foreign-key (사실상 모든 relationships에서 사용 가능)https://hckcksrl.medium.com/django-n-1-problem-d986b93f5d3e
https://velog.io/@kim6515516/npuls