Django Queryset API 와 ORM

안희수·2021년 6월 23일
1

TIL

목록 보기
19/26

DJango의 ORM 과 Queryset API 의 개념과 종류

장고를 사용하개 되면 장고에서 제공하는 Queryset API 라고 하는 것이 있는데
SQL을 작성하지 않더라도 개발자가 그에 준하는 작업을 진행할 수 있고 API 호출 방식이기 때문에 코드도 보다 간결해진다.

기본적으로는 ~.objects. 의 형식으로 사용되며
ORM (Object Relation Model) 과도 연관이 되어 있는데

all() == "select from table; " ,
filter() == "select
from table where condition=''; " ,
exlcude == "select from table where condition not in ''; ",
include == "select
from table where condition in ''; ",
values() 테이블 내역을 Queryset으로 반환함,
values_list() 테이블 내역을 리스트로 반환함,
get() 테이블 내역을 인스턴스로 반환함,
create() == "insert into table(col_a,col_b,col_c,col_d) values (val_a,val_b,val_c,val_d); ",
count() 조회 결과의 행수를 반환함,
exists() 조회 대상이 존재하는지 참 거짓을 반환함,
update() == "update table set a=0 where condition = ''; ",
delete() == "delete from table where condition = ''; ",,
first() == "select top1 from table where condition = ''; ",
last() == "select top1
from table where condition = '' and id = (select count 1 from table where condition = ''); "
등을 들 수 있다.

그 외에도 사용할 수 있는 API는 많이 있지만
해당 API가 왜 편한지 그리고 장단점은 무엇인지 집고 넘어갈 필요가 있을 것 같다.

API호출 방식이 편한 이유는 사실 DBA가 아니면
백엔드 개발자라고 해서 다 SQL을 다루지 않는데
웹 페이지 특성상 한번에 많으 데이터를 한 페이지에 다 담아서 보여줄 수 없다.

물론 웹 사이트에 있는 데이터를 보면 많은 것을 보여주고 있는 것 같지만 그것은 같은 묶음으로 모인 여러가지 컨텐츠이고
지금 말하는 것은 하나의 대상을 한 화면에 모두 불러와서 보여지는 것이 없다는 것을 말한다.
페이지 안에서 보여질 수 있는 데이터는 한정되어 있고 그런 의미에서 데이터 처리 과정을 제외한다면 보여지는 부분에서는 방대한 데이터를 한번에 보여주기 보다는 페이지 간 이동을 통해 상위 메뉴에서 하위로 세부 내역을 보여주는 구조로 되어 있다.

자바스프링의 VO 객체

C#.Net의 LINQ

스프링 자바에서도 DB에 직접 접근하는 것이 아니라 객체화 시켜서 데이터를 가지고 오고 있고 닷넷에서도 LinQ라고 하는 것을 통해 데이터에 접근해올 수 있는데
MVC 패턴을 추구하는 분야는 대체로 비슷한 방식으로 쿼리문을 직접 사용하지 않고 API를 사용하고 있다.


ORM이 사용되는 이유

객체지향 프로그래밍은 클래스를 사용하고 관계형 데이터베이스는 테이블을 사용하기 때문에 객체 모델과 관계형 모델간에 불일치가 존재하므로 객체간의 관개를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결하고자 함 (객체를 통해 간접적으로 데이터를 다루기 위해)


ORM 의 특성

세분성 (Granularity)
경우에 따라 데이터베이스에 있는 테이블 수보다 도 많은 클래스를 가진 모델이 생길 수 있다. (객체지향 프로그래밍에서는 코드 재사용과 유지보스를 위해 하나의 테이블 내 정보라도 여러가지로 나눠서 관리할 수 있다.)

상속성 (Inheritance)
RDBMS에는 객체지향 프로그래밍 언어의 특징인 상속 개념이 없다.

일치 (Identity)
RDBMS는 'sameless' 라는 하나의 개념을 정확하게 정의하는데, 바로 기본키(Primary Key)를 이용하여 동일성을 정의한다.
반면에 객체지향 프로그램 예를들어 자바 같은 경우에는 객체 식별과 객체 동일성을 모두 정의하고 주소값 같거나 내용이 같은 경우를 구분해서 정의한다.

연관성 (Associations)
객체지향 언어는 객체 참조를 사용하여 연관성을 나타내는 반면, RDBMS는 연관성을 외래키(Foreign Key)로 나타낸다.
또한 객체지향 언어는 양방향 관계가 필요한 경우 연관을 두번 정의해야 한다. 반면에 RDBMS는 FK와 Join으로 자연스럽게 방향성이 없는 연결이 이루어진다.

탐색 (Navigation)
객체지향 언어(자바)와 RDBMS는 객체를 접근하는 방법이 근본적으로 다른데 자바는 그래프 형태로 하늬의 연결에서 다른 연결로 이동하면서 탐색하는데 비해 RDBMS는 쿼리를 최소화하고 JOIM을 통해 여러 엔티티를로드하고 원하는 대상 엔티티를 선택하는 방식으로 탐색한다.


ORM의 장단점 (자바 ORM 기준이나 타 ORM도 포함 됨)

장점

- 객체지향적인 코드로 인해 더 직관적이고 로직에 집중할 수 있도록 도와준다.

- SQL문이 아닌 클래스의 메서드를 통해 데이터베이스를 조작할 수 있으므로 개발자가 객체 모델만 이용해서 프로그래밍을 하는 데 집중할 수 있다.

- 선언문, 할당, 종료 같은 부수적인 코드가 없거나 줄어든다.

- 객체마다 코드를 별도로 작성하기 때문에 코드의 가독성이 높아진다.

- SQL의 절차적이고 순차적인 접근이 아닌 객체지향적인 접근으로 인해 생산성을 높여준다.

- 재사용 및 유지보수의 편리성이 증가한다.

- ORM은 독립적으로 작성되어있고, 해당 객체들을 재활용할 수 있다.

- 매핑 정보가 명확하여, ERD를 보는 것에 대한 의존도를 낮출 수 있다.

- DBMS에 대한 종속성이 줄어든다.

- 대부분 ORM 솔루션은 DB에 종속적이지 않기 때문에 구현 방법뿐만 아니라 많은 솔루션에서 자료형 타입까지 유효하다. (*종속성? 프로그램 구조가 데이터 구조에 영향을 받는다.)

- 프로그래머는 Object에 집중함으로 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크와 시간이 소요된다.

- 또한 자바에서 가공할 경우 equals, hashCode의 오버라이드 같은 자바의 기능을 이용할 수 있고, 간결하고 빠른 가공이 가능하다.

단점

- 완벽한 ORM 으로만 서비스를 구현하기가 어렵다.

- 사용하기는 편하지만 설계는 매우 신중하게 해야한다.

- 프로젝트의 복잡성이 커질경우 난이도 또한 올라갈 수 있다.

- 잘못 구현된 경우에 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있다.

- 일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는등 별도의 튜닝이 필요한 경우가 있다.

- DBMS의 고유 기능을 이용하기 어렵다. (하지만 이건 단점으로만 볼 수 없다 : 특정 DBMS의 고유기능을 이용하면 이식성이 저하된다.)

- 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다.

- 이미 프로시저가 많은 시스템에선 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있다.

profile
9년차 소프트웨어 개발자 (2024년 재 개편 예정입니다)

0개의 댓글