๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring Boot

[Cache] ๋กœ์ปฌ ์บ์‹œ Caffeine์ด๋ž€? ์ ์šฉํ•˜๊ธฐ

by ์šฐ์ฃผ๋ฌผ๊ณ ๊ธฐ 2026. 5. 20.
๋ฐ˜์‘ํ˜•

1. ๋ฌธ์ œ ๋ฐœ๊ฒฌ

k6๋กœ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ํ•˜๋Š” ์ค‘์ธ๋ฐ slow query 1,131ms

TPS๊ฐ€ 8.97์ด๋ผ๋Š” ์—„์ฒญ๋‚œ ์ˆซ์ž๊ฐ€ ๋‚˜์˜ด..ใ…‹ใ…‹

 

 

2. ์›์ธ ๋ถ„์„

Total Page์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ

๋งค๋ฒˆ select count(*) from article ์ฟผ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•จ

๋”๋ฏธ ๋ฐ์ดํ„ฐ๋กœ DB์— article 10๋งŒ๊ฐœ ๋„ฃ์–ด๋†“์€ ์ƒํ™ฉ์ด๋ผ ์‹œ๊ฐ„์„ ์˜ค๋ž˜ ์žก์•„๋จน๋Š”๊ฒƒ์œผ๋กœ ์ถ”์ •๋จ.

 

api controller์—์„œ Page<Article>๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ

JPA๊ฐ€ ์ž๋™์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ 2๊ฐœ ๋‚ ๋ฆฌ๊ฒŒ๋จ

 

-- ์ฟผ๋ฆฌ 1: ํ•ด๋‹น ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ 10๊ฑด
SELECT * FROM article ORDER BY created_at DESC LIMIT 10 OFFSET 0;

-- ์ฟผ๋ฆฌ 2: ์ „์ฒด ํŽ˜์ด์ง€ ์ˆ˜ ๊ณ„์‚ฐ์šฉ (JPA๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€)
SELECT COUNT(*) FROM article;  -- 10๋งŒ๊ฑด ์ „๋ถ€ ์…ˆ

 

์ „์ฒด ๋ช‡ ํŽ˜์ด์ง€์ธ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์—์„œ 10๋งŒ๊ฑด์„ ์„ธ๊ณ  ์žˆ๋Š”๊ฒƒ

 

3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์„ ํƒ

total page๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด article ๊ฐฏ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”๊ฑด ์ตœ์ดˆ ํ•œ ๋ฒˆ๋งŒ ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์— ์ €์žฅํ•ด๋‘๋ฉด

์žฌ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ๊ฐœ์„  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ

์บ์‹œ๋ฅผ ์ ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ,

 

์บ์‹œ์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€๊ฐ€ ์žˆ์Œ.

๋กœ์ปฌ ์บ์‹œ / ๋ถ„์‚ฐ์บ์‹œ

 

๋กœ์ปฌ์บ์‹œ

์ €์žฅ ์œ„์น˜๋Š” JVM ํž™ ๋‚ด๋ถ€.

 

๋”ฐ๋ผ์„œ ๋„คํŠธ์›Œํฌ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  application๋‚ด๋ถ€์—์„œ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ„

๋ณ„๋„์˜ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋‹ˆ๊นŒ ๋น„์šฉ์ ˆ๊ฐ ํšจ๊ณ ๋„ ์žˆ๊ณ ...

๊ตฌํ˜„๋„ ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ํ•จ.

 

๋‹จ ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ๋Œ€ ์ผ๋•Œ๋Š” ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋•Œ๋ฌธ์— MSA ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉ์ด ์–ด๋ ค์›€.

ex)Caffeine 

 

 

๋ถ„์‚ฐ ์บ์‹œ

์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์™ธ๋ถ€ ์บ์‹œ ์ €์žฅ์†Œ์— ์œ„์น˜.

๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ ์บ์‹œ๋ณด๋‹ค๋Š” ๋А๋ฆผ

 

ํ•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ„ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ 

ํ™•์žฅ์„ฑ์ด๋ž‘ ๊ฐ€์šฉ์„ฑ์ด ์ข‹๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Œ.

ex ) Redis

 

 

-> ๋‚˜๋Š” ๋‹จ์ผ์„œ๋ฒ„๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— Caffeine ์„ ํƒ!

์ถ”ํ›„ ํ™•์žฅํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด Redis๋„ ์ถ”๊ฐ€๋„์ž…ํ• ์ง€๋„,,

 

 

4. ์ ์šฉ ๊ณผ์ •

๋จผ์ € ์˜์กด์„ฑ ๋„ฃ์–ด์ฃผ๊ณ 

implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'com.github.ben-manes.caffeine:caffeine'

 

 

 

Config ํŒŒ์ผ ์ƒ์„ฑ

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager("articleCount");
        cacheManager.setCaffeine(Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES));
        return cacheManager;
    }
}

 

 

Service์ฝ”๋“œ ์ˆ˜์ •

 // ๊ธ€ ์ƒˆ๋กœ ์ž‘์„ฑ ์‹œ ์บ์‹œ ๋ฌดํšจํ™”
    @CacheEvict( value = "articleCount", allEntries = true)
    public Article save(AddArticleRequest request, String username) {

        User user = userRepository.findByEmail(username)
                .orElseThrow(() -> new IllegalArgumentException("Unexpected User"));

        return blogRepository.save(request.toEntity(username, user.getId()));
    }

    // ๊ธ€ ์‚ญ์ œ ์‹œ ์บ์‹œ ๋ฌดํšจํ™”
    @CacheEvict( value = "articleCount", allEntries = true)
    public void delete(Long id) {
        Article article = blogRepository.findById(id)
                .orElseThrow( () -> new IllegalArgumentException("not found : " + id));

        authorizeArticleAuthor(article);
        blogRepository.deleteById(id);
    }

    @Cacheable("articleCount")
    public long getArticleCount() {
        return blogRepository.count();
    }

 

 

 

controller์ˆ˜์ •

long totalCount = blogService.getArticleCount();
int totalPages = (int) Math.ceil((double) totalCount / 10);

 

 

 

 

 

 

5. ๊ฒฐ๊ณผ

๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๊ณ  postman์œผ๋กœ ํ…Œ์ŠคํŠธ

 

์ฒซ๋ฒˆ์งธ ์š”์ฒญ

 

๋‘๋ฒˆ์งธ ์š”์ฒญ

์‘๋‹ต์†๋„๊ฐ€

971ms -> 126ms ๋กœ ํ™•์—ฐํ•˜๊ฒŒ ์ค„์–ด๋“ค์—ˆ์Œ.

 

๋กœ๊ทธ์—๋„

์ฒ˜์Œ์—” no cache๋ผ๊ณ  ๋œจ๋‹ค๊ฐ€ ๋‘๋ฒˆ์งธ get ์š”์ฒญ์—๋Š” ์•ˆ๋œธ ใ…Žใ…Ž

 

 

 

 

์บ์‹œ ๋ฌดํšจํ™” ํ…Œ์ŠคํŠธ

์ด๋Ÿฐ์‹์œผ๋กœ ๊ฒŒ์‹œ๋ฌผ ํ•˜๋‚˜ ์จ์ฃผ๊ณ 

 

 

๋‹ค์‹œ get์š”์ฒญ ๋‚ ๋ฆฌ๋‹ˆ๊นŒ

 

 

์ด๋ ‡๊ฒŒ no cache๋ผ๊ณ  ๋œจ๋„ค์š”~

 

์‹œ๊ฐ„์€ ์—ฌ์ „ํžˆ ์งง๊ฒŒ ๋‚˜์˜ค๋Š”๊ฒŒ ์•„๋งˆ ๋กœ์ปฌ DB๋ผ ๊ทธ๋Ÿฐ๋“ฏ..

 

 

์•”ํŠผ ๋

๋ฐ˜์‘ํ˜•