(๊ฒ์ํ ํ ์ดํ๋ก์ ํธ)
์ผ๋จ ํ์ฌ ๋ด service์ฝ๋๋
๋จ์ํ DB์ฐ๋ฌ์ ๊ฐ๊ณ ์ค๋ ์ฝ๋์.
@Service
public class BoardService {
private BoardRepository boardRepository;
public BoardService(BoardRepository boardRepository) {
this.boardRepository = boardRepository;
}
public List<Board> getBoards(int page, int size) {
Pageable pageable = PageRequest.of(page -1, size);
Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable);
return pageOfBoards.getContent();
}
}
์ด์ ํ๋ก์ ํธ์ configํด๋ ๋ง๋ค๊ณ , ์ธํ ํด์ค๋ค์์
Service์ชฝ ์ฝ๋ ๊ฐ๋จํ ์์ ํด์
Redis๋จผ์ ์ฐ๋ฌ๋ณด๊ณ , CacheMiss๋ฉด DB ์ฐ๋ฅด๊ณ DB์ ์ ์ฅ๊น์ง ํ๋ ๋ก์ง์ผ๋ก ํด๋ณด๊ฒ ์.

ํ์ผ๊ตฌ์กฐ๋ ์ด๋ ๊ฒ
configํด๋ ๋ง๋ค๊ณ , ๊ทธ ํ์์ redis ์ค์ ํ๋ ํ์ผ ๋๊ฐ ๋ง๋ค๊ฒ ์.
RedisCacheConfig ํ์ผ
@Configuration
@EnableCaching // Spring Boot์ ์บ์ฑ ์ค์ ์ ํ์ฑํ
public class RedisCacheConfig {
@Bean
public CacheManager boardCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
.defaultCacheConfig()
// Redis์ Key๋ฅผ ์ ์ฅํ ๋ String์ผ๋ก ์ง๋ ฌํ(๋ณํ)ํด์ ์ ์ฅ
.serializeKeysWith(
RedisSerializationContext.SerializationPair.fromSerializer(
new StringRedisSerializer()))
// Redis์ Value๋ฅผ ์ ์ฅํ ๋ Json์ผ๋ก ์ง๋ ฌํ(๋ณํ)ํด์ ์ ์ฅ
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(
new Jackson2JsonRedisSerializer<Object>(Object.class)
)
)
// ๋ฐ์ดํฐ์ ๋ง๋ฃ๊ธฐ๊ฐ(TTL) ์ค์ - 1๋ถ๋ง๋ค ๋ฐ์ดํฐ ๊ฐฑ์ ๋์ผ๋ฉด ์ข๊ฒ ๋ค!
.entryTtl(Duration.ofMinutes(1L));
return RedisCacheManager
.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(redisCacheConfiguration)
.build();
}
}
RedisConfigํ์ผ
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
//Lettuce ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉํด์ Redis ์ฐ๊ฒฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด ์์ฑ
// Redis ์๋ฒ์ ๋ํ ์ ๋ณด(host, port)๋ฅผ ์ค์
return new LettuceConnectionFactory(new RedisStandaloneConfiguration(host, port));
}
}
Redis ์ค์ ์ ํด๋จ๊ณ ,
์ด์ Service์ชฝ ์ฝ๋ ์์
@Service
public class BoardService {
private BoardRepository boardRepository;
public BoardService(BoardRepository boardRepository) {
this.boardRepository = boardRepository;
}
// @Cacheable : CacheAside ์ ๋ต ์ฐ๊ฒ ๋ค.
// CacheAside ์ ๋ต : ์ผ๋จ redis ์บ์ ๋จผ์ ๋ค์ง๊ณ , ์์ผ๋ฉด ๋ด๋ถ ๋ก์ง ์งํ, return ๊ฐ์ redis์ ์ ์ฅ.
// ํค๊ฐ - boards:pages:2:size:10 - boards ์์ page๊ฐ 2์ด๊ณ , size๊ฐ 10๊ฐ์ธ ๋ฐ์ดํฐ
@Cacheable(cacheNames = "getBoards", key = "'boards:pages:' + #page + ':size' + #size", cacheManager = "boardCacheManager")
public List<Board> getBoards(int page, int size) {
// Cache Miss ๊ฐ ๋ฐ์ํ์ ๋ ์งํ๋๋ ๋ก์ง
// redis์ ์์ผ๋๊น boardRepository(DB) ๋ค์ง๋๊ฑฐ์
Pageable pageable = PageRequest.of(page -1, size);
Page<Board> pageOfBoards = boardRepository.findAllByOrderByCreatedAtDesc(pageable);
return pageOfBoards.getContent();
}
}
์ด๋ ๊ฒ ๋ฐ๊ฟ์ฃผ๊ฒ ์.
@Cachable์ด๋ ธํ ์ด์ :
- cacheNames : ์บ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ ์ ์ฅ๋ ์ง ์ง์ .
์ฒจ์ ์ด๋ ธํ ์ด์ ๋ดค์ ๋ ๋ ๋์ค ์ ์ฅ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ์๊ธด์ง ๋ชฐ๋ผ์
์ด ์์ฑ์ด ์ ํ์ํ๊ฐ ํ์.
์ด์ฐจํผ key-value๋ก ์ ์ฅ๋๋ ๋ ๋์ค์์ key๋ ์๊ฒน์ณ์ผํ๊ณ .. ๊ตณ์ด ์ ํ์ํ๊ฐ ํ๋๋ฐ
์ฝ๊ฐ RDBMS์์ table๊ฐ์ ์ญํ ๋ก ์ดํดํ๋ฉด ์ฌ์ธ๊ฑฐ๊ฐ์.
์ง๊ธ ๋ด๊ฐ ์ง ์ฝ๋ ์ฒ๋ผ ํ๊ฒ ๋๋ค๋ฉด
๋ด๋ถ์
getBoards {
boards:pages:2:size:10 -> [ Board ๋ฐ์ดํฐ ... ]
boards:pages:3:size:10 -> [ Board ๋ฐ์ดํฐ ... ]
}
์ด๋ฐ ๋๋์ผ๋ก ์ ์ฅ๋๋ค๊ณ ๋ณด๋ฉด๋จ.
์ด์ฐจํผ key๊ฐ์ uniqueํด์ผํ๋๊น ๊ฒน์น ์ผ์ ์๊ฒ ์ง๋ง,
์บ์ ๊ตฌ์กฐ ๊ด๋ฆฌ๋ ์ ์ด ํธ๋ฆฌ์ฑ๋๋ฌธ์ ๊ผญ ํ์ํจ.
์๋ฅผ ๋ค์ด ๋ด๊ฐ boards ์บ์๋ง ์ง์ฐ๊ณ ์ถ๋ค๋ฉด?
๊ตฌ์กฐ์ ์ผ๋ก ๋ถ๋ฆฌ๊ฐ ์๋์ด์์ผ๋ฉด ๊น๋ค๋ก์์ง.
์๋ฌดํผ ์ด๋ฐ ์ด์ ๋ก ์ ์ฅ์ ์ด๋ฆ ๋ถ์ด๊ธฐ๋ ํ์์ .
- key : key๊ฐ ์ด๋ฆ ์ง์
๋ด๊ฐ ์ด ์ฝ๋์ฒ๋ผ ํ๊ฒ ๋๋ฉด ํค๊ฐ์ด
boards:pages:2:size:10
์ด๋ฐ์์ผ๋ก ์ ์ฅ๋จ.
์์ ์ ํฌ์คํ ํ๋, ๊ณ์ธต์ ๊ตฌ์กฐ๋ฅผ ์ ๋ฐ๋ฅด๊ฒ ์ง์
- cacheManager : ์ด๋ค cacheManagerํํ ๋งก๊ธธ๊ฑด์ง ์ง์
์ง์ ์ํด์ฃผ๋ฉด defaultCacheManager์ด๋ค๊ณ ํฉ๋๋ค.
์์์ config ๋๋ ํ ๋ฆฌ ํ์์
boardCacheManager ๋ง๋ค์ด๋๊ฒ ์๋๋ฐ, ๊ทธ๊ฑธ ๊ฐ๋ค ์ฐ๋๊ฑฐ์.
์ด์ ์คํํ๊ณ api ํธ์ถํด๋ณด๋ฉด

๋ก๊ทธ์ ์ด๋ ๊ฒ ์ฐํ.
์ฒ์์ ์บ์ ์กฐํํด ๋ดค๋๋ฐ ์์ด์
No cache entry๋ผ๊ณ ๋จ๊ณ ,
DB๋ฅผ ์กฐํํจ.
๊ทธ๋ฆฌ๊ณ return๊ฐ์ redis์ ์ ์ฅํ๋ ๋ก๊ทธ.
redis-cli ์ผ์ ํ์ธํด๋ณด๋ฉด

์ ๋ค์ด๊ฐ ์์!!!
ํ๋ํ๋ ํ์ธํด๋ณด๋ฉด

๋ด๊ฐ ์ ๋ฒ์ ๋ง๊ฐ์ธ๊ฐ ์ญ๋ง๊ฐ์ธ๊ฐ ๋๋ค ์์ฑํด๋์ ๋ฐ์ดํฐ์ค์์ ๋ถ๋ฌ์์ง.
1๋ถ์ด ์ง๋๊ธฐ ์ ์ ๋ค์ apiํธ์ถํด๋ณด๋ฉด

์๊น๋ ๋ฌ๋ฆฌ ๋ฐ๋ก ์กฐํ.
ttlํ์ธํด๋ณด๋ฉด

5์ด ๋จ๊ธฐ๊ณ ์บก์ณ
ใ ใ ใ
~~~์๊ฐ์ด ํ๋ฅด๊ณ 1๋ถ์ด ์ง๋จ~~~
๋ค์ apiํธ์ถํด๋ณด๋ฉด

๋ค์ ์บ์ ์๋ค๋ฉด์ DB์กฐํํ๊ณ ์บ์์ ์ ์ฅํจ.
'Redis' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Redis] redis ์บ์ ์๋ฒ ํ์ฉ ํ ์ฑ๋ฅ ๋น๊ต (feat.postman) (0) | 2025.11.28 |
|---|---|
| [Redis] ์บ์ฑ ์ ๋ต-Cache Aside, Write Around / ์บ์ฑ ๋ป / TTL ๋ป (0) | 2025.11.25 |
| [Redis] ์์ฃผ ์ฐ๋ ๋ช ๋ น์ด ์ ๋ฆฌ + ๋ค์ด๋ฐ ์ปจ๋ฒค์ (0) | 2025.11.24 |
| [Redis] Windows์ Redis ์ค์นํ๊ธฐ (0) | 2025.11.24 |
| [Redis] MacOS์ Redis ์ค์นํ๊ธฐ (0) | 2025.11.24 |