DataServer에서 매번 토큰을 체크하고 인증하는 middleware방식 대신, 한번 Authorization된 클라이언트라면 절차를 생략하고 허용된 시간동안 imgae, json을 upload할 수 있는 권한을 부여할 수 있는 방법을 고민하게 되었다.
The server is now ready to accept connections on port 6379 에서 실행이 기본임
redis-server.exe
- Key 값 설정 규칙
user:1000:followers
대신 u1000flw
로 사용하는 것은, 메모리상 이득은 작고 가독성은 해치는 것이다. (key가 차지하는 공간은 value에 비해 작기 때문에) 비록 작은 메모리상 이득은 있지만, 가독성과 메모리 효율사이의 적당한 균형을 찾아야 한다..
이나 -
가 주로 활용된다.comment:4321:reply.to
, comment:4321:reply-to
🚨 앞서 이야기한 것처럼, 캐시 서버에 문제가 발생할 경우를 대비하여, 캐시 미스 시 데이터베이스에서 정보를 가져올 수 있는 백업 로직이 필요하다.
캐싱 로직 추가:
캐싱 기간 설정
에러 처리
코드 예시
const redis = require('redis');
const client = redis.createClient(); // Redis 클라이언트 설정
module.exports = function setupUploadMiddleware(dbConnection) {
return async (req, res, next) => {
const token = req.headers.token;
const cacheKey = `auth:${token}`; // Redis에 저장될 키
// Redis에서 캐시된 값을 조회
client.get(cacheKey, async (err, cachedData) => {
if (err) {
// Redis 에러 처리
console.error('Redis error', err);
return res.status(500).send('Internal Server Error');
}
if (cachedData) {
// 캐시된 데이터가 있다면, 바로 다음 미들웨어로
return next();
} else {
// 캐시된 데이터가 없다면, DB에서 조회
try {
const result = await deviceRepository.findDeviceNameByOwnerId(req.headers.device_owner, req.headers.device_name, dbConnection);
if (result.length > 0 && result[0].http_token == token) {
// DB 조회 결과를 Redis에 저장
client.setex(cacheKey, 3600, JSON.stringify(result[0])); // 3600초 동안 캐시 유지
return next();
} else {
return res.status(401).send('HTTP auth (token) error');
}
} catch (error) {
console.error('DB error', error);
return res.status(500).send('Internal Server Error');
}
}
});
};
};
const client = redis.createClient(); // Redis 클라이언트 설정
node.js 애플리케이션이 Redis 서버의 클라이언트가 되어 서버와 통신할 수 있는 연결을 생성하고, 이 연결을 관리하는 Redis클라이언트 객체를 반환함.
즉, node.js는 redis모듈을 사용해 Redis 서버와의 통신을 담당한다. node가 redis.createClient()를 호출하면 Redis 서버에 연결하기 위한 클라이언트 객체를 생성한다. 이제 Redis 서버에 데이터를 쓰거나, 데이터를 읽는 등 작업을 수행할 수 있다.