Spring/Spring boot

[28] 스프링데이터: NoSQL - Redis

낙타선생 2020. 9. 5. 08:29
반응형

REmote DIctionary Server는 속도가 빠른 오픈소스 in-memory key, value 데이터 구조 스토어입니다.

 

REDIS를 사용하기 위해 spring boot project에 추가해야 할 의존성은 다음과 같습니다.

<dependencies>
	...
	<dependency>
		<groupId>org.springframework.boot</groupId>
        <artipactId>spring-boot-starter-data-redis</artipactId>
	</depedency>
    ...
</dependencies>

 

 

docker에 redis 이미지를 올립니다. (redis에서 사용하는 기본 port 번호는 6379입니다.) terminal에서 다음과 같은 docker 명령어를 입력하여 redis의 이미지를 docker에 올릴 수 있습니다.

docker run -p 6379:6379 --name redis_boot -d redis

 

이제 redis를 실행하기 위해 terminal에서 다음 명령어를 실행해주세요.

docker exec -i -t redis_boot redis-cli

 

redis 콘솔창에 keys * 를 입력하여 현재 key들을 확인해보면 아무 것도 없음을 볼 수 있습니다.

 

 

spring data에서는 StringRedisTemplate 또는 RedisTemplate를 통해 redis를 사용할 수 있습니다.

JPA와 마찬가지로 CrudRepository 인터페이스를 extends 하여 사용할 수 있습니다.

 

사용자 계정에 대한 CRUD 기능을 작성하는 예제를 통해 Spring boot에서 redis를 어떻게 사용하는지 확인해보도록 합시다.

우선 ID, 사용자명, 이메일 정보를 가진 계정 도메인을 먼저 작성 하도록 하겠습니다. account package를 만들고 그 안에 Account class와 AccountRepository interface를 생성합니다.

 

Account class의 코드는 다음과 같습니다.

package me.dave.account;

import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;

@RedisHash("accounts")	//	①
public class Account {

    @Id String id;	//	②
    private String username;
    private String email;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

① redis의 hash를 사용하기 위한 annotaion입니다.

② 자동생성되는 id입니다. long, String 어떤 type으로 해도 관계없습니다.

 

 

AccountRepository interface의 코드는 다음과 같습니다.

package me.dave.account;

import org.springframework.data.repository.CrudRepository;

public interface AccountRepository  extends CrudRepository<Account, String> {	//	①
}

① CrudRepository<T, ID>는 curd를 다루는 최상위급 interface로 이를 상속 받으면 손쉽게 crud 기능을 정의할 수 있습니다.

 

 

테스트를 위해 RedisRunner라는 이름으로 application runner class를 하나 만들어 줍니다.

package me.dave;

import me.dave.account.Account;
import me.dave.account.AccountRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class RedisRunner implements ApplicationRunner {

    @Autowired
    StringRedisTemplate redisTemplate;	//	①

    @Autowired
    AccountRepository accountRepository;	//	②

    @Override
    public void run(ApplicationArguments args) throws Exception {
        ValueOperations<String, String> values = redisTemplate.opsForValue();	//	③
        values.set("dave", "daehee");	//	③
        values.set("springboot", "2.0");	//	③
        values.set("hello", "world");	//	③

        Account account = new Account();	//	④
        account.setEmail("dave@gmail.com");	//	④
        account.setUsername("dave");	//	④

        accountRepository.save(account);	//	⑤

        Optional<Account> byId = accountRepository.findById(account.getId());	//	⑥
        System.out.println(byId.get().getUsername());	//	⑥
        System.out.println(byId.get().getEmail());	//	⑥
    }
}

① StringRedisTemplate 객체를 주입받습니다. 이 객체를 사용하여 redis를 사용할 수 있습니다.

② AccountRepository타입 객체를 주입 받습니다. 이 객체를 통해 CRUD를 진행합니다.

③ opsForValue()를 통해 StringRedisTemplate의 value 관련 연산들을 제공하는 객체를 받아오고 key, value pair를 저장합니다. (redisTemplate 타입도 사용할 수 있습니다.)

④ Account 객체를 생성하여 값을 넣습니다.

⑤ Account 객체의 내용을 redis에 저장합니다.

⑥ Id를 기준으로 Account 객체를 Optional<T>으로 가져오고 그 안의 값을 출력합니다.

 

 

이제 정상적으로 데이터가 저장되었는지 redis 콘솔창에서 확인해보도록 합니다. 

key * 로 모든 key를 확인하면 다음과 같이 입력된 key들이 조회됩니다.

 

 

key에 해당하는 value는 아래와 같이 확인해볼 수 있습니다.

    get [Key] : 일반적인 key의 value를 가져옵니다.

    hget [Key] [Field] : hash code로 된 key의 value를 가져옵니다. colison을 고려하여 Field도 입력해줘야 합니다.

    hgetall [Key] : hash code에 해당하는 모든 value를 조회합니다.

조회 결과는 다음과 같습니다.

 

 

redis 커스터마이징

application.properties에서 spring.redis.* 에 해당하는 설정 값들을 지정하는 것으로 커스터마이징 할 수 있습니다.

아무런 설정 없이 redis를 사용할 수 있었던 이유는 기본 설정으로 6379 port를 통해 연결했기 때문인데, 만약 다른 URL에 접속한다거나 port를 변경하는 경우에는 각각에 해당하는 설정 값을 변경해줘야 정상적으로 사용할 수 있습니다.

 

 

추가학습을 원하면

https://redis.io/commands