Spring(boot)에서 Redis를 설정하는 것은 무척 간단하다. 레디스를 이용해서 간단하게 페이지 방문자수를 업데이트해주는 것을 만들어보자.

먼저 메이븐에서 먼저 관련 라이브러리를 추가해주자.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

application.yml 에 레디스 url, port등을 입력하자

server:
  port: 8080

spring:
  profiles:
    active:
    - local
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp    
  redis:
    host: 127.0.0.1
    port: 6379

설정은 이것으로 끝났다. 이제 스프링에서 레디스를 읽어올 Java Config를 만든다.

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.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;


@Configuration
public class RedisConfig {
	
	private @Value("${spring.redis.host}") String redisHost;
	private @Value("${spring.redis.port}") int redisPort;

	@Bean
	public JedisConnectionFactory connectionFactory() {				
		JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
		jedisConnectionFactory.setHostName(redisHost);
		jedisConnectionFactory.setPort(redisPort);
		jedisConnectionFactory.setUsePool(true);		
		return jedisConnectionFactory;
	}
	
	@Bean
	public RedisTemplate<String, Object> redisTemplate() {
		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		redisTemplate.setValueSerializer(new StringRedisSerializer());
		redisTemplate.setConnectionFactory(connectionFactory());		
		return redisTemplate;
	}
}

jedisConnectionFactory 를 통해서 Redis 컨넥션을 관리해준다.

RedisTemplate 를 이용해서 실제 레디스를 스프링에서 사용하는데 중요한 것은 setKeySerializer(), setValueSerializer() 메소드들이다. 이 메소드를 빠트리면 실제 스프링에서 조회할 때는 값이 정상으로 보이지만 redis-cli로 보면 key값에 \xac\xed\x00\x05t\x00\x0 이런 값들이 붙는다. (관련 내용)

이제 Redis를 사용하는 Service를 만들어보자

import javax.annotation.Resource;

import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

@Service
public class RedisService {
	
	@Resource(name = "redisTemplate")
	private ValueOperations<String, String> valusOps;	
	
	public Long getVisitCount() {
		Long count = 0L;
		try {
			valusOps.increment("spring:redis:visitcount", 1);		
			count = Long.valueOf(valusOps.get("spring:redis:visitcount"));
		} catch (Exception e) {
			System.out.println(e.toString());
		}
		return count;
	}
}

RedisTemplate에서 필요한 타입을 가져오면 된다. 레디스에서 숫자 증가를 처리할 수 있는 incr를 사용하기 위해서 ValueOperations를 이용한다. 이렇게 각각 레디스에 대응되는 타입이나 메소드를 RestTemplet 레퍼런스에서 쓰고 그에 관련된 메소드를 만들면 편하게 사용할 수 있다.

이제 Controller에서 가져다 쓰면된다.

@Controller
public class HomeController {

	@Autowired
	private RedisService redisService;
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public ModelAndView index() {
		ModelAndView model = new ModelAndView("index");
		model.addObject("count", redisService.getVisitCount());
		return model;
	}
}

이제 페이지에 접근할때마다 방문자수가 증가한다.