티스토리 뷰

지난 시간에는 간단히 Window 환경에 Redis를 설치해 보았다. 

 

Windows 10 환경에 Redis 설치해보기

Monolithic 환경에서 점점 벗어나고 MSA 지향적인 환경으로 변화함에 따라 기존의 세션 방식을 사용하기가 어려워졌다. 여러가지 방안이 나왔고 세션을 사용하는 방식 중 가장 많이 쓰이고 있는건

oingdaddy.tistory.com

이번에는 이것을 기반으로 간단한 샘플 프로젝트를 만들어 보자. 기본적인 Springboot 기반의 application만 있으면 된다. 


프로젝트 환경

필자는 springboot 2.3.4.RELEASE, JDK 1.8을 사용하여 샘플 프로젝트를 구성하였다. 

 

 

프로젝트 설정

pom.xml

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

springboot 수행을 위해 필요한 spring-boot-starter-web과 springboot와 redis와 연동을 위해 필요한 spring-boot-starter-data-redis dependency를 추가한다. 

 

 

application.yml (or application.properties)

spring:
  redis:
    lettuce:
      pool:
        max-active: 10
        max-idle: 10
        min-idle: 2
    port: 6379
    host: 127.0.0.1
    password: 'abcde'

application.yml 파일에는 위와 같은 내용을 추가해준다. 각 들어갈 항목에 대한 설명은 다음 표를 참조하자. 

변수 기본값 설명
spring.redis.database 0 커넥션 팩토리에 사용되는 데이터베이스 인덱스
spring.redis.host localhost 레디스 서버 호스트
spring.redis.password 레디스 서버 로그인 패스워드  
spring.redis.pool.max-active 8 pool에 할당될 수 있는 커넥션 최대수 (음수로 하면 무제한)
spring.redis.pool.max-idle 8 pool의 "idle" 커넥션 최대수 (음수로 하면 무제한)
spring.redis.pool.max-wait -1 pool이 바닥났을 때 예외발생 전에 커넥션 할당 차단의 최대 시간 (단위: 밀리세컨드, 음수는 무제한 차단)
spring.redis.pool.min-idle 0 풀에서 관리하는 idle 커넥션의 최소 수 대상 (양수일 때만 유효)
spring.redis.port 6379 레디스 서버 포트
spring.redis.sentinel.master 레디스 서버 이름  
spring.redis.sentinel.nodes 호스트:포트 쌍 목록 (콤마로 구분)  
spring.redis.timeout 0 커넥션 타임아웃 (단위: 밀리세컨드)

참조 : zetawiki.com/wiki/%EC%8A%A4%ED%94%84%EB%A7%81_REDIS_%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0

 

 

RedisConfig.java

@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String redisHost;
	
    @Value("${spring.redis.port}")
    private String redisPort;
	
    @Value("${spring.redis.password}")
    private String redisPassword;
	
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(redisHost);
        redisStandaloneConfiguration.setPort(Integer.parseInt(redisPort));
        redisStandaloneConfiguration.setPassword(redisPassword);
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
        return lettuceConnectionFactory;
    }

    @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;
    }
}

다음은 Redis에 Connection을 하기 위한 RedisConnectionFactory와 RedisTemplate을 생성해준다. RestTemplate과 비슷한 개념이라고 생각하면 이해가 쉽다. 앞으로 Redis를 사용할 일이 있으면 이 RedisTemplate을 사용할것이다. 

 

여기까지 만들었으면 연결을 하기 위한 준비는 끝이 난다. 

 

 

연동 테스트

연동 테스트를 하기 위해 RedisController 라는것을 하나 만든다. 

 

RedisController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RedisController {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @PostMapping("/redisTest")
    public ResponseEntity<?> addRedisKey() {
        ValueOperations<String, String> vop = redisTemplate.opsForValue();
        vop.set("yellow", "banana");
        vop.set("red", "apple");
        vop.set("green", "watermelon");
        return new ResponseEntity<>(HttpStatus.CREATED);
    }

    @GetMapping("/redisTest/{key}")
    public ResponseEntity<?> getRedisKey(@PathVariable String key) {
        ValueOperations<String, String> vop = redisTemplate.opsForValue();
        String value = vop.get(key);
        return new ResponseEntity<>(value, HttpStatus.OK);
    }
}

가장 일반적인 REST Controller의 모습이다. 아까 만들어 놓은 RedisTemplate을 주입받고 opsForValue() 라는 메서드를 통해 Redis에 값을 넣을수도 꺼낼수도 있다. 

 

필자는 포스트맨보다는 부메랑(Boomerang) 이라는 크롬 플러그인을 애용하는데 이를 통해 제대로 연동이 되는지 테스트를 해보겠다. 

 

redis 연동 샘플 (POST)

일단은 값을 넣어주는 역할을 하는 /redisTest 만 POST method로 호출을 해본다. CREATE 응답 코드인 201 SUCCESS가 나오며 Redis로 값이 들어간것 같다. 확인을 해보자. 

 

redis 연동 샘플 (GET)

확인을 할때는 Controller에 만들어 놓은대로 PathVariable에 key를 넣어준다. /redisTest/yellow 라고 요청을 날려본다. 조회이므로 GET method를 사용해서 요청을 날리면 앞서 넣었던 yellow의 value에 해당하는 banana가 나오는것을 확인할 수 있다. 잘 되는것 같다. 

 

혹시 모르니 CLI에서 값이 잘 들어가 있는지 확인을 한번 더 해보자. Redis에서 모든 key를 조회하는 keys * 를 날려보면 

이전에 넣었던 oing이라는 값에 추가한 yellow, green, red가 잘 들어가 있는것을 확인할 수 있다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30