[TypeOrm] Limit과 take의 차이

wonjun.Aden·2023년 11월 29일
0

TypeORM

목록 보기
3/3
post-thumbnail

TypeORM을 사용하면서 데이터를 가져올 때 take와 skip을 참 많이 썼다.
많이 사용했던 부분으로는 pagination을 할 때 참 많이 사용하였다. 하지만 어느 특정 상황에서는 take와 skip을 사용하면 에러가 나는 상황도 있었다. 그러면 limit과 Offset을 썼다.

하지만 이 둘을 언제 써야하는지 어떤 차이가 있는지 제대로 알진 못했다.

그래서 이 둘을 비교해보려 한다.

limit은 typeorm에서 아래와 같이 설명한다고 한다.

LIMIT 
1. maximum number of rows to be selected. 
2. NOTE that it may not work as you expect if you are using joins. 
3. If you want to implement pagination, and you are having join in your query, then use instead take method instead.
  1. 최대 행수를 정한다.
  2. Join을 사용할 시 너가 기대한대로 작동되지 않을 수 있다.
  3. 복합적인 페이지네이션이나, join을 이용한 쿼리를 쓰고 싶을 경우 limit 대신 take를 사용하는 것을 권장한다.

offset은 typeorm에서 아래와 같이 설명한다고 한다.

OFFSET
1. selection offset. 
2. NOTE that it may not work as you expect if you are using joins. 
3. If you want to implement pagination, and you are having join in your query, then use instead skip method instead.
  1. 시작할 시점의 행 수를 정한다.
  2. Join을 사용할 시 너가 기대한대로 작동되지 않을 수 있다.
  3. 복합적인 페이지네이션이나, join을 이용한 쿼리를 쓰고 싶을 경우 limit 대신 skip을 사용하는 것을 권장한다.

TypeORM에서 Join이나 복합적 쿼리를 사용하는 부분에서는 take나 skip을 사용하라고 강조하고 있는데 왜 그런것일까 궁금했다.

블로그를 찾다보니 어느 귀인께서 직접 예시를 들며 설명을 해주신 것이 있었다.

그 분의 블로그를 보니 둘의 차이가 어떻게 다른지 아주 잘 와닿았다.
둘의 차이는
take는 서브쿼리로 조인을 먼저 한 후 limit을 적용시킨다. 그래서 join을 할 경우에는 take로 join의 쿼리를 먼저 평가 후 Limit으로 제한을 해야 원하는 결과가 제대로 나온다는 것이다. 그리고 처음 날린 쿼리의 결과를 객체로 받아 그 id 값으로 다시 한번 n 개의 데이터를 얻어 오는 것이었다.

객체를 받아서 orderby를 붙인다면 이야기가 달라진다. 페이지네이션을 할 때 Orderby를 하는 경우가 무척 많다. 그 때 take skip을 사용하면 아주 빈번하게 나올 수 있는 에러가 바로

Cannot read properties of undefined (reading 'databaseName')

이다.

이놈이 이제 나타나는 이유가 바로 데이터가 객체로 반환되기 때문이다.
그래서 이 에러를 해결하기 위한 방법으로는

use `.orderBy('entity.creatdAt', 'DESC')` with `.skip()` and `.take()`

use `.orderBy('entity.creatd_at', 'DESC')` with `.offset()` and `.limit()`

이런 느낌으로 limit, offset은 원시 필드 이름으로 작성,
take, skip은 Entity 필드 이름을 사용하는 것이 좋다고 한다.

처음에는 뭔지도 잘 모르고 일단 작동 되니 썼었는데 이런 큰 차이점을 알고나니 원하는 데이터를 뽑기 위해 더 신중하게 코드를 작성해야겠다는 생각이 든다.

출처

https://velog.io/@pk3669/NEST-TypeORM-Take%EC%99%80-Limit%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://stackoverflow.com/questions/68468192/difference-between-limit-and-take-in-typeorm

profile
아프리카의 BackEnd Developer 장원준입니다.

0개의 댓글