반응형

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

반응형

| 레디스(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/스프링부트


반응형

이 글을 공유하기

댓글

Designed by JB FACTORY