[Typeorm] 쿼리가 두번 나가는 이유? 공부/BE, DB

Date 2022. 2. 19. 21:57

로그에 찍힌 쿼리를 보다 분명 하나의 find만 호출했는데 쿼리가 두번 나가는 경우가 발생했다. 

 

코드를 살펴보니 바로 Pagination(OFFSET, LIMIT)과 Join을 함께 이용한 경우에는 두번의 쿼리를 통해 값을 리턴하게 된다.

 

첫번째는 Pagination 범위에 있는 레코드들의 id를 가져오는 쿼리고,

두번쨰는 실제로 해당 id들을 이용해( id IN [ids...]) 실제 레코드를 가져온다.

사례

만약 Team 테이블과 Person 테이블이 1:N 관계를 맺고 있고,

Team에 Person을 Join해서 가져온다고 하자. 즉 다음과 같은 typeorm 메소드를 실행한다.

 

TeamRepository.find({
	relations: ['person']
});

 

그렇다면 다음과 비슷한 쿼리결과가 나올 것이다.

 

team_id team_col person_id...
1 Lorem 1
1 Lorem 2
2 Ipsum 3

 

만약 여기에 LIMIT 2를 적용한다면 다음과 같은 쿼리 결과가 나올것이고, Typeorm 메소드가 반환하는 엔티티 갯수는 1개가 될것이다.

(즉, 원하는 결과가 아니다.)

 

team_id team_col person_id...
1 Lorem 1
1 Lorem 2

 

이러한 문제를 해결하기 위해 Typeorm은 서두에 언급했던 방식(두번의 쿼리)를 이용해 엔티티를 가져오게 된다.

간략하게 말하자면, Pagination + Join 조건이 적용된 경우

1) SELECT DISTINCT와 Pagination을 이용해 id들을 찾고,

2) 해당 id들을 where 절로 적용해 실제로 쿼리

하는 방식으로 동작한다.

 

실제 코드는 여기를 참고하면 된다.

 

 

Recent Posts

Popular posts

Recent Comments

Tag List

k8s DB 인가 파이썬 도커 백준 JavaScript 네임스페이스 알고리즘 테라폼 AWS 리눅스 ORM GCP TypeScript 클라우드 DNS JWT API IAC 운영체제 인증 네트워크 컨테이너
Total : Today : Yesterday :
Blog powered by Tistory, Designed by hanarotg