본문 바로가기
학습/Spring

[spring] 스프링 부트에서 Redis 사용하기

by KKambi 2020. 5. 18.

Redis?

  • Key-value NoSQL DB
  • 캐시 / 메세지 브로커 / Key-value Store로 사용가능

 

 

Redis 설치하기

  1. 의존성 추가 : spring-boot-starter-data-redis
  2. 레디스 인스턴스 생성

 

cf) redis는 공식적으로 윈도우를 지원하지 않지만, 능력자가 비공식적으로 사용할 수 있게 만들어놓았다.

해당 링크에서 설치한 뒤, 서버를 띄워서 cli를 사용하면 된다.

 

github.com/microsoftarchive/redis/releases

 

microsoftarchive/redis

Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis

github.com

 

 

Redis 사용하기

첫번째 방법. StringRedisTemplate 또는 RedisTemplate

두번째 방법. CrudRepository

 

 

StringRedisTemplate 사용해보기

key:value를 조작할 수 있는 객체를 통해 직접 설정하는 방법

  1. RedisRunner class 생성 (implements ApplicationRunner)
  2. @Autowired StringRedisTemplate
  3. opsForValue() 메소드 = ValueOperations<K, V> 객체를 반환
    (Key:value이므로 보통 <String, String>을 사용)
  4. 해당 객체의 set(key, value)로 설정
  5. 어플리케이션이 실행되면서(ApplictionRunner) 자동으로 key:value를 설정한다.
@Component
public class RedisRunner implements ApplicationRunner {

    @Autowired
    StringRedisTemplate redisTemplate;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        ValueOperations<String, String> values = redisTemplate.opsForValue();
        values.set("name", "kkambi");
        values.set("age", "20");
    }
}

Redis에 key:value가 설정된 모습

 

CrudRepository 사용해보기

Spring Data JPA를 사용해 객체를 Relation으로 맵핑하는 것과 유사한 방법

1. Entity 역할의 클래스 생성

  • @RedisHash("redis hash의 이름")을 도메인 클래스에 선언
  • @RedisHash는 특정 해쉬값을 키, 해당 클래스의 인스턴스를 값으로 적재한다.
  • ID필드에 @Id
  • 나머지 필드는 어노테이션 없이 가능
  • getter / setter 설정
@RedisHash
public class Forecast {

    @Id
    private String id;

    private String POP;     //강수확률

    private String PYT;     //강수형태

    private String T3H;     //3시간 기온

    public String getPOP() {
        return POP;
    }

    public void setPOP(String POP) {
        this.POP = POP;
    }

    public String getPYT() {
        return PYT;
    }

    public void setPYT(String PYT) {
        this.PYT = PYT;
    }

    public String getT3H() {
        return T3H;
    }

    public void setT3H(String t3H) {
        T3H = t3H;
    }
}

 

 

2. CrudRepository를 상속받는 AccountRepository Interface 생성

  • CrudRepository<도메인 클래스 타입, Key 타입>
  • Key는 String
  • JPA Repository를 사용하는 것처럼 똑같이 사용하면 된다.
    (Account 인스턴스 생성 → 필드값 설정 → save() 메소드)
  • CrudRepository를 extends하는 경우, findAll()은 Iterable<Forecast>를 반환하기 때문에 오버라이딩해준다.
public interface ForecastRepository extends CrudRepository<Forecast, String> {

    @Override
    List<Forecast> findAll();
}

cf) CrudRepository는 레디스에 특화된 것은 아니고, Spring Data의 최상위 Repository 인터페이스들 중 하나!

 

 

3. 테스트

  • 해당 코드는 레디스에 계속해서 Forecast 객체를 저장하므로, 테스트 전 cleanUp하거나, 테스트 종료 시 삭제하는 과정이 필요하다.
@RunWith(SpringRunner.class)
@SpringBootTest
public class ForecastRepositoryTest {

    @Autowired
    private ForecastRepository forecastRepository;

    @Test
    public void save_forecast_in_redis() {
        //given
        String POP = "20";
        String PTY = "10";
        String T3H = "27";

        forecastRepository.save(new Forecast.Builder()
                            .pop(POP)
                            .pty(PTY)
                            .t3h(T3H)
                            .build());

        //when
        List<Forecast> forecasts = forecastRepository.findAll();

        //then
        Forecast forecast = forecasts.get(0);
        assertThat(forecast.getPOP()).isEqualTo(POP);
        assertThat(forecast.getPTY()).isEqualTo(PTY);
        assertThat(forecast.getT3H()).isEqualTo(T3H);
    }
}

 

 

@RedisHash의 의미?

  • 해당 클래스의 엔티티들이 수많이 저장될 텐데, 이들만을 보관하는 Hash Key를 설정.
  • 이 해쉬 공간 속에서 각 엔티티들이 hash_id (@id에 맵핑되는 값)을 가지게 된다.
  • 결과적으로 삼중 해쉬맵을 사용한다고 이해하면 된다.
    • HashMap<String, HashMap<String, Account>>로 이해
    • 첫번째 String은 @RedisHash의 이름
    • 두번째 String은 hash_id
    • Account는 key:value 형태로 값을 저장하고 있으며, getter로 value를 가져올 수 있음
      (필드 이름이 key가 된다)

 

Redis 주요 커맨드

  • keys *
  • get {key}
  • hgetall {key} : hash get all
  • hget {key} {column} : hash get (key = hash_id / column = 엔티티에서 조회할 key)
  • del {key}

 

 

Redis 커스터마이징

  • 아무 설정을 하지 않았는데도, localhost:6379에 띄워진 Redis Instance에 연결한 것을 볼 수 있다.
  • Spring Boot의 AutoConfiguration 덕분이다.
  • 프로퍼티 설정을 통해 커스터마이징
    • spring.redis.*
    • 기본 포트 : 6379 (spring.redis.port)
    • 기본 인스턴스 URL : localhost (spring.redis.url)

 

 

댓글