kakasoo

쿼리빌더를 "조금" 더 완벽하게 해줄 setFindOptions 본문

프로그래밍/NestJS

쿼리빌더를 "조금" 더 완벽하게 해줄 setFindOptions

카카수(kakasoo) 2022. 9. 12. 17:06
반응형

 

TypeORM에는 setFindOptions 라는 메서드가 있고, 이걸 활용하면 할 수 있는 일이 참 많습니다.

하지만 공식문서에는 이 메서드에 대한 소개가 전혀 없는데요, 이건 TypeORM이 반성해야 할 부분 같습니다.

이 메서드는, QueryBuilder가 가진 문제점을 부분적이나마 해소해줍니다.

코드를 통해 보겠습니다.

 

QueryBuilder 사용법

const posts = await connection
	.createQueryBuilder(Post, "post")
  .where('post.author IS NULL')
	.orderBy("post.id", "ASC")
	.getMany()

 

post를 조회할 때 우리는 where문과 order를 where, orderBy라는 메서드를 통해 해결할 수 있습니다.

하지만 여기에는 조금 문제가 있는데요, 이렇게 사용할 경우 단순한 string으로 표현되다보니 런타임에서는 에러를 잡지 못한다는 문제가 발생합니다.

테스트가 자리잡지 않는 개발 조직에서는, 이런 문제는 조금 심각할 수 있을 거 같은데요,

놀랍게도 TypeORM은 이런 문제를 해결하기 위한 메서드가 2019년부터 있었습니다.

왜 이게 공식문서에는 제외되어 있던 걸까요?

 

setFindOptions를 통한 해결

const posts = await connection
	.createQueryBuilder(Post, "post")
	.setFindOptions({
	    where: {
	        author: IsNull(),
	    },
	})
	.orderBy("post.id", "ASC")
	.getMany()
const posts = await connection
	.createQueryBuilder(Post, "post")
	.setFindOptions({
	    where: {
	        author: IsNull(),
	    },
			order: {
					id: "ASC",
			},
	})
	.getMany()

 

setFindOptions 메서드는 조회에 필요한 조건들을 모두 객체 상태로 관리할 수 있게 해줍니다.

이게 있다면 굳이 Repository를 강제할 필요도 없어, 타입을 체크하는 데에 무척이나 큰 도움이 될 거 같습니다.

이 내용은 현재 사용하는 TypeORM 버전 대부분에서 사용 가능할 거 같습니다.

반응형