NestJS에서 모듈 간 순환 종속성을 없애보자

윤학·2023년 5월 30일
0

Nestjs

목록 보기
7/13
post-thumbnail

NestJS로 간단한 프로젝트를 진행하다 인증 모듈과 사용자 모듈간 Circular dependency가 발생했다.

실제로 이전 프로젝트에서도 이런 문제가 발생했었는데, 그때는 forwardRef()로 해결했던 기억이 있다.

이번에도 시작하기 전부터 이 문제가 발생할 것을 어느정도 알고 있었고, 실제로 의존성을 끊어보자라는 생각으로 임시로 Route를 한쪽으로 몰아두었다.

그럼 왜 발생할까?

인증 모듈에서는 아이디에 맞는 사용자를 찾기 위해 userRepository가 필요하고, 사용자 모듈에서는 새로운 인증(토큰)을 발급받기 위하여 authService가 필요하다.

각각의 provider는 각 모듈에서 export하고 있기에 필요하면 해당 모듈을 import해야 하는데
이때, 서로가 서로를 import하기 때문에 발생하는 것이다.

해결방법은?

1. Nest에서 제공하는 방법

Nest에서는 forwardRef()와 moduleRef()로 이 문제를 해결할 수 있는데 아직 정의되지 않은 provider를 참조할 수 있게 해준다.

moduleRef()로 해결한 경험은 없기에 관련된 내용은 문서에서 더 자세히 볼 수 있다.

2. 하나의 모듈로 묶기

서로 참조하고 있는 모듈을 분리하지 않고 하나의 모듈 안에 전부 넣어도 해결은 될 것 같다.

나누어져 있는 두 모듈이 함께 변경되어야 한다면 처음부터 하나의 모듈에 같이 있는게 맞다고 한다.

하지만 사용자와 인증은 독립적으로 확장될 수 있다고 생각하였고, 분리되어 있던 모듈의 의존성을 끊어보고자 다음 방법으로 해보았다.

3. 공통 모듈 만들기

두 모듈이 공통적으로 의존하고 있는 공급자를 새로운 모듈로 빼는 것이다.

필자의 경우에는 사용자 모듈에서는 토큰 갱신을 위해 무조건 인증 모듈의 service가 필요했다.

그래서 인증 모듈에서 사용자 모듈로 향하는 의존성을 끊어야만 했다.

사용자 모듈의 Repository만 참조하고 있었기 때문에 Repository를 공통 모듈에 집어넣었다.

user-auth-common.module.ts

@Module({
    imports: [
        TypeOrmModule.forFeature([User, Password, LoginBlockInfo, UserAuthentication])
    ],
    providers: [
        UserAuthCommonRepository,
        UserAuthCommonMapper
    ],
    exports: [
        UserAuthCommonRepository,
        UserAuthCommonMapper
    ]
})

이렇게 만들면 인증 모듈과 사용자 모듈에서는 로그인, 회원가입, 비밀번호 변경등과 같은 로직수행에 필요한 사용자를 찾기 위해 UserAuthCommonModule을 Import해서 사용하면 된다.

user.module.ts

@Module({
    imports: [
        UserAuthCommonModule,
        AuthModule
    ],
    controllers: [UserController],
    providers: [
        UserMapper,
        UserService,
    ]
}) 

auth.module.ts

@Module({
    imports: [
        JwtModule.register(jwtModuleOption),
        UserAuthCommonModule,
        PassportModule
    ],
    controllers: [AuthController],
    providers: [AuthService, JwtStrategy],
    exports: [AuthService]
})

마치면서

개인적으로 더 좋은 방법이 있을수도 있겠지만 현재로는 이 방법밖에 떠오르지 않는다...

모듈 간 의존성을 잘 생각해보자.

참고

Circular Dependency - NestJS
우아한객체지향

0개의 댓글