Back-end/nest.js

Nest.js : Ports and Adapters Architecture 구현하기 (2)

hsloth 2023. 2. 16. 16:01

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를 이용하서 주입을 하였다.