✅오늘학습 Keyword
2023.06.10 - [프로젝트] - 230610 실전프로젝트10 [Node.js/Nest.js_redis 적용하기3]
✅오늘 겪은 문제
드디어...드디어 해결했다!! 팀원과 다른 분들이 작성한 코드를 그냥 가져다 쓰면 편했겠지만, 어느 부분에서 잘못됐는지 단계별로 위치별로 하나하나 다 체크하여 드디어 문제를 알아냈다. 문제해결 과정은 아래와 같다.
가장 큰 문제는 우선 라이브러리들의 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의 기본 구조를 확실히 파악하고 새로운 기술을 적용하는 것이 중요할 것 같다.
'개발 > 프로젝트-식당 웨이팅 앱 FOOD LINE' 카테고리의 다른 글
230615 실전프로젝트15 [Nest.js] 데이터베이스 migration, TypeORM (0) | 2023.06.15 |
---|---|
230613 실전프로젝트13 [GPS 기반 데이터 조회 속도개선!★] (0) | 2023.06.14 |
230610 실전프로젝트11 [Node.js/Nest.js_redis 적용하기3] (0) | 2023.06.10 |
230609 실전프로젝트10 [Node.js/Nest.js_redis 적용하기2] (1) | 2023.06.09 |
230607 실전프로젝트9 [Node.js/Nest.js_redis 적용하기] (0) | 2023.06.05 |