본문 바로가기
개발/프로젝트-식당 웨이팅 앱 FOOD LINE

230612 실전프로젝트12 [Node.js/Nest.js_redis 적용하기4]

by 코딩하는짱구 2023. 6. 12.
반응형

✅오늘학습 Keyword

2023.06.10 - [프로젝트] - 230610 실전프로젝트10 [Node.js/Nest.js_redis 적용하기3]

 

230610 실전프로젝트10 [Node.js/Nest.js_redis 적용하기3]

✅오늘학습 Keyword 2023.06.09 - [프로젝트] - 230609 실전프로젝트9 [Node.js/Nest.js_redis 적용하기2] 230609 실전프로젝트9 [Node.js/Nest.js_redis 적용하기2] ✅오늘학습 Keyword 2023.06.05 - [프로젝트] - 230607 실전프

veritas-crystal.tistory.com

 

 

✅오늘 겪은 문제

드디어...드디어 해결했다!! 팀원과 다른 분들이 작성한 코드를 그냥 가져다 쓰면 편했겠지만, 어느 부분에서 잘못됐는지 단계별로 위치별로 하나하나 다 체크하여 드디어 문제를 알아냈다. 문제해결 과정은 아래와 같다.

 

가장 큰 문제는 우선 라이브러리들의 version 문제였다. 

나 혼자서 구글링, 해당 라이브러리의 github등 엄청나게 구글링 하며 다운그레이드, 업그레이드를 해보았지만

해결할 수 없었던 문제가 가장 컸다. 

 

문제해결1. 

다른사람이 만든 RedisModule로 나의 stores.module, service, controller 실험
1. stores.service, waitings.service 코드 비교-> 이상없음
2. stores.controller, waitings.controller 코드 비교 -> 이상없음
3. 타인의 redis.service에 연결 했는데 내 stores api에선 연결이 안됌. 이유는?
4. stores.module, waitings.module 비교 
stores.module의 providers에 등록돼있던 RedisService를 주석처리 해줬음
+중복으로 등록되있던 RedisModule을 올바른 경로로 지정했더니data가 들어감!!

 

즉 다른 api의 service나 repository는 그 api의 module을 꼭 거치지 않아도 가져와서 쓸 수 있지만 

redis는 module을 거쳐야만 하는 구조이기 때문에 module을 반드시 imports 해줘야하고, 

module이 이미 imports된 상태에서 providers에 중복으로 service를 등록하니 에러가 나는 것 이였다. 

 

수정을 해줌으로써 stores.module, service, controller는 이상이 없어졌다.

 

stores.module.ts

import { ElasticsearchModule } from '@nestjs/elasticsearch';
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { StoresController } from './stores.controller';
import { StoresService } from './stores.service';
import { Stores } from './stores.entity';
import { StoresRepository } from './stores.repository';
import { LocationService } from '../location/location.service';
import { Tables } from '../tables/tables.entity';
import { TablesRepository } from '../tables/tables.repository';
import { ReviewsRepository } from '../reviews/reviews.repository';
import { Reviews } from '../reviews/reviews.entity';
import * as dotenv from 'dotenv';
import { RedisCacheModule } from 'src/cache/cache.module';
import { RedisModule } from 'src/redis/redis.module';

dotenv.config();

@Module({
  imports: [
    TypeOrmModule.forFeature([Stores, Tables, Reviews]),
    ElasticsearchModule.register({
      node: 'http://localhost:9200',
      maxRetries: 10,
      requestTimeout: 60000,
      pingTimeout: 60000,
      sniffOnStart: true,
    }),

    RedisModule,
    RedisCacheModule,
  ],
  controllers: [StoresController],
  providers: [
    StoresService,
    LocationService,
    StoresRepository,
    TablesRepository,
    ReviewsRepository,
    // RedisService,
    // CacheService,
  ],
})
export class StoresModule {}

 

문제해결2.

내가 만든 RedisModule로 나의 stores.module, service, controller 실험

src/stores의 코드가 정상인걸로 확인이 됐고 이번엔 나의 로컬 redis server에 제대로 연결되는지 확인해보기로했다.

1. 나의 RedisModule에서 env파일을 내 로컬 주소로 설정했다.

import { CacheModule } from '@nestjs/cache-manager';
import { Module } from '@nestjs/common';
import * as redisStore from 'cache-manager-ioredis';
import { CacheService } from './cache.service';

@Module({
  imports: [
    //CacheModule resgister에 인자를 넘겨주어야 한다. (공식문서)
    CacheModule.registerAsync({
      useFactory: () => ({
        store: redisStore,
        host: 'localhost',
        port: 6379,
      }),
    }),
  ],
  controllers: [],
  providers: [CacheService],
  exports: [CacheService],
})
export class RedisCacheModule {}

2. 우선 stores.module에 나의 RedisModule을 등록해주고
3. stores.service에서 실험했지만 data 안들어감. 그렇다면 내가 설정한 모듈과 서비스가 잘못됐다는 결론을 도출한다.
4. 살펴보니 stores.module에 cachemodule.register가 등록되어있었음

import { ElasticsearchModule } from '@nestjs/elasticsearch';
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { StoresController } from './stores.controller';
import { StoresService } from './stores.service';
import { Stores } from './stores.entity';
import { StoresRepository } from './stores.repository';
import { LocationService } from '../location/location.service';
import { Tables } from '../tables/tables.entity';
import { TablesRepository } from '../tables/tables.repository';
import { ReviewsRepository } from '../reviews/reviews.repository';
import { Reviews } from '../reviews/reviews.entity';
import * as dotenv from 'dotenv';
import { RedisCacheModule } from 'src/cache/cache.module';
import { RedisModule } from 'src/redis/redis.module';
import { CacheModule } from '@nestjs/cache-manager';

dotenv.config();

@Module({
  imports: [
    CacheModule.register(),
    TypeOrmModule.forFeature([Stores, Tables, Reviews]),
    ElasticsearchModule.register({
      node: 'http://localhost:9200',
      maxRetries: 10,
      requestTimeout: 60000,
      pingTimeout: 60000,
      sniffOnStart: true,
    }),

    RedisModule,
    RedisCacheModule,
  ],
  controllers: [StoresController],
  providers: [
    StoresService,
    LocationService,
    StoresRepository,
    TablesRepository,
    ReviewsRepository,
    // RedisService,
    // CacheService,
  ],
})
export class StoresModule {}

 

5. 잘못 import된 CacheModule.register()를 없애주자 드디어!! 내 local서버에도 연결이 됐다.ㅠㅠ

import { ElasticsearchModule } from '@nestjs/elasticsearch';
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { StoresController } from './stores.controller';
import { StoresService } from './stores.service';
import { Stores } from './stores.entity';
import { StoresRepository } from './stores.repository';
import { LocationService } from '../location/location.service';
import { Tables } from '../tables/tables.entity';
import { TablesRepository } from '../tables/tables.repository';
import { ReviewsRepository } from '../reviews/reviews.repository';
import { Reviews } from '../reviews/reviews.entity';
import * as dotenv from 'dotenv';
import { RedisCacheModule } from 'src/cache/cache.module';
import { RedisModule } from 'src/redis/redis.module';

dotenv.config();

@Module({
  imports: [
    // CacheModule.register(), 잘못 IMPORT했었음. 참고 위해 남겨둡니다.
    TypeOrmModule.forFeature([Stores, Tables, Reviews]),
    ElasticsearchModule.register({
      node: 'http://localhost:9200',
      maxRetries: 10,
      requestTimeout: 60000,
      pingTimeout: 60000,
      sniffOnStart: true,
    }),

    RedisModule,
    RedisCacheModule,
  ],
  controllers: [StoresController],
  providers: [
    StoresService,
    LocationService,
    StoresRepository,
    TablesRepository,
    ReviewsRepository,
    // RedisService,
    // CacheService,
  ],
})
export class StoresModule {}

 

감동ㅠㅠㅠㅠㅠㅠ

 

결론적으로 module 설정에서 많은 착오가 있었던 것 같다. 

아직까지 module개념에 익숙하지 않았고 이것저것 실험하면서 추가/삭제하는 과정에서 꼬였던 것 같았다. 

그래서 module의 imports, providers의 개념에 대해 다시 한번 정리했다. 

 

  • imports: 현재 모듈이 다른 모듈을 가져와 사용하도록 지정, 현재 모듈에서 사용할 다른 모듈들의 리스트, 다른 모듈들을 imports에 추가하면 해당 모듈이 현재 모듈에서 제공하는 providers, controller와 상호작용
  • providers: 현재 모듈에서 사용가능한 service, repository, factory의 목록을 정의하는 속성. 현재 모듈에서 사용할 프로바이더들이 포함된다. 
  • 즉 imports는 현재 모듈에서 다른 모듈을 가져와 의존성 주입, provider는 현재 모듈에서 사용가능한 service등을 정의.

✅오늘 겪은 문제

nest.js의 기본 구조를 확실히 파악하고 새로운 기술을 적용하는 것이 중요할 것 같다.

 

반응형