BackEnd/Spring Boot

Spring ํ™˜๊ฒฝ์—์„œ Redis ์‚ฌ์šฉํ•˜๊ธฐ

ddonghyeo 2023. 9. 1. 23:55

 

Redis๋ž€?

Redis๋Š” ์˜คํ”ˆ ์†Œ์Šค, ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์Šคํ† ์–ด์ด๋ฉฐ, ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•œ๋‹ค.

์ฃผ์š” ์šฉ๋„๋กœ๋Š” ์บ์‹ฑ, ๋ฉ”์‹œ์ง•, ์„ธ์…˜ ๊ด€๋ฆฌ ๋“ฑ์ด ์žˆ๋‹ค. Redis๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋””์Šคํฌ๊ฐ€ ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ ๋งค์šฐ ๋น ๋ฅธ ์†๋„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ Redis๋Š” ์˜์†์„ฑ์„ ์ง€์›ํ•˜์—ฌ ๋””์Šคํฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค. Redis๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ฐ ๋งˆ์Šคํ„ฐ-์Šฌ๋ ˆ์ด๋ธŒ ๋ณต์ œ์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค. Redis๋Š” ๋งŽ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ์†๋„์™€ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ์—์„œ ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค.

 

Redis์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  • ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค
    Redis๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š”๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์„ ์ค„์—ฌ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค.
  • ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
    List, Set, Sorted Set, Hash ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • Pub/Sub ๋ฉ”์ปค๋‹ˆ์ฆ˜
    Redis๋Š” Pub/Sub ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง€์›ํ•œ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ํ, ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ์˜์†์„ฑ ๋ณด์žฅ
    Redis๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Redis๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ
    Redis๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”๋ชจ๋ฆฌ์˜ ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ œํ•œ๋œ๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€
    Redis๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋‹ค๊ฐ€ Redis ์„œ๋ฒ„๊ฐ€ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๊ฐ€ ์œ ์‹ค๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Redis๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋””์Šคํฌ์˜ ์†์ƒ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์Šค์ผ€์ผ ์•„์›ƒ ๋ฌธ์ œ
    Redis๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์—ฌ๋Ÿฌ Redis ์ธ์Šคํ„ด์Šค๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋ณต์žกํ•œ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฉฐ, ์ด๋กœ ์ธํ•œ ๋ถ€ํ•˜ ๋ฐ ์ง€์—ฐ ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Spring์—์„œ Redis ์‚ฌ์šฉํ•˜๊ธฐ

1. ์˜์กด์„ฑ ์ถ”๊ฐ€

Mavenํ™˜๊ฒฝ

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.6.1</version>
</dependency>

Gradle ํ™˜๊ฒฝ

dependencies {
    implementation 'redis.clients:jedis:3.6.1'
}

2. Redis ์„ค์ •

application.properties์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

spring.redis.host=localhost
spring.redis.port=6379

์œ„์—๋Š” Redis ์„œ๋ฒ„์˜ IP์ฃผ์†Œ, ์•„๋ž˜๋Š” ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

3. Redis ์‚ฌ์šฉํ•˜๊ธฐ

Redis๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” RedisTemplate ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์—ฌ๊ธฐ์„œ RedisTemplate์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ RedisConnectionFactory๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyRedisService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    //๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ
    public void saveData(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    // ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
    public String getData(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}