페어 활동 기록_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개 정보 제대로 가져오는지 확인

🖥️ 구현 내용

📖 학습 내용

🩺 의사결정

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'
}

로컬 접속

  • 클라우드로 접속했을 때 오류가 났으니, 로컬에 redis를 설치해서 접속해보자

    → 로컬에 있는 redis는 잘 접속됨

클라우드 접속

  • 현정 로컬에서는 클라우드로 접속이 잘 됨
  • 한빈 로컬에서는 클라우드로 접속이 안 됨

→ 로컬에 redis를 설치하지 않아서 나는 오류?

→ 둘 다 로컬에 redis가 설치되어 있었다.

다른 라이브러리 사용

  • ioredis로 바꿔서 사용해도 똑같은 에러가 발생했음

❓ 궁금한 점

redis 연결 오류

  • 결국 한빈 로컬에서는 끝까지 클라우드 redis에 연결되지 않았음
  • 도대체 무엇이 문제일까…
  • 방화벽 문제? → 한빈은 라이브쉐어로 다른 사람 로컬에 있는 서버 포트에 접속하지 못함