[Spring Boot #27] 스프링 부트 레디스(Redis) 연동하기

2021. 3. 25. 01:23 Spring Framework/Spring boot #2

| 레디스(Redis)란?

 

레디스는 Key-Value 기반인 인메모리 데이터 저장소로서 주로 캐쉬 솔루션으로 쓰이고 있는 오픈 소스 프로젝트입니다. 

레디스를 이용하게 되면 JVM위에서 동작하지 않고 어떤 데이터를 캐싱할 수 있습니다. 따라서 GC 대상이 되지 않고 그로 인한 오버헤드가 줄어드는 장점이 있습니다.

 

| 스프링 부트 레디스 연동하기

 

의존성 추가

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

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

</dependencies>

 

레디스 도커 실행

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

다음과 같은 명령어를 쳐서 레디스가 제대로 실행됬는 지 확인할 수 있습니다.

docker exec -i -t redis_boot redis-cli

127.0.0.1:6379> keys *
(empty list or set)

 

프로젝트 구조

├── pom.xml
├── springboot.iml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── tutorial
│   │   │           └── springboot
│   │   │               ├── RedisRunner.java
│   │   │               └── SpringbootApplication.java
│   │   └── resources
│   │       ├── application.properties
│   │       ├── static
│   │       └── templates

 

소스 코드

@SpringBootApplication
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

}
@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", "saelobi");
        values.set("framework", "spring");
        values.set("message", "hello world");
    }
}
  • 스프링 부트에서는 RedisTemplate, StringRedisTemplate를 통해 레디스에 쉽게 접근할 수 있습니다. 
  • opsForValue를 통해서 레디스에 Key-Value 기반인 데이터를 캐싱하거나 그 값을 얻어올 수 있습니다.

 

결과화면 

127.0.0.1:6379> get name
"saelobi"
127.0.0.1:6379> get framework
"spring"
127.0.0.1:6379> get message
"hello world"

 

| 레디스를 이용한 스프링 저장소 만들기

 

다음과 같이 자바 소스 파일을 추가합니다.

├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── tutorial
│   │   │           └── springboot
│   │   │               ├── Account.java
│   │   │               ├── AccountRepository.java
│   │   │               ├── RedisRunner.java
│   │   │               └── SpringbootApplication.java

 

소스코드

@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;
    }
}
  • @RedisHash의 역할은 해당 클래스의 인스턴스가 레디스에 적재될 때 @RedisHash의 인수를 키로 해당 인스턴스를 값으로 적재되도록 합니다.
  • @Id는 스프링 JPA에서 Id를 나타내도록 역할을 하는 어노테이션입니다.

 

public interface AccountRepository extends CrudRepository<Account, String> {

}
  • CrudRepository는 스프링에서 어떤 저장소에 접근, 처리하기 위한 인터페이스를 제공하는 역할을 합니다. 제네릭을 통해 해당 저장소가 필요로 하는 인수를 자바 소스단에서 지정하여 처리할 수 있습니다.
@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("name", "saelobi");
        values.set("framework", "spring");
        values.set("message", "hello world");

        Account account = new Account();
        account.setEmail("eng.kimbs@gmail.com");
        account.setUsername("saelobi");

        accountRepository.save(account);

        Optional<Account> byId = accountRepository.findById(account.getId());
        System.out.println(byId.orElse(new Account()).getUsername());
        System.out.println(byId.orElse(new Account()).getEmail());
    }
}
  • CrudRepository를 상속받은 AccountRepository를 통해 데이터를 저장하고 저장소의 데이터를 쉽게 가져올 수 있습니다.

 

레디스 결과 화면

127.0.0.1:6379> keys *
1) "name"
2) "accounts"
3) "framework"
4) "mesage"
5) "message"
6) "accounts:cdc3ffb1-38a3-4275-95cd-192e35f832b4"
127.0.0.1:6379> hgetall accounts:cdc3ffb1-38a3-4275-95cd-192e35f832b4
1) "_class"
2) "com.tutorial.springboot.Account"
3) "id"
4) "cdc3ffb1-38a3-4275-95cd-192e35f832b4"
5) "username"
6) "saelobi"
7) "email"
8) "eng.kimbs@gmail.com"
  • @RedisHash에 인수로 들어온 문자열이 accounts가 key값으로 되어 있는 것을 알 수 있습니다. 또한 accounts의 값인 인스턴스 값을 얻기 위해서는 hget 혹은 hgetall 명령어를 통해 데이터를 얻어와야 합니다.

 

콘솔 화면

saelobi
eng.kimbs@gmail.com

 

참고자료 : https://www.inflearn.com/course/스프링부트



출처: https://engkimbs.tistory.com/796?category=767865 [새로비]