[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 절로 적용해 실제로 쿼리
하는 방식으로 동작한다.
실제 코드는 여기를 참고하면 된다.
'공부 > BE, DB' 카테고리의 다른 글
[Spring] Kotlin+JPA에서의 No-Args Constructor 이용 (0) | 2022.02.23 |
---|---|
[Spring] QueryDSL Introduction ( w/ Spring Data JPA, Kotlin ) (0) | 2022.02.22 |
[Typeorm] Repository.save 메소드 알아보기 (0) | 2022.02.11 |
[백엔드] 앞단에 Nginx 적용하기 (0) | 2021.08.30 |
JWT(Json Web Token)이란 (0) | 2021.07.30 |
Recent Posts
Popular posts
Recent Comments
Tag List
API JavaScript 테라폼 ORM 인증 JWT AWS 리눅스 네임스페이스 컨테이너 도커 GCP 운영체제 파이썬 k8s TypeScript 네트워크 알고리즘 클라우드 DB DNS 인가 IAC 백준
Total :
Today :
Yesterday :
Blog powered by Tistory, Designed by hanarotg