๐Ÿƒ Spring Boot ํ”„๋กœ์ ํŠธ์—์„œ Redis ํ™œ์šฉํ•˜๊ธฐ

์ด์ง„์ผยท2026๋…„ 5์›” 8์ผ
post-thumbnail

Redis์˜ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์„ ์ตํ˜”๋‹ค๋ฉด, ์ด์ œ ์‹ค์ œ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค(Spring Boot)์— Redis๋ฅผ ์—ฐ๋™ํ•ด ๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. Spring์—์„œ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐฉ๋ฒ•์ธ RedisRepository์™€ RedisTemplate์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1. Spring Data Redis ์„ค์ •

Spring Initializr์—์„œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ ๋‹ค์Œ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Dependencies: Spring Data Redis, Lombok

2-1. Spring Data Repository ๋ฐฉ์‹

JPA์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ, Java ๊ฐ์ฒด๋ฅผ Redis์˜ Hash ์ž๋ฃŒํ˜•์œผ๋กœ ์†์‰ฝ๊ฒŒ ๋งคํ•‘ํ•˜์—ฌ CRUD๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”น๋„๋ฉ”์ธ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ (Item.java)

JPA์˜ @Entity ๋Œ€์‹  @RedisHash ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@Getter @Setter @Builder
@NoArgsConstructor @AllArgsConstructor
@RedisHash("item") // Redis์˜ Key prefix ์„ค์ •
public class Item implements Serializable {
    @Id
    private Long id;
    private String name;
    private String description;
    private Integer price;
}

๐Ÿ”นRepository ๋งŒ๋“ค๊ธฐ (ItemRepository.java)

public interface ItemRepository extends CrudRepository<Item, Long> {}

๐Ÿ”นํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ํ™•์ธํ•˜๊ธฐ

@Test
public void createTest() {
    Item item = Item.builder()
            .id(1L)
            .name("keyboard")
            .description("Mechanical Keyboard Expensive")
            .build();
    itemRepository.save(item);
}

๐Ÿ” Redis ๋‚ด๋ถ€์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ €์žฅ๋ ๊นŒ?
ํ…Œ์ŠคํŠธ ์„ฑ๊ณต ํ›„ Redis CLI์—์„œ KEYS *๋ฅผ ์ž…๋ ฅํ•ด ๋ณด๋ฉด ์žฌ๋ฏธ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • item (Set ์ž๋ฃŒํ˜•): ํ˜„์žฌ ์ €์žฅ๋œ ์•„์ดํ…œ๋“ค์˜ ID ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•˜๋Š” ์ธ๋ฑ์Šค ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • item:1 (Hash ์ž๋ฃŒํ˜•): ์‹ค์ œ ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธด ํ‚ค์ž…๋‹ˆ๋‹ค. HGETALL item:1 ๋ช…๋ น์–ด๋กœ ์กฐํšŒํ•ด ๋ณด๋ฉด ํ•„๋“œ๋ณ„๋กœ ๊ฐ’์ด ์˜ˆ์˜๊ฒŒ ๋“ค์–ด์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@Test
public void readOneTest() {
    Item item = itemRepository.findById(1L)
            .orElseThrow();
    System.out.println(item.getDescription());
}


@Test
public void updateTest() {
    Item item = itemRepository.findById(1L)
            .orElseThrow();
    item.setDescription("On Sale!!!");
    itemRepository.save(item);

    item = itemRepository.findById(1L)
            .orElseThrow();
    System.out.println(item.getDescription());
}

@Test
public void deleteTest() {
    itemRepository.deleteById(1L);
}

2-2 RedisTemplate ์จ๋ณด๊ธฐ

Key๋ฅผ ์ง์ ‘ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ Redis์˜ ๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜• ๊ธฐ๋Šฅ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด RedisTemplate์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น StringRedisTemplate ๋ง›๋ณด๊ธฐ

๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” Bean์ž…๋‹ˆ๋‹ค. ๊ฐ ์ž๋ฃŒํ˜•์— ๋งž๋Š” Operations ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@Autowired
private StringRedisTemplate stringRedisTemplate;

@Test
public void stringValueOpsTest() {
    // Redis String ์ž๋ฃŒํ˜• ์‚ฌ์šฉ
    ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
    ops.set("simplekey", "simplevalue");
    System.out.println(ops.get("simplekey"));
}

@Test
public void stringSetOpsTest() {
    // Redis Set ์ž๋ฃŒํ˜• ์‚ฌ์šฉ
    SetOperations<String, String> setOps = stringRedisTemplate.opsForSet();
    setOps.add("hobbies", "games", "coding", "alcohol");
    System.out.println(setOps.size("hobbies"));
}

โ˜๐Ÿป ์ฃผ์˜ํ•  ์ !
StringRedisTemplate์€ Redis์˜ String ๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒ ๋‹ค๋ฃจ๋Š” ๋„๊ตฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ๋Š” Redis์™€ ์†Œํ†ตํ•  ๋•Œ Java์˜ String ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, Redis์˜ List๋‚˜ Set์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ๋•Œ๋„ Java์˜ ๋ฌธ์ž์—ด(String)์„ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น ๊ณต์šฉ ๋ช…๋ น์–ด ํ™œ์šฉ

EXPIRE, DEL ๊ฐ™์€ ๊ณตํ†ต ๊ธฐ๋Šฅ์€ Template ์ž์ฒด ๋ฉ”์„œ๋“œ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

stringRedisTemplate.expire("simplekey", 5, TimeUnit.SECONDS);

3. @Configuration์—์„œ RedisTemplate ์ •์˜ํ•˜๊ธฐ

๐Ÿ”น RedisConfig ์„ค์ • (RedisConfig.java)

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, ItemDto> itemRedisTemplate(
            RedisConnectionFactory connectionFactory
    ) {
    	// 1
        RedisTemplate<String, ItemDto> template = new RedisTemplate<>();
        // 2
        template.setConnectionFactory(connectionFactory);
        
        // ๋ฐ์ดํ„ฐ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด Key๋Š” String, Value๋Š” JSON์œผ๋กœ ์ง๋ ฌํ™”
        // 3-a
        template.setKeySerializer(RedisSerializer.string());
        
 		// 3-b
 		template.setValueSerializer(RedisSerializer.json());
        // 4
        return template;
    }
}
  1. ์ƒˆ๋กœ์šด RedisTemplate์„ ๋งŒ๋“ค๋ฉด์„œ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ String, ItemDto๋กœ ์„ค์ •ํ•˜๋Š”๋ฐ Key๋Š” Java์˜ String, Value๋Š” ItemDto๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Redis์™€ ์†Œํ†ตํ•  ๊ฒƒ์ด๋‹ค๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  2. Redis์™€์˜ ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•  RedisConnectionFactory๋ฅผ template์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ RedisConnectionFactory์˜ ๊ฒฝ์šฐ application.yaml ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ๋งŒ๋“ค์–ด Bean ๊ฐ์ฒด๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
  3. ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    a. Key๋Š” String์œผ๋กœ ์ง๋ ฌํ™”
    b. Value๋Š” JSON์œผ๋กœ ์ง๋ ฌํ™”
  4. template์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด Bean ๊ฐ์ฒด๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”น ์ปค์Šคํ…€ Template ์‚ฌ์šฉ ์˜ˆ์‹œ

@Test
public void itemRedisTemplateTest() {
    ValueOperations<String, ItemDto> ops = itemRedisTemplate.opsForValue();
    ops.set("my:keyboard", ItemDto.builder()
            .name("Mechanical Keyboard")
            .price(300000)
            .build());
}

๐Ÿ’ก ์š”์•ฝ ๋ฐ ๊ฒฐ๋ก 

  • Repository: ๋‹จ์ˆœ CRUD ์ž‘์—… ๋ฐ JPA ์Šคํƒ€์ผ์— ์ต์ˆ™ํ•  ๋•Œ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • Template: ์ž๋ฃŒํ˜•์˜ ์ƒ์„ธ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ ์„ธ๋ฐ€ํ•œ Key ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ƒํ™ฉ์— ๋งž๋Š” ์ ์ ˆํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•˜์—ฌ Redis์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•ด ๋ณด์„ธ์š”! ๐Ÿš€

0๊ฐœ์˜ ๋Œ“๊ธ€