본문 바로가기

11. Spring

[Spring] Redis 연동해보기

로그인 기능 구현 중에 생성한 세션을 서버측 세션 저장소에 보관해야 하는데 여러 방법 중 Redis에 보관 하는 방법에 흥미를 느껴서 실습을 해봤다.

 

Redis 연동 방법을 찾아보니 대게 Spring boot 기준으로 설명이 되어 있어서 좀 애를 먹었지만 여차 해서 성공한 과정을 풀어 써본다.

 

insert 후 select

 

개발환경

SpringFramework 5.3.18

Maven

 

추가한 의존성은 다음과 같다.

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.6.10</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.10.2</version>
</dependency>
<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>6.2.4.RELEASE</version>
</dependency>

 

파일 구성은 다음과 같다.

 

패키지의 경우 따로 분류하지 않고 같은곳에 몰아넣었다.

 

ㆍRedisConfig.java

Redis 연동을 위한 설정 클래스

package com.project.common.redis;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@EnableRedisRepositories
public class RedisConfig {
	
	@Value("${spring.redis.host}")
	private String redisHost;
	
	@Value("${spring.redis.port}")
	private int redisPort;
	
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration =
                new RedisStandaloneConfiguration(redisHost, redisPort);
        return new LettuceConnectionFactory(redisStandaloneConfiguration);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

 

 

ㆍRedisMapper.java

Repository 역할을 하는 클래스 (이름은 편의상 Mapper로 지칭)

package com.project.common.redis;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository("RedisMapper")
public class RedisMapper {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisMapper(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

	// select
    public Object findById(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    // insert
    public void save(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    // Update
    public void update(String key, Object newValue) {
        redisTemplate.opsForValue().set(key, newValue);
    }

    // Delete
    public void delete(String key) {
        redisTemplate.delete(key);
    }

    // Multi select
    public List<Object> getValuesForKeys(List<String> keys) {
        return redisTemplate.opsForValue().multiGet(keys);
    }

    // Multi insert
    public void setMultipleKeys(Map<String, Object> keys) {
        redisTemplate.opsForValue().multiSet(keys);
    }
}

 

단일 CRUD와 Multi select, insert로 구성하였다.

 

 

ㆍRedisService.java

Service 역할을 하는 클래스

package com.project.common.redis;


import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.project.common.redis.RedisMapper;

@Service
public class RedisService {
	
	@Resource(name="RedisMapper")
    private final RedisMapper redisMapper;

    public RedisService(RedisMapper redisMapper) {
        this.redisMapper = redisMapper;
    }
    
    /**
     * Redis select
     */
    public Object redisSelect(String key) {
        return redisMapper.findById(""+key+"");
    }
    
    /**
     * Redis insert
     */
    public void redisInsert(String key, Map<String, Object> map) {
    	redisMapper.save(key, map.get(""+key+""));
    }
    
    /**
     * Redis update
     */
    public void redisUpdate(String key, Map<String, Object> map) {
        redisMapper.update(key, map.get(""+key+""));
    }

    /**
     * Redis delete
     */
    public void redisDelete(String key) {
    	redisMapper.delete(""+key+"");
    }
    
    /**
     * Redis Multi select
     */
    public Object redisMultiSelect(List<String> keys) {
        return redisMapper.getValuesForKeys(keys);
    }
    
    /**
     * Redis Multi insert
     */
    public void redisMultiInsert(Map<String, Object> keys) {
    	redisMapper.setMultipleKeys(keys);
    }
}

 

 

ㆍredis.properties

Redis 관련 설정이 있는 properties

# Redis connection properties
spring.redis.host=localhost
spring.redis.port=6379

 

RedisConfig.java 에서 properties 값을 갖고 갈 수 있도록 servlet쪽에 설정 추가

<context:property-placeholder location="classpath:/spring/props/*.properties"/>

 

 

로그인 후에 세션 설정에 대한 코드를 이해 못해서 그냥 테스트를 위해 이런식으로 코드를 작성했다.

Map<String, Object> redis = new HashMap<>();
redis.put("testAdmin", UUID.randomUUID().toString());
redisService.redisInsert("testAdmin", redis);

logger.debug("redis Select = "+redisService.redisSelect("testAdmin"));

 

로그인 컨트롤러쪽에 로그인을 했을 경우 해당 key와 UUID를 주어 insert 한 다음 로그에 select로 값을 조회하였다.

 

결과는 위에 사진과 동일.

'11. Spring' 카테고리의 다른 글

[Spring]@RequestBody, @ResponseBody  (0) 2023.12.12
[Spring]Spring MVC  (0) 2023.12.01
[Spring]web.xml  (0) 2023.12.01
[Maven]pom.xml  (0) 2023.11.30
Spring 카테고리  (0) 2023.11.27