๐ŸŒฑ โ†’ ๐ŸŒณ

Spring์—์„œ Redis๋กœ ์บ์‹ฑ์ฒ˜๋ฆฌ ๋ณธ๋ฌธ

Server/Java & Spring

Spring์—์„œ Redis๋กœ ์บ์‹ฑ์ฒ˜๋ฆฌ

thals0 2023. 5. 16. 01:02
728x90
  • UT๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์š”์ฒญ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์–ด์˜ค๋Š” Service์— ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก Server side caching์„ ์ ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.
  • @Cacheable์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ์กฐํšŒ๊ฐ€ ๋งŽ์ด ์ƒ๊ธฐ๋Š” ๊ณต๊ณ  ์กฐํšŒ ๋กœ์ง์„ Redis๋ฅผ ์ด์šฉํ•˜์—ฌ ์บ์‹ฑ์ฒ˜๋ฆฌ
// ๋ ˆ๋””์Šค ์บ์‹œ
    @Bean
    public RedisCacheManager redisCacheManager() {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
                .defaultCacheConfig()
                .disableCachingNullValues()
                .serializeValuesWith(
                        RedisSerializationContext.SerializationPair
                                .fromSerializer(new GenericJackson2JsonRedisSerializer(objectMapper))
                );

        return RedisCacheManager.RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory())
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }
// domain.study.service.StudySearchService

// ์บ์‹œ ํ‚ค ์ƒ์„ฑ
    public String generateCacheKey(String keyword, int pageIndex, int pageCount, String sortedType, UserDetailsImpl userDetails, CompanyDetailsImpl companyDetails) {
        String userId = userDetails != null ? String.valueOf(userDetails.getUser().getId()) : "null";
        String companyId = companyDetails != null ? String.valueOf(companyDetails.getCompany().getId()) : "null";

        return "CustomKey [" + keyword + "," + pageIndex + "," + pageCount + "," + sortedType + "," + userId + "," + companyId + "]";
    }

 

์บ์‹ฑ ์ ์šฉ ์ „ 

 

์บ์‹ฑ ์ ์šฉ ํ›„ 

 

RedisTemplate (low level)

RedisTemplate์€ Redis์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋„๋ก ๋†’์€ ์ˆ˜์ค€์œผ๋กœ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋กœ ๋‹ค์–‘ํ•œ Redis ์—ฐ์‚ฐ, ์˜ˆ์™ธ ๋ณ€ํ™˜, ํŠธ๋žœ์žญ์…˜, ์ง๋ ฌํ™” ์ปค์Šคํ…€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

  • Redis ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ: Redis๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ, Atomicํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ RaceCondition์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. Redis ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ ์ข€ ๋” ํฐ ๋‹จ์œ„๋กœ ๊ทธ๋Ÿฌํ•œ Atomicํ•œ ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋“ค์„ ํ•œ ๋ฌถ์Œ์œผ๋กœ ๋ฌถ์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. MULTI โ†’ commands โ†’ EXEC/DISCARD

 

Redis Config

 ConnectionFactory๋Š” lettuce๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ RedisTemplate ๋นˆ์„ ๋“ฑ๋กํ•ด์ค€๋‹ค.

 

Serializer

  • JdkSerializationRedisSerializer: ๋””ํดํŠธ๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” Serializer์ด๋‹ค.
  • StringRedisSerializer: String ๊ฐ’์„ ์ •์ƒ์ ์œผ๋กœ ์ฝ์–ด์„œ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—”ํ‹ฐํ‹ฐ๋‚˜ VO๊ฐ™์€ ํƒ€์ž…์€ cast ํ•  ์ˆ˜ ์—†๋‹ค.
  • Jackson2JsonRedisSerializer(classType.class): classType ๊ฐ’์„ json ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค. ํŠน์ • ํด๋ž˜์Šค(classType)์—๊ฒŒ๋งŒ ์ง์†๋˜์–ด์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
  • GenericJackson2JsonRedisSerializer: ๋ชจ๋“  classType์„ json ํ˜•ํƒœ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์šฉ์ ์ธ Jackson2JsonRedisSerializer์ด๋‹ค. ์บ์‹ฑ์— ํด๋ž˜์Šค ํƒ€์ž…๋„ ์ €์žฅ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ RedisTemplate์„ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์บ์‹ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ข‹๋‹ค

 

 

728x90