본문 바로가기
Back-end/nest.js

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

by hsloth 2023. 2. 16.

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