A클래스에 B가 필요하고 B 클래스에도 A가 필요할 때 발생
ex)
auth에서 UserModule을 사용하고
user에서도 AuthModule을 사용할 때 발생
NestJS에서는 정방향 참조를 사용해 해결
Module에서 import할 때 forwardRef 로 감싸줌
변경 전
JwtAuthGuard
@Injectable()
export class JwtAuthGuard extends AuthGuard("jwt") {
constructor(private jwtService: JwtService, private authService: AuthService) {
super();
}
...
user.module.ts
@Module({
imports: [
AuthModule,
TypeOrmModule.forFeature([UserRepository]),
JwtModule.register({
secret: process.env.JWT_SECRET,
}),
],
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
auth.module.ts
@Module({
imports: [
UserModule,
JwtModule.register({
secret: process.env.JWT_SECRET,
}),
],
controllers: [AuthController],
providers: [AuthService, NaverStrategy, JwtStrategy],
exports: [AuthService],
})
변경 후
JwtAuthGuard 동일
user.module.ts
@Module({
imports: [
forwardRef(() => AuthModule),
TypeOrmModule.forFeature([UserRepository]),
JwtModule.register({
secret: process.env.JWT_SECRET,
}),
],
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
auth.module.ts
@Module({
imports: [
forwardRef(() => UserModule),
JwtModule.register({
secret: process.env.JWT_SECRET,
}),
],
controllers: [AuthController],
providers: [AuthService, NaverStrategy, JwtStrategy],
exports: [AuthService],
})
@Component
public class Chicken {
@Autowired
Egg egg;
public void layEgg(){
egg.becomeChicken();
}
}
닭은 달걀을 낳고, 달걀은 닭이 된다.
@Component
public class Egg {
@Autowired
Chicken chicken;
public void becomeChicken() {
chicken.layEgg();
}
}
달걀은 닭이 되고, 닭은 달걀을 낳는다.
@Bean
public CommandLineRunner run(Chicken chicken, Egg egg) throws Exception {
return (String[] args) -> {
chicken.layEgg(); // 실행
};
}
여기에서 닭이 달걀을 낳는다를 실행시키면!
java.lang.StackOverflowError: null