Ports and Adapters 방식을 사용하다보니 문득 문제가 생겼다.
그것은 바로 CustomRepository를 사용하면, Nest가 Repository를 모듈에 주입하지 못한다는 문제점이다.
보통 CustomRepository를 사용하면 다음과 같이 코드를 짤 수 있다.
// 물론, 여기서 CutomeTypeOrmModule은 직접 만든 것이다.
@Module({
imports: [CustomTypeOrmModule.forCustomRepository([UserRepository]),
],
providiers: [
{
provider: USER_REPOSITORY_OUTBOUND_PORT,
useClass: UserRepository,
}
],
})
export class CatModule {}
그런데, 여기서 보통 커스텀 레포를 import하고, service에서 repository를 쓸 때는 @InjectRepository 라는 데코레이터를 사용하는데,
내가 토큰을 사용하게 되면서, @InjectRepository가 아닌 @Inject 데코레이터를 사용해서 repository말고 port를 주입해서 인지... 아니면 어딘가 다른 곳이 잘못 된 건지 모르겠다.
그래서 어떻게 해야 해결할 수 있을지 생각해보았다.
커스텀레포를 고쳐보기도 했고, 모듈에 import를 잘못했나 계속 코드를 바꿔보았다. 그런데도 안되었다....
그래서 결국 @InjectRepository를 사용해야겠다고 판단을 하였고... 최종적으로 코드는 다음과 같이 변하였다.
// user.repository.ts
@Injectable()
export class UserRepository implements UserRepositoryOutboundPort {
constructor(
@InjectRepository(UserEntity)
private readonly userRepository: Repository<UserEntity>,
) {}
async getUserForLogIn(
params: getUserForLogInOutboundPortInputDto,
): Promise<getUserForLogInOutboundPortOutputDto> {
return await this.userRepository.findOne({
where: {
email: params.email,
},
withDeleted: true,
});
}
}
// user.module.ts
@Module({
imports: [
TypeOrmModule.forFeature([UserEntity]),
],
controllers: [UserController],
providers: [
{
provide: USER_CONTROLLER_INBOUND_PORT,
useClass: UserService,
},
{
provide: USER_REPOSITORY_OUTBOUND_PORT,
useClass: UserRepository,
},
],
})
export class UserModule {}
일단, CustomRepository가 아닌 그냥 일반 Repository를 사용하였고 모듈에서도 TypeOrmModule.forFeature를 이용하서 주입을 하였다.
'Back-end > nest.js' 카테고리의 다른 글
Nest.js : Nest.js로 Redis와 연동하여 세션 로그인 구현하기 (2) (0) | 2023.02.23 |
---|---|
Nest.js : Nest.js로 Redis와 연동하여 세션 로그인 구현하기 (1) (8) | 2023.02.19 |
Nest.js : Session 로그인을 위한 Redis 연동, 그리고 Ports and Adapters Architecture에 적용하기 (0) | 2023.02.16 |
Nest.js : Test시 Controller의 Decorator정보를 얻는 법 (0) | 2023.02.07 |
Nest.js : Ports and Adapters Architecture 구현하기 (1) (1) | 2023.02.03 |