본문 바로가기

javascript/이외

node redis : 노드 환경에서 사용하는 redis 데이터베이스

 인터넷 강의를 들으면서 공부하다 보니 redis 데이터베이스를 사용하는 상황이 생겼다. 해당 강의에서는 레디스를 노드 환경과 연결하기 위해서 npm의 redis 패키지를 이용했고, 이 글에서도 해당 패키지에 대해 간단하게 정리할 것이다.

주소는 다음과 같다. https://www.npmjs.com/package/redis

 

공식문서가 약간 이미 v3 이하를 사용했음을 전제하고 설명하지 않는 부분이 좀 있는 것 같다.

v3 문서는 여기. https://www.npmjs.com/package/redis/v/3.1.2


 이 글을 쓰는 시점에 해당 패키지의 최신 버전 은 v4이다. 클라이언트 생성 시 설정하는 부분이나 async 코드의 사용 가능 여부, pub/sub 구조에서의 이벤트의 비중 등 몇몇 부분에서 자질구레한 차이가 존재한다. 인터넷에 현재 패키지를 사용하는 방법을 찾으면 대부분 v3 이전 기준으로 작성되어 있으므로 적당히 사용할 버전을 선택하자.

 

레디스와 노드 환경의 연결

createClient 메서드를 이용한다.

const redisClient = createClient({
    socket: {
        host: keys.redisHost,
        port: keys.redisPort,
        reconnectStrategy: () => 1000
    }
});

await redisClient.connect();

세세한 설정 : https://github.com/redis/node-redis/blob/master/docs/client-configuration.md

 v3과는 달리 v4에서는 host, port 등의 설정을 socket 객체 안에서 지정한다. 더 특징적인 부분은 connect 메서드이다. v4가 되면서 더이상 createClient는 설정된 레디스 데이터베이스와 자동으로 연결을 시도하지 않는다. 데이터베이스와의 연결 기능은 connect 라는 별개의 메서드로 이동했으므로, 해당 메서드를 이용해야만 연결이 수행된다.

간단한 get/set

생성된 클라이언트의 get, set, hGet, hSet 등의 메서드를 이용한다. 각 함수들은 비동기로 동작한다.

const value = await redisClient.get('key'); // 'key'로 저장된 값을 불러온다.
await redisClient.set('key',value); // 'key' 라는 이름으로 value를 저장한다.

const hvalue = await redisClient.hGet('key', 'field'); 
	// key의 field에 해당하는 값을 가져온다.
await redisClient.hSet('key','field','value'); 
	// key의 field에 해당하는 값을 설정한다.

// ... 이외 많은 메서드가 존재하는데, 공식 문서를 참고.

 

Pub/Sub 구조

 pub/sub 구조는 pub 측에서 특정 메시지를 전파하면 해당 퍼블리셔를 구독(subscribe) 하고 있는 sub가 해당 메시지를 받는 구조를 의미하는데, 흔히 사용하는 구독 시스템과 유사한 것으로 보인다.

 redis 패키지를 이용하면 해당 구조를 간단하게 이용할 수 있다. redis 패키지 공식문서에서는 pub/sub 구조를 이용할 때 기존 클라이언트를 duplicate 메서드를 통해 복사한 후, connect을 통해 데이터베이스와 연결하여 이용한다.

 채널에 해당하는 이름은 미리 지정된 것이 아니므로, 필요한 경우에 자기 마음대로 통합해서 사용하면 된다. 

const redisClient1 = createClient();
const redisClient2 = createClient();
// 기본 클라이언트들

await redisClient1.connect();
await redisClient2.connect();
// 클라이언트를 데이터베이스와 연결

const pub = redisClient1.duplicate();
await pub.connect();

const pub = redisClient2.duplicate();
await pub.connect();
// pub/sub 구조를 이용하기 위해 기존 클라이언트를 duplicate & connect

pub.publish('channel', 'message');
// pub 측에서 'channel'이라는 채널을 통해 'message'를 해당 채널 구독자에게 전파.
//...

sub.subscribe('channel', (message, channel) => {
	//do something
});
// sub 측에서는 'channel' 채널에 대한 메시지를 구독하고, 메시지가 도달할 때마다 콜백 함수 실행.

 v4 이전에는 subscribe을 이용할 때 eventListener 을 설정하듯이 이벤트 기반으로 동작했다.

sub.on('message', async (channel, message) => {
    console.log("message: ", message);
    console.log("channel", channel);
    redisClient.hSet('values', message, fib(parseInt(message)));
});
await sub.subscribe('insert');

 이전 버전에서는 sub 객체의 on 메서드에 '이벤트 이름' , '대응되는 콜백' 을 등록한 후 해당 sub 객체가 특정 이름의 채널을 subscribe 메서드를 통해 구독하는 방식이었으나, 공식 문서에 따르면 v4로 업데이트 되면서 on을 이용한 message-like event 가 사라지는 대신, subscribe 함수 내에서 기존 이벤트들에 대응되는 동작을 수행할 수 있다. 남은 이벤트는 connect, ready, end. error, reconnecting 이 존재하는데, 네트워크의 상태 변경과 관련된 이벤트들 뿐이다.


 ​이외 많은 기능이 있겠지만, 공식 문서가 꽤 친절해서 필요한 것을 적당히 찾아 쓸 수 있을 것이다.

 현재 redis 패키지를 사용할 때 중요한 점은 기존 버전과 현재 버전 사이에서 발생하는 혼동을 줄이는 것이다. 인터넷을 통해 찾을 수 있는 많은 정보들은 v3 이전 기준이므로, 많은 부분이 v4와 호환되지 않기 때문에, 정말 많은 에러가 버전에 따른 차이점에 의해 발생할 수 있다. 이에 주의하며 코드를 작성하면 정말 쉬운 라이브러리이므로 큰 문제가 없을 것으로 보인다.