[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
'Spring Framework > Spring boot #2' 카테고리의 다른 글
[Spring Boot #31] 스프링 부트 RestTemplate, WebClient (0) | 2021.03.25 |
---|---|
[Spring Boot #30] 스프링 부트 시큐리티 커스터마이징 (0) | 2021.03.25 |
[Spring Boot #29] 스프링 부트 시큐리티 (0) | 2021.03.25 |
[Spring Boot #28] 스프링 부트 몽고DB(Mongo DB) 연동하기 (0) | 2021.03.25 |
[Spring Boot #26] Flyway를 이용한 데이터 마이그레이션 (0) | 2021.03.25 |
[Spring Boot #25] 스프링 부트 데이터베이스 초기화 (0) | 2021.03.25 |
[Spring Boot #24] 스프링 부트 Spring-Data-JPA 연동 (0) | 2021.03.25 |
[Spring Boot #23] 스프링 부트 PostgreSQL 연동하기 (0) | 2021.03.25 |