본문 바로가기
BackEnd

TypeORM Repository 조건(옵션) 안될 때

by 마운틴케이 2024. 9. 10.

한 줄 요약: TypeORM을 사용하기 위해서는 엔티티 클래스의 필드를 private으로 두면 안된다.


 

 

 

오류는 아니고.. 

Nest로 개발하다 생각지도 못한 삽질을 해버렸다.

 

 

 

아래의 코드처럼 TypeORM을 사용해 역시 typeorm 에서 제공하는 Repository를 서비스에서 주입받아 사용하고 있었는데

@Injectable()
export class UserService {
  constructor(
    private userRepository: Repository<UserEntity>
  ) {}
...

 

기능을 구현하다보니, Repository에서 제공하는 메서드 중 옵션을 줘야하는 메서드를 사용하게 될 일이 있었다.

 

await this.userRepository.findOneBy({ id: userId });

요런 식으로..

근데 자꾸 컴파일 오류가 뜨는 것이다.

id 가 FindOptionsWhere<UserEntity> 에 존재하지 않는 타입이라는 것이다.

 

나는 typeORM 공식 문서를 보면서 하고있었기 때문에

예제소스에 있는 사용법 그대로 썼을 뿐인데 뭐가 문젠지 도저히 알 수가 없었다...

 

 

혹시나 Datasource 설정 방식이나 Repository 주입방식 등이 관련이 있나 싶어서

Nest.js 의 공식문서에서 typeORM 부분을 보며 똑같이 고쳐보았다. (typeORM 공식문서와 다른 방식을 취하고 있음)

 

https://docs.nestjs.com/recipes/sql-typeorm

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

 

그래도 안됐다.

 

대체 뭐가 문제지 삽질만 하다가

진짜 혹시나~~ 싶어서

엔티티 클래스 필드에 붙은 private를 지워봤다.

 

...

 

 

 

된다ㅡㅡ

 

 

자바에 익숙했고 당연히 필드는 private으로 두는게 맞다고 생각해서 그렇게 했는데
TypeORM에서는 쿼리시 조건을 문자열같은걸로 하는게 아닌, 실제 엔티티 클래스의 필드를 가리키도록 하고있다.

 

오타로 인한 실수를 방지할 수 있다는 점에서 좋다.

OOP 원칙이나 DDD 개발론을 Nest 로 개발하면서도 똑같이 적용하려 했는데

여기서는 다르게 접근해야 한다는 걸 깨달았다...


댓글 피드백은 언제나 환영합니다!

'BackEnd' 카테고리의 다른 글

Nest-cli로 프로젝트 생성 시 git 추적 안되는 문제  (0) 2024.08.21
Node.js 의 이벤트 루프  (1) 2024.03.05
JPA - 영속성 컨텍스트  (1) 2024.01.15
DDD - 엔티티와 밸류  (0) 2024.01.12
JPA 빠르게 훑어보기  (0) 2023.08.20