오늘 알게된 신박한 정보를 좀 더 기억하고 기록하기 위해 바로 블로깅 📝
쿼리빌더의 의미부터 명확하게 알아보자면
쿼리 빌더
는 정보의 추출,삽입, 업데이트를 최소한의 코드로 수행하며, 데이터베이스 어댑터에 맞게 쿼리를 자동으로 생성하여 데이터베이스에 독립된 프로그램을 만들 수 있습니다.
나는 쿼리빌더의 사용을 보다 편하게 하기위해 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)의 방식과 같은 쿼리문이 생성되는것을 예시로 보고 디벨롭 시켜야겠다.