쿼리빌더에 대한 고찰

여리·2023년 10월 20일
0

오늘 알게된 신박한 정보를 좀 더 기억하고 기록하기 위해 바로 블로깅 📝

쿼리빌더의 의미부터 명확하게 알아보자면

쿼리 빌더는 정보의 추출,삽입, 업데이트를 최소한의 코드로 수행하며, 데이터베이스 어댑터에 맞게 쿼리를 자동으로 생성하여 데이터베이스에 독립된 프로그램을 만들 수 있습니다.

나는 쿼리빌더의 사용을 보다 편하게 하기위해 orm(object relational mapping)을 사용했고 orm 중에서도 typeorm을 사용했다. 그리고 node를 사용했다.

코드내용들은 이런 내용을 기반으로 사용되었기 때문에 참고!

참고사항(개정) : 작성날짜 기준의 typeorm의 최신버전에서는 getConnection()의 메소드를 사용할 수 없다는 점 참고!!!!!!!!!!!!!!!(중요) 다른 방법들도 많지만 DataSource를 활용하는 것을 춫현~~

//일반적으로 node에서 typeorm을 사용하게 되는 경우의 방식

case1.
const queryBuilder = getConnection()
	.createQueryBuilder()
	...
    
case2.
const queryBuilder = DataSource()
  	.createQueryBuilder()
	...
    
case3.
const queryBuilder = this.yourRepository
	.createQueryBuilder()
	...

사실 위의 case들은 결국 같다.
결국 DB를 어떻게 사용한 후에 쿼리빌더를 만들것인지가 위 케이스의 요지다.
위의 내용은 쿼리빌더 생성쿼리러너(트랜잭션)과 내용이 같다.
이런 내용에 대해서 이전에 다룬 글이 있는데 참고로 링크를 남겨놓는다.
(내가 쓴 거임^^;;) 링크 바로가기

이정도 서론은 넘어가고...

이런 쿼리빌더를 생성하게된후에 하나의 쿼리빌더로 여러가지의 데이터들을 활용하게 할 수 있는데

const somethingQuerybuilder = getConnection()
	.createQueryBuiler()
	.select([])
	.from(yourData1, '1')
	.leftjoin(yourData2, '2', '1.Data1Column3 = 2.DataColumn5')
	.where()
	.andWhere()
	.
	.	
	.

const data1 = somethingQueryBuilder. //------> (1)쿼리빌더의 첫번째 사용 변수
	.andWhere()
	.
	.
	.getRawMany()

const count1 = somethingQueryBuilder. //------>(2)쿼리빌더의 두번째 사용 변수
	getCount()

const data2 = somethingQueryBuiler.//------>(3)쿼리빌더의 세번째 사용 변수
	.andWhere()
	.andWhere()
	.
	.
	.getRawMany()

위의 코드를 보면 하나의 쿼리빌더에 여러가지 데이터를 뽑아내고 싶어해보인다.
그래서 이 쿼리가 끝나는 명령의 getRawMany90,getCount() 를 사용하는 변수를 생성한다.

이때 조심해야하는게 생긴다.

하나의 쿼리빌더에서 여러가지의 데이터를 추출/가공 하고자하면 이전에 사용했던 변수 (1),(2),(3)가 무엇을 먼저 사용해야하는 쿼리, 테이블 인지, 그리고 특이사항(?)이 없다면 순서를 정해서 사용할 수 있도록 해야한다.
쿼리빌더는 말 그대로 빌더하는 역할을 한다.

(1)을 뽑아 내는 내용에 별도의 추가적인 쿼리가 있고 (1)을 실행하고나면
(3)을 뽑아 내는 내용에 (1)의 쿼리빌더에 빌드가 되어있는 것이다.

(3)을 먼저 사용하고 (1)을 사용하게 될 때 쿼리빌더의 쿼리문에 영향을 줄 수 있어서 (1)의 data는 없거나 또는 잘못된 쿼리문으로 내용을 줄 수도있다.

그렇기 때문에 쿼리빌더를 사용하고자 하는 다른 변수(or 함수)에 대해서 순서를 고려하여 데이터를 활용해야한다.

기억이 허락한다면 typeorm에서 쿼리빌더를 사용하게 될 때 위 (1),(3)의 방식과 같은 쿼리문이 생성되는것을 예시로 보고 디벨롭 시켜야겠다.

profile
beckend developer

0개의 댓글