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

Spring & Spring Boot

[Redis] Redis Cache ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™” ์˜ค๋ฅ˜์˜ ๋ฐœ์ƒ๊ณผ ํ•ด๊ฒฐ

๐Ÿ“– ๋ชฉ์ฐจ

 

 

 


 

ํ•ญ๊ณต๊ถŒ ํ‹ฐ์ผ“ํŒ… ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘, ํ•ญ๊ณต๊ถŒ ์กฐํšŒ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Redis Cache๋ฅผ ์ ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์บ์‹œ๋ฅผ ์ €์žฅํ•ด์„œ ๊บผ๋‚ด์˜ค๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

์–ด๋–ค ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

 

 

 

 

 

 

 

๐Ÿ“Œ  Redis Cache๋ฅผ ์ ์šฉํ•˜๊ฒŒ ๋œ ์ด์œ 

  ์šฐ์„  Spring Boot MSA ์•„ํ‚คํ…์ฒ˜ ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์—๋„ ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ์˜€๊ณ , ๊ทธ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•ญ๊ณต๊ถŒ ์˜ˆ๋งค ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์ด๋•Œ, ๋Œ€๊ธฐ์—ด๊ณผ ์˜ˆ์•ฝ ์„œ๋น„์Šค ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ํ•ญ๊ณตํŽธ API(Amadeus API)๋ฅผ ์—ฐ๋™ํ•œ ํ†ตํ•ฉ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฌธ์ œ์ ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๐Ÿ’ก Jmeter๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณธ ๊ฒฐ๊ณผ,

     โœ”๏ธ ์Šค๋ ˆ๋“œ ์ˆ˜: 100
     โœ”๏ธ Ramp-up ์‹œ๊ฐ„: 1
     โœ”๏ธ ๋ฃจํ”„ ์นด์šดํŠธ: 10

* ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—์„œ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์€ 200.0/sec ์ด์ƒ์ด์–ด์•ผ ํ–ˆ์ง€๋งŒ, ์ง์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ดค์„ ๋•Œ ์ฒ˜๋ฆฌ๋Ÿ‰์€ 160.0/sec๋กœ ํ•ด๋‹น ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

 

 

< ์„ฑ๋Šฅ ๊ฐœ์„  ์ „, ์ฒ˜๋ฆฌ๋Ÿ‰ 160.0/sec >

 

 

 

  ์ดˆ๊ธฐ ๋ถ„์„์—์„œ๋Š” ๋Œ€๊ธฐ์—ด ์„ ์  ์‹คํŒจ ์‹œ ๋ฐ˜ํ™˜๋˜๋Š” ์‘๋‹ต ๋กœ์ง์—์„œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ํ•ด๋‹น ๋กœ์ง์„ ์ˆ˜์ •ํ•ด ๋ดค์ง€๋งŒ, ์ฒ˜๋ฆฌ๋Ÿ‰์€ ์ผ๋ถ€ ๊ฐœ์„ ๋  ๋ฟ ๊ธฐ๋Œ€๋งŒํผ ํ–ฅ์ƒ๋˜์ง€ ์•Š์•˜๋‹ค.

< ๋กœ์ง ์ˆ˜์ • ํ›„, ์ฒ˜๋ฆฌ๋Ÿ‰ 223.6/sec >

 

 

 

 

 

  ํ™•์ธ ๊ฒฐ๊ณผ, ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๊ทผ๋ณธ์ ์ธ ์›์ธ์€ ๋Œ€๊ธฐ์—ด ์„ ์  ๊ณผ์ •์—์„œ ํ•ญ๊ณตํŽธ ์ƒ์„ธ ์กฐํšŒ API๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋ฉฐ ๋ถˆํ•„์š”ํ•œ DB ์กฐํšŒ๊ฐ€ ๋‹ค์ˆ˜ ๋ฐœ์ƒํ•œ ๋ฐ ์žˆ์—ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•ญ๊ณตํŽธ ์ƒ์„ธ ์กฐํšŒ API์— Redis Cache๋ฅผ ์ ์šฉํ•˜์—ฌ ๋™์ผ ์š”์ฒญ์— ๋Œ€ํ•œ DB ์ ‘๊ทผ ์—†์ด ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

 

 

 

 

 


 

 

 

 

 

๐Ÿ“Œ  @Cacheable์˜ ์ ์šฉ

  Redis ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ObjectMapper์™€ CacheConfig๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น API์— @Cacheable ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ–ˆ๋‹ค.

// redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

// json serialization & deserialization
implementation 'com.fasterxml.jackson.core:jackson-databind'
implementation 'com.fasterxml.jackson.core:jackson-core'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'

 

@Configuration
public class CacheConfig {

    @Bean
    RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory, ObjectMapper objectMapper) {
        // ๊ธฐ๋ณธ ์ง๋ ฌํ™”๊ธฐ
        GenericJackson2JsonRedisSerializer genericSerializer = new GenericJackson2JsonRedisSerializer(
                objectMapper);
                
        ...
        // flights ์บ์‹œ ์„ค์ • (10์ดˆ TTL)
        RedisCacheConfiguration flightConfig = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(flightSerializer))
                .disableCachingNullValues()
                .entryTtl(Duration.ofSeconds(10));
        ...
    }
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(
            RedisConnectionFactory connectionFactory, ObjectMapper objectMapper
    ) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));

        return template;
    }
}

 

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());// Java 8 ๋‚ ์งœ ๋ชจ๋“ˆ ๋“ฑ๋ก
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // ISO-8601๋กœ ์ถœ๋ ฅ
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // ์•Œ ์ˆ˜ ์—†๋Š” ์†์„ฑ ๋ฌด์‹œ
        
        return objectMapper;
    }
}

 

@Cacheable(value = "flights", key = "#flightId")
public FlightDetailResponse getFlight(UUID flightId) {

    FlightEntity flight = getFlightById(flightId);

    return FlightDetailResponse.from(flight);
}

 

  ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ @Cacheable ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•œ ๋’ค๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

 

 

 

 


 

 

 

 

 

๐Ÿ“Œ  ์บ์‹œ ์ ์šฉ ํ›„, ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์ 

  ๊ณตํ•ญ, ํ•ญ๊ณต์‚ฌ, ํ•ญ๊ณตํŽธ ์กฐํšŒ API์— @Cacheable ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•œ ๋’ค, ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋˜ ๋„์ค‘์— 'ClassCastException'์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

< ๊ณตํ•ญ ์กฐํšŒ ์˜ˆ์‹œ - API ํ˜ธ์ถœ>
< ๊ณตํ•ญ ์กฐํšŒ ์˜ˆ์‹œ - ์ฒ˜์Œ API ํ˜ธ์ถœ ์‹œ ์กฐํšŒ ์ฟผ๋ฆฌ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ ํ™•์ธ >
< ๊ณตํ•ญ ์กฐํšŒ ์˜ˆ์‹œ - ์บ์‹œ์— ์ €์žฅ๋˜๋Š” ๊ฒƒ ํ™•์ธ>

 

 

 

์บ์‹œ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ํ•ด๋‹น API๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

< ๊ณตํ•ญ ์กฐํšŒ ์˜ˆ์‹œ - ๋™์ผํ•œ API ํ˜ธ์ถœ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ >
< ๊ณตํ•ญ ์ •๋ณด ์กฐํšŒ ์˜ˆ์‹œ - ClassCastException ๋ฐœ์ƒ >

 

 

 

  ์›์ธ์„ ๋ถ„์„ํ•ด ๋ณด๋‹ˆ ๋‹คํ˜•์„ฑ์ด๊ฑฐ๋‚˜ ์ปค์Šคํ…€ ๊ฐ์ฒด(AirportResponse ๊ฐ™์€ DTO)๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฒฝ์šฐ, ์—ญ์ง๋ ฌํ™” ์‹œ ํƒ€์ž… ์ •๋ณด๊ฐ€ ๋ˆ„๋ฝ๋˜๋ฉด Jackson์˜ ObjectMapper๋Š” ์ด๋ฅผ ์ •ํ™•ํžˆ ํŒ๋‹จํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ LinkedHashMap์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ๋˜์–ด ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€๋‹ค.

 

 

 

 

 


 

 

 

 

 

๐Ÿ“Œ  ์—ญ์ง๋ ฌํ™” ๋ฌธ์ œ ํ•ด๊ฒฐ ์‹œ๋„

  ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹คํ˜•์„ฑ ํƒ€์ž… ์ •๋ณด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํฌํ•จํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋„๋กObjectMapper ์„ค์ •์— PolymorphicTypeValidator๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ activateDefaultTyping์„ ์„ค์ •ํ–ˆ๋‹ค. 

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
    	// Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹คํ˜•์„ฑ ํƒ€์ž… ์ •๋ณด ๋ช…์‹œ์  ํฌํ•จ ๊ธฐ๋Šฅ
        PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator
                .builder()
                .allowIfSubType(Object.class)
                .build();

        ObjectMapper objectMapper = new ObjectMapper();
        ...
        // ํƒ€์ž… ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋„๋ก ์„ค์ •(๊ธฐ์กด ์„ค์ • ๋กœ์ง์— ptv ์„ค์ •๋งŒ ์ถ”๊ฐ€)
        objectMapper.activateDefaultTyping(ptv, ObjectMapper.DefaultTyping.NON_FINAL);
		...        
        
        return objectMapper;
    }
}

 

 

 

  ํ•ด๋‹น ์„ค์ • ํ›„ ๋‹ค์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ, ํ•ญ๊ณต ์„œ๋น„์Šค ๋‚ด์—์„œ ClassCastException ์˜ค๋ฅ˜๋Š” ์‚ฌ๋ผ์กŒ์ง€๋งŒ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ Response type์ด ๊ธฐ์กด๊ณผ ๋‹ฌ๋ผ์กŒ๊ณ , ์ด๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์„œ๋น„์Šค์—์„œ ํ•ด๋‹น APIํ˜ธ์ถœ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

< ์„ค์ • ์ ์šฉ ํ›„, Response type ๋ณ€ํ™” >

 

๊ธฐ์กด์—๋Š” DTO ํƒ€์ž… ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜์ง€๋งŒ activateDefaultTyping ์„ค์ •์œผ๋กœ ์ธํ•ด @class ํ•„๋“œ๊ฐ€ ์‚ฝ์ž…๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 


 

 

 

 

 

๐Ÿ“Œ  ์›์ธ ๋ถ„์„ ๋ฐ ํ•ด๊ฒฐ

  ํ•ด๋‹น ๋ฌธ์ œ์˜ ์›์ธ์„ ํŒŒ์•…ํ•ด ๋ณด๋‹ˆ, @class ํ•„๋“œ๊ฐ€ ์‚ฝ์ž…๋˜์–ด ์™ธ๋ถ€ ์„œ๋น„์Šค์—์„œ JSON ํŒŒ์‹ฑ์— ์‹คํŒจํ•ด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—ญ์ง๋ ฌํ™” ์˜ค๋ฅ˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ถˆํ•„์š”ํ•œ ํƒ€์ž… ์ •๋ณด๋Š” ์ €์žฅํ•˜๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ(activateDefaultTyping)์„ ObjectMapper ์„ค์ •์—์„œ ์ œ๊ฑฐํ•˜๊ณ , CacheConfig์—์„œ ๊ฐ ํƒ€์ž…๋ณ„๋กœ ์ง์ ‘ Serializer๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํƒ€์ž… ์ •๋ณด ์—†์ด ์ง๋ ฌํ™”๊ฐ€ ์ด๋ค„์ง€๋„๋ก ์„ค์ •ํ•ด ์ฃผ์—ˆ๋‹ค.

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        return objectMapper;
    }
}

 

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory, ObjectMapper objectMapper) {
        // ๊ธฐ๋ณธ ์ง๋ ฌํ™”๊ธฐ
        GenericJackson2JsonRedisSerializer genericSerializer = new GenericJackson2JsonRedisSerializer(
                objectMapper);

        // ํŠน์ • DTO์šฉ ์ง๋ ฌํ™”๊ธฐ
        Jackson2JsonRedisSerializer<AirportResponse> airportSerializer = new Jackson2JsonRedisSerializer<>(
                objectMapper, AirportResponse.class);
        Jackson2JsonRedisSerializer<AirlineResponse> airlineSerializer = new Jackson2JsonRedisSerializer<>(
                objectMapper, AirlineResponse.class);
        Jackson2JsonRedisSerializer<FlightDetailResponse> flightSerializer = new Jackson2JsonRedisSerializer<>(
                objectMapper, FlightDetailResponse.class);

        // ๊ธฐ๋ณธ ์บ์‹œ ์„ค์ •
        RedisCacheConfiguration baseConfig = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericSerializer))
                .disableCachingNullValues();

        // airports ์บ์‹œ ์„ค์ • (12์‹œ๊ฐ„ TTL)
        RedisCacheConfiguration airportConfig = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(airportSerializer))
                .disableCachingNullValues()
                .entryTtl(Duration.ofHours(12));

        // airlines ์บ์‹œ ์„ค์ • (12์‹œ๊ฐ„ TTL)
        RedisCacheConfiguration airlineConfig = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(airlineSerializer))
                .disableCachingNullValues()
                .entryTtl(Duration.ofHours(12));

        // flights ์บ์‹œ ์„ค์ • (10์ดˆ TTL)
        RedisCacheConfiguration flightConfig = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(flightSerializer))
                .disableCachingNullValues()
                .entryTtl(Duration.ofSeconds(10));

        // flightOffers ์บ์‹œ ์„ค์ • (1๋ถ„ TTL)
        RedisCacheConfiguration flightOffersConfig = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericSerializer))
                .disableCachingNullValues()
                .entryTtl(Duration.ofMinutes(1));
        ...
    }
    ...
}

 

 

 

 

 


 

 

 

 

 

  ๊ทธ ๊ฒฐ๊ณผ, Response type์—์„œ @class๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉฐ ํ•ด๋‹น API ํ˜ธ์ถœ ์‹œ ์ •์ƒ์ ์œผ๋กœ ์บ์‹œ์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋‹ค๋ฅธ ์„œ๋น„์Šค์—์„œ ํ˜ธ์ถœ ์‹œ์—๋„ ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™” ์˜ค๋ฅ˜ ์—†์ด ์„ฑ๊ณต์ ์œผ๋กœ ์บ์‹œ์—์„œ ์กฐํšŒํ•ด ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

< ํ•ญ๊ณตํŽธ ์กฐํšŒ ์š”์ฒญ >
< Redis Cache์— ์ €์žฅ >
< ์˜ค๋ฅ˜ ์—†์ด ์„ฑ๊ณต์ ์œผ๋กœ ์กฐํšŒ >

 

 

 

 

 


 

 

 

 

 

  ์—ฌ๊ธฐ๊นŒ์ง€ Redis Cache ์ ์šฉ ์‹œ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™” ๋ฌธ์ œ์˜ ์›์ธ๊ณผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ์บ์‹œ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•œ ๋‚ด์šฉ๊ณผ ์œ„์—์„œ ์ž์ฃผ ์–ธ๊ธ‰ํ–ˆ๋˜ ObjectMapper์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ํฌ์ŠคํŒ…์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

[Redis] Redis Cache๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์กฐํšŒ ์†๋„ ๊ฐœ์„ ํ•˜๊ธฐ - (1)

๐Ÿ“– ๋ชฉ์ฐจ SpringBoot๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด์ปค๋จธ์Šค ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘,์ด์ปค๋จธ์Šค์˜ ํŠน์„ฑ์ƒ ์กฐํšŒํ•˜๋Š” ์ผ์ด ๋งŽ์€๋ฐ ์„ฑ๋Šฅ์ด ์ž˜ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.๋จผ์ €, Redis์˜ ์–ด๋–ค ํŠน์ง• ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜

zzudev.tistory.com

 

 

[Java] Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ObjectMapper

 

zzudev.tistory.com