๐Ÿš€ ์™ธ๋ถ€ API ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐ: Look-aside ์บ์‹œ๋กœ 5100ms โž” 57ms ๋‹จ์ถ•

์ •์ •์ผยท2024๋…„ 12์›” 16์ผ
0

์•ˆ๋…•ํ•˜์„ธ์š”. ์ €๋Š” ํ˜„์žฌ ๋Œ€์ถœ ๋ฐ ํˆฌ์ž ์—ฐ๊ณ„ ํ”Œ๋žซํผ์—์„œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ๊ทผ๋ฌด ์ค‘์ธ 2๋…„ ์ฐจ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Look-aside ์บ์‹œ ํŒจํ„ด์„ ํ™œ์šฉํ•˜์—ฌ ์™ธ๋ถ€ API ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ์ œ๊ฐ€ ์ง๋ฉดํ–ˆ๋˜ ๋ฌธ์ œ๋“ค์€ ๋‹จ์ˆœํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. API ํ˜ธ์ถœ์˜ ์ง€์—ฐ, ์ค‘๋ณต ํ˜ธ์ถœ๋กœ ์ธํ•œ ๋น„์šฉ ๋ฌธ์ œ, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์˜ ์ €ํ•˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋“ค์ด ์–ฝํ˜€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ, ์™ธ๋ถ€ API์˜ ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„์ด ์•ฝ 5100ms์— ๋‹ฌํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ง€๋‚˜์น˜๊ฒŒ ๊ธธ์–ด์กŒ๊ณ , ์ด๋Š” ์‚ฌ์šฉ์ž ์ดํƒˆ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์ค‘๋Œ€ํ•œ ๋ฌธ์ œ๋กœ ์ธ์‹๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ๋‹จ์ˆœํžˆ ์™ธ๋ถ€ API ๊ฐœ์„ ์š”๊ตฌ์—๋งŒ ์˜์กดํ•˜๊ธฐ์—๋Š” ์–ด๋ ค์› ๊ธฐ์—, ์™ธ๋ถ€ API์˜ ์„ฑ๋Šฅ๊ฐœ์„ ์„ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด ์—†์„๊นŒ ๊ณ ๋ฏผํ•˜๋‹ค ์บ์‹œ๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Look-aside ์บ์‹œ์˜ ๊ฐœ๋…, ๊ตฌํ˜„ ๊ณผ์ •, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์ ์šฉ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๋ ค ํ•ฉ๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ์ƒํ™ฉ

์ €ํฌ ํšŒ์‚ฌ์˜ ๋Œ€์ถœ ์ค‘๊ณ„ ์ƒํ’ˆ ์ค‘ ํ•˜๋‚˜์ธ ์ฃผํƒ๋‹ด๋ณด๋Œ€์ถœ ์„œ๋น„์Šค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ฃผํƒ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ์ฃผํƒ์˜ ์‹œ์„ธ์— ๋”ฐ๋ผ ๋Œ€์ถœ ํ•œ๋„๋ฅผ ๊ณ„์‚ฐํ•ด ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์ฃผํƒ ์‹œ์„ธ ๋ฐ ๋‹จ์ง€, ํ‰ํ˜• ์ •๋ณด ๋ฐ์ดํ„ฐ๋กœ, ์ด ์ •๋ณด๋ฅผ ์™ธ๋ถ€ API๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”น ์ฃผ์š” ๋ฌธ์ œ

  • ์‘๋‹ต ์†๋„ ์ง€์—ฐ: ์™ธ๋ถ€ API์˜ ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„์ด ์•ฝ 5100ms๋กœ, ์‚ฌ์šฉ์ž ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ง€๋‚˜์น˜๊ฒŒ ๊ธธ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

  • ์™ธ๋ถ€ ์‹œ์Šคํ…œ ๊ฐœ์„ ์˜ ์–ด๋ ค์›€: ๊ณ ๊ฐ์‚ฌ์˜ ์ž…์žฅ์—์„œ ์„ฑ๋Šฅ๊ฐœ์„ ์„ ์š”๊ตฌํ•œ๋‹ค ํ•˜๋”๋ผ๋„ ๊ฐœ์„ ์ด ๋ฐ”๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ์—” ์–ด๋ ค์›€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ค‘๋ณต ์š”์ฒญ ๋ฐœ์ƒ: ๋Œ€์ถœ ์‹ ์ฒญ ํ”„๋กœ์„ธ์Šค ์ค‘ ์ž„์‹œ ์ €์žฅ ๊ธฐ๋Šฅ์ด ์žˆ์–ด, ๋™์ผํ•œ ์ฃผ์†Œ์— ๋Œ€ํ•ด ์ค‘๋ณต ์กฐํšŒ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋น„์šฉ ๋ฌธ์ œ: ์™ธ๋ถ€ API ํ˜ธ์ถœ ๋น„์šฉ์ด ๋ˆ„์ ๋˜๋ฉด์„œ ์šด์˜ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.


(์™ธ๋ถ€ API ์‘๋‹ต์†๋„ ์ตœ์ € 3006ms ์ตœ๋Œ€ 9412ms)

๐Ÿ“‰ API ์‘๋‹ต ์†๋„ ๋ถ„์„

  • ์ตœ์ €: 3006ms
  • ํ‰๊ท : 5132ms
  • ์ตœ๋Œ€: 9412ms

์ด๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž ๋ถˆ๋งŒ์ด ์ฆ๊ฐ€ํ–ˆ๊ณ , ์„œ๋น„์Šค ํ’ˆ์งˆ ์ €ํ•˜๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๋Œ€์ถœ ์‹ ์ฒญ ๊ณผ์ •์—์„œ์˜ ๋ฐ˜๋ณต ํ˜ธ์ถœ๋กœ ์ธํ•ด ๋ถˆํ•„์š”ํ•œ ๋น„์šฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.


2. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Look-aside ์บ์‹œ ํŒจํ„ด ๋„์ž…

์™ธ๋ถ€ API์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Look-aside ์บ์‹œ ํŒจํ„ด์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”น Look-aside ์บ์‹œ๋ž€?

Look-aside ์บ์‹œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB) ๋˜๋Š” ์™ธ๋ถ€ API์— ์ ‘๊ทผํ•˜๊ธฐ ์ „์— ์บ์‹œ๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๋Š” ์บ์‹ฑ ์ „๋žต์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์—†๋‹ค๋ฉด ์™ธ๋ถ€ API๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ ์บ์‹œ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿ”น ๋™์ž‘ ์›๋ฆฌ
1. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์บ์‹œ(Cache) ์—์„œ ๋ฐ์ดํ„ฐ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
2. ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค (cache hit).
3. ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์™ธ๋ถ€ API์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ์— ์ €์žฅํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค (cache miss).

๐ŸŒ ์˜ˆ์‹œ ํ๋ฆ„

  • [์‚ฌ์šฉ์ž ์š”์ฒญ] โžž [์บ์‹œ ํ™•์ธ] โžž (๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜) โžž [์‘๋‹ต]
  • [์‚ฌ์šฉ์ž ์š”์ฒญ] โžž [์บ์‹œ ํ™•์ธ] โžž (๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด) โžž [์™ธ๋ถ€ API ํ˜ธ์ถœ] โžž [์บ์‹œ์— ์ €์žฅ] โžž [์‘๋‹ต]

๐Ÿ”น ์™œ Look-aside ์บ์‹œ๋ฅผ ์„ ํƒํ–ˆ์„๊นŒ?

  • ๋ถˆํ™•์‹คํ•œ ์š”์ฒญ ํŒจํ„ด: ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๋Š” ์ฃผํƒ์˜ ์ฃผ์†Œ๊ฐ€ ์‚ฌ์ „์— ์˜ˆ์ธก๋˜์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์—, ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํŠน์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด Cache Warm up์„ ๊ณ ๋ คํ–ˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ค‘๋ณต ์š”์ฒญ ๋ฌธ์ œ ํ•ด๊ฒฐ: ๋ฌธ์ œ์ ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜๋Œ€๋กœ ๋Œ€์ถœ ์‹ ์ฒญ ํ”„๋กœ์„ธ์Šค ์ค‘ ์ž„์‹œ ์ €์žฅ ๊ธฐ๋Šฅ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ž„์‹œ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ์ฃผ์†Œ์— ๋Œ€ํ•ด ์ค‘๋ณต ์กฐํšŒ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ž„์‹œ์ €์žฅ์„ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ Cache hit ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์„ ๊ฑฐ๋ผ ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ฒซ ์š”์ฒญ ์ง€์—ฐ ๊ฐ์ˆ˜: Look-aside ํŒจํ„ด์˜ ํŠน์„ฑ์ƒ ์ฒซ ์š”์ฒญ์€ ๊ธฐ์กด ์†๋„์™€ ๋™์ผ ํ• ํ…Œ์ง€๋งŒ ์ดํ›„ ๋™์ผํ•œ ์š”์ฒญ์€ ์บ์‹œ๋กœ๋ถ€ํ„ฐ ๋น ๋ฅด๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


3. ๊ตฌํ˜„ ๊ณผ์ •

๐Ÿ”น ๊ธฐ์ˆ  ์Šคํƒ

  • Redis: ์ธ๋ฉ”๋ชจ๋ฆฌ DB๋กœ Redis๋ฅผ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์— ๋ถ„์‚ฐ ๋ฝ ๋ฐ Session Clustering ์šฉ๋„๋กœ redis๋ฅผ ์‚ฌ์šฉ์ค‘์ด๊ธฐ๋„ ํ•ด์„œ ์ถ”๊ฐ€์ ์ธ Infra ์…‹ํŒ…์ด ํ•„์š”ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ๊ฐ€์žฅ ๋งค๋ ฅ์ ์ด์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ”น ๊ตฌํ˜„ ํ๋ฆ„

[์‚ฌ์šฉ์ž ์š”์ฒญ] โžž [์บ์‹œ ํ™•์ธ] โžž [์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜] โžž [์—†์œผ๋ฉด ์™ธ๋ถ€ API ํ˜ธ์ถœ] โžž [์‘๋‹ต ๋ฐ์ดํ„ฐ ์บ์‹œ์— ์ €์žฅ] โžž [์‘๋‹ต ๋ฐ˜ํ™˜]

๐Ÿ”น ์ฃผ์š” ๊ตฌํ˜„ ์ฝ”๋“œ ์˜ˆ์‹œ

@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofSeconds(86400))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

    Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
    cacheConfigurations.put("realPrice", getRealPriceCacheConfiguration());

    return RedisCacheManager.builder(redisConnectionFactory)
            .cacheDefaults(defaultCacheConfig)
            .withInitialCacheConfigurations(cacheConfigurations)
            .build();
}

private RedisCacheConfiguration getRealPriceCacheConfiguration() {
    long secondsUntilThursday = ChronoUnit.SECONDS.between(LocalDateTime.now(), LocalDateTime.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.THURSDAY)).withHour(23).withMinute(30));
    return RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(secondsUntilThursday));
}

if(!noCache) {
  try {
      Cache searchCache = cacheManager.getCache("realPrice");
      String cacheKey = buildingCd;
      RealPriceInquiryResponse cacheData = searchCache.get(cacheKey, RealPriceInquiryResponse.class);

      if (cacheData != null) return cacheData;
  } catch (Exception e) {
      log.error("Cache lookup failed", e);
  }
}

RealPriceInquiryResponse response = webClient.requestRealPriceApi();

try {
    searchCache.put(cacheKey, response);
} catch (Exception e) {
    log.error("Cache save failed", e);
}

return response;

  • Client Server : ์ผ๋ฐ˜์‚ฌ์šฉ์ž๊ฐ€ Client์ธ WAS
  • Admin Server : ๋ฐฑ์˜คํ”ผ์Šค WAS
  • API Server : ์™ธ๋ถ€ ์„œ๋ฒ„์™€ ํ†ต์‹ ์„ ์ถ”์ƒํ™”ํ•œ ์„œ๋ฒ„
  • External Api Server : ์™ธ๋ถ€ API ์„œ๋ฒ„

์œ„ ๊ทธ๋ฆผ์€ API ์„œ๋ฒ„์˜ ์บ์‹œ ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•œ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. API ์„œ๋ฒ„๋Š” ์™ธ๋ถ€ ์„œ๋ฒ„์™€ ํ†ต์‹ ์„ ์ถ”์ƒํ™”ํ•œ ์„œ๋ฒ„๋กœ, ์€ํ–‰ ์ „๋ฌธ ๋“ฑ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ต์‹ ์„ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Client Server์™€ Admin Server๋Š” API Server๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉฐ, ์ด๋•Œ API ์„œ๋ฒ„๋Š” ๋จผ์ € ์บ์‹œ๋ฅผ ํ™•์ธํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ์™ธ๋ถ€ API ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ , ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ์— ์ €์žฅํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ, Admin Server์˜ ๊ฒฝ์šฐ, ๋Œ€์ถœ ํ•œ๋„ ์‹ฌ์‚ฌ์™€ ๊ฐ™์ด ๋” ์ •ํ™•ํ•œ ์ •๋ณด๊ฐ€ ์š”๊ตฌ๋˜๋ฏ€๋กœ, ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€ API ์„œ๋ฒ„์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜์—ฌ ์ตœ์‹  ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.


4. ์„ฑ๊ณผ ๋ฐ ๊ฐœ์„  ํšจ๊ณผ


(์ฒซ ์š”์ฒญ์€ ํ‰๊ท  ์•ฝ 5100ms๋กœ ๋™์ผ ์บ์‹œ hit์‹œ ํ‰๊ท  57ms)

๊ตฌ๋ถ„๋„์ž… ์ „๋„์ž… ํ›„
ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„5132ms1299ms
Cache Miss5132ms5231ms
Cache HitX57ms
API ํ˜ธ์ถœ ํšŸ์ˆ˜100%76% ๊ฐ์†Œ
์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„๋‚ฎ์Œ๋น„๊ต์  ์ƒ์Šน
  • ์‘๋‹ต ์†๋„ ๊ฐœ์„ : ํ‰๊ท  5132ms์˜€๋˜ ์‘๋‹ต ์‹œ๊ฐ„์ด 1299ms๋กœ 74.69% ๊ฐœ์„ ๋์Šต๋‹ˆ๋‹ค.

  • API ๋น„์šฉ ์ ˆ๊ฐ: ์™ธ๋ถ€ API ํ˜ธ์ถœ ํšŸ์ˆ˜๊ฐ€ 76% ์ด์ƒ ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ: ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋นจ๋ผ์ ธ ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


5. ์บ์‹œ ๋งŒ๋ฃŒ ์ „๋žต

์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชฉ์ ํ•˜๋Š” ๋ฐ”์— ๋ถ€ํ•ฉํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €ํฌ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์™ธ๋ถ€ API์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์บ์‹œ๊ฐ€ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์œผ๋ฉด, ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๋Œ€์ถœํ•œ๋„๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต๋  ์œ„ํ—˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ API์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์‹œ์ ์— ์บ์‹œ๋ฅผ ๋น„์šฐ๋Š” ์ „๋žต์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ API์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ฃผ๊ธฐ๊ฐ€ ์ผ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์‹œ๊ฐ„์— ๋งž์ถฐ Redis์— ์ €์žฅ๋œ ํŠน์ • ํ‚ค์˜ ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

Redis ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋œ ์ƒํ™ฉ์—์„œ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด LRU(Least Recently Used) ์ •์ฑ…์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.


6. ๊ฒฐ๋ก 

์ด๋ฒˆ Look-aside ์บ์‹œ ๋„์ž…์„ ํ†ตํ•ด ์™ธ๋ถ€ API ํ˜ธ์ถœ์— ์˜์กดํ•˜๋Š” ์„œ๋น„์Šค์— ์บ์‹œ๋ฅผ ํ™œ์šฉํ•จ์œผ๋กœ์จ ์‘๋‹ต ์†๋„๋ฅผ ์กฐ๊ธˆ์ด๋ผ๋„ ๊ฐœ์„  ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์€ ์„œ๋น„์Šค ์šด์˜์— ์žˆ์–ด ํ”ผํ•  ์ˆ˜ ์—†๋Š” ์ˆœ๊ฐ„๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์ฃผ์–ด์ง„ ํ™˜๊ฒฝ ์•ˆ์—์„œ ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š”๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š๋‚˜ ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ž‘์—…์„ ํ†ตํ•ด ์–ป์€ ๊ฒฝํ—˜๋“ค๊ณผ ๊ฐœ์„ ์‚ฌํ•ญ๋“ค์ด ์—ฌ๋Ÿฌ๋ถ„๋“ค์—๊ฒŒ ์กฐ๊ธˆ์ด๋ผ๋„ ๋„์›€์ด ๋์œผ๋ฉดํ•˜๋ฉฐ ์ด๋งŒ ๊ธ€์„ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

profile
ํ•˜๋ฃจํ•˜๋ฃจ ๋” ๋ฐœ์ „ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

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