로그인 기능 구현 중에 생성한 세션을 서버측 세션 저장소에 보관해야 하는데 여러 방법 중 Redis에 보관 하는 방법에 흥미를 느껴서 실습을 해봤다.
Redis 연동 방법을 찾아보니 대게 Spring boot 기준으로 설명이 되어 있어서 좀 애를 먹었지만 여차 해서 성공한 과정을 풀어 써본다.
개발환경
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 |