티스토리 뷰

DEV/Backend

TypeORM의 Where In 절

berom 2023. 1. 30. 15:42

문제의 코드

export async function getSoonHistorySJListNotMe(sjid: number, campues: string[]) {   return await SoonHistory.find({     where: {sjid, soonwon: {campus: {campusid: In(campues)}}},     relations: {soonwon: true},   }); } 

테이블이 여러 개로 쪼개져 있고, JOIN해서 데이터를 출력해야 하는 상황이었다.
프론트 요청에 따라 그냥 데이터를 줄 수 있지만, 필요 이상의 데이터를 주고 싶지 않아 쿼리를 조절하다보니 위와 같이 되었다

TypeORM에서 IN 절은 처음이기 때문에 직관적으로 바로 다가오지 않아 기록해둔다

IN은 언제 사용하는가

기본적으로 IN은 Where 일치하길 원하는 컬럼명 IN (조건들) 형식으로 사용한다
IN 뒤에 오는 조건들을 만족하는 row들만 가져오는 것이다.

TYPEORM의 IN

설명하기 앞서, TypeORM의 active record 패턴을 참조해 코드를 작성했기 때문에, Entity를 선언 할 때 Base Entity를 확장하여 SoonHistory.find()형식으로 함수 사용이 가능하다. querybuilder를 사용하지 않아도 된단 뜻이다.


아래는 공식 문서에서 기술된 IN의 사용법이다.


where()에 쿼리문을 직접 입력하고, 문자열 내에 위치한 인자에 list 형식으로 조건을 기입하여, 구현 가능하다.

공식 문서를 더 찾아보다, 내 코드와 비슷한 옵션을 찾았다


QueryBuilder를 이용한 방법과 크게 다르진 않다. list 형태로 조건을 정의하고 입력하면 된다

그렇다면 내가 작성한 ORM 코드의 경우, 아래처럼 바뀐다 (JOIN은 제외하고 표시하겠다)

SELECT ... FROM SoonHistory WHERE sjid="sjid" AND soonwon=("campusid" IN (campuses))  

SoonHistory에 있는 데이터를 긁어오되 sjid가 입력 값과 동일하고, 입력된 campusid와 일치하는 캐퍼스의 학생만 데려오겠다는 의미이다.

마치며

IN이 아니더라도, Any 등의 옵션들도 위와 같은 형식으로 동일하게 사용 가능하다.
쿼리 날라가는 로그로 찍어보면, 구문이 진짜 긴 걸 알 수 있는데, 직접 SQL로 작성 안해도 되는 세상에 태어나서 참 좋다

728x90

'DEV > Backend' 카테고리의 다른 글

TypeORM WHERE 옵션 (Relations, Order)  (0) 2023.01.30
Typeorm unique란?  (0) 2023.01.30
Token 방식으로 로그인 구현하기  (0) 2023.01.27
JWT 다루기  (0) 2023.01.26
TypeORM Releation 다루기  (0) 2023.01.26