페어 활동 기록_Day17_한빈_현정 - boostcampwm-2022/web33-Mildo GitHub Wiki
✂️ 분배된 이슈
- crontab 서버에서 Redis / RabbitMQ 를 사용하여 24시간 이내의 정보 저장(#33)
- api 서버에서 Redis / RabbitMQ 를 사용하여 24시간 이내의 정보 응답(#36)
🚩 구현 목표
- crontab 서버의 데이터를 Redis에 저장하고 불러오는 기능 구현
🍀 세부 목표
crontab 서버에서 Redis에 24시간 이내의 정보 저장(#33)
- cron.controller.ts 작동 방식 확인하기
- 서울시 실시간 도시데이터를 crontab 서버로 가져옴
- redis cloud 가입
- crontab 서버에 Redis 서버 연결
- 가져온 데이터를 MongoDB에 저장
- 가져온 24시간 데이터는 Redis에도 저장
- redis 삭제 조건 설정하기
api 서버에서 Redis에서 가져온 24시간 이내의 정보 응답(#36)
- redis에서 최근 정보 가져오기
- redis에서 모든 정보 가져오기
- Redis에서 최근 50개 정보 가져오는 router 생성
- Redis에서 최근 24시간 정보 가져오는 router 생성
- 클라이언트에서 Redis 최근 50개 정보 제대로 가져오는지 확인
🖥️ 구현 내용
📖 학습 내용
- node-cron 기본적인 사용법
- ‘분 시 일 월 주’로 주기 명령어 입력
- 매 분 시작 : * * * * *
- 3분마다 시행 : */3 * * * *
- 참고 사이트 : https://www.letmecompile.com/scheduler-cron-tutorial/
- nodejs에서 redis 라이브러리 사용법
- 현재 redis는 v4인데 v3 문법을 사용하고 싶으면 createClient에서 legacyMode를 true로 설정하면 됨
- key에 expires 설정할 때는 setEX(key, 시간, value)로 하면 됨
- 명령어 모음 : [https://inpa.tistory.com/entry/REDIS-📚-데이터-타입Collection-종류-정리#Strings_명령어_리스트](https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85Collection-%EC%A2%85%EB%A5%98-%EC%A0%95%EB%A6%AC#Strings_%EB%AA%85%EB%A0%B9%EC%96%B4_%EB%A6%AC%EC%8A%A4%ED%8A%B8)
- 타입스크립트 환경변수 타입 설정 방법
🩺 의사결정
Redis key, value
- key를 populationDate로, value를 MongoDB populations 콜렉션 타입 그대로 사용
Redis Recent Data
- 가장 최근 값의 key를 recent라는 key의 value로 설정하여 최근 값을 쉽게 가져오기
- 최근 데이터를 불러오는 router와 모든 데이터를 불러오는 router 모두 구현
Redis All Data
- 모든 데이터를 가져와서 장소명으로 필터링해서 client로 보내주기
🚧 Trouble Shooting
서울시 도시데이터 응답 오류
json: {
RESULT: {
CODE: [ 'ERROR-500' ],
MESSAGE: [
'서버 오류입니다.\n' +
'지속적으로 발생시 열린 데이터 광장으로 문의(Q&A) 바랍니다.(HTTP operation failed invoking http://openapi.seoul.go.kr:8088/647243466c68616e31303769674d514f/xml/citydata/1/5/%EA%B4%91%ED%99%94%EB%AC%B8%C2%B7%EB%8D%95%EC%88%98%EA%B6%81 with statusCode: 500)'
]
}
}
- 서울시 실시간 도시 데이터API 자체에서 나는 오류로 시간이 지나니 알아서 해결
- 서울시 API가 안되는 상황에서 서비스 어떻게 제공할지 고민해볼 필요
Redis 연결 오류
-
ConnectionTimeoutError: Connection timeout
- 연결하는 데 시간이 초과되어서 연결이 안 되는 것 같다.
-
기존 코드
let redisClient: RedisClientType = createClient({ url: `redis://${process.env.REDIS_USERNAME}:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/0`, password: process.env.REDIS_PASSWORD });
-
변경 코드
const redisClient: RedisClientType = createClient({ socket: { host: process.env.REDIS_HOST, port: parseInt(process.env.REDIS_PORT), connectTimeout: 50000 }, username: process.env.REDIS_USERNAME, password: process.env.REDIS_PASSWORD });
createClient
파라미터 타입들을 살펴보았을 때socket
속성에서connectTimeout
속성을 받는다는 것을 발견했다.- connectTimeout을 50000으로 설정하니 timeout 에러는 해결되었음
getaddrinfo : Error: getaddrinfo ENOTFOUND
Error: getaddrinfo ENOTFOUND redis-17995.c15.us-east-1-2.ec2.cloud.redislabs.com
at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:107:26) {
errno: -3008,
code: 'ENOTFOUND',
syscall: 'getaddrinfo',
hostname: 'redis-17995.c15.us-east-1-2.ec2.cloud.redislabs.com'
}
- [EAI_AGAIN](https://ordinary-code.tistory.com/177?category=957304) : DNS 조회시간 초과 오류
- 클라우드로 생성한 redis 데이터베이스를 접속하지 못하는 것 같다.
- 접속하지 못하니 timeout 에러도 나는 것
로컬 접속
-
클라우드로 접속했을 때 오류가 났으니, 로컬에 redis를 설치해서 접속해보자
→ 로컬에 있는 redis는 잘 접속됨
클라우드 접속
- 현정 로컬에서는 클라우드로 접속이 잘 됨
- 한빈 로컬에서는 클라우드로 접속이 안 됨
→ 로컬에 redis를 설치하지 않아서 나는 오류?
→ 둘 다 로컬에 redis가 설치되어 있었다.
다른 라이브러리 사용
- ioredis로 바꿔서 사용해도 똑같은 에러가 발생했음
❓ 궁금한 점
redis 연결 오류
- 결국 한빈 로컬에서는 끝까지 클라우드 redis에 연결되지 않았음
- 도대체 무엇이 문제일까…
- 방화벽 문제? → 한빈은 라이브쉐어로 다른 사람 로컬에 있는 서버 포트에 접속하지 못함