본문 바로가기
스프링 부트/코틀린

[코틀린] redis cache 적용 시키기

by illlilillil 2022. 3. 11.

설치법은 아래에 있어요

2022.02.03 - [맥북 M1] - 맥북으로 도커에 redis 설치하고 실행해보기

 

build.gradle에 추가


//redis 추가
implementation("org.springframework.boot:spring-boot-starter-data-redis")

 

 

 

메인 어플리케이션에 @EnableCaching을 추가해야 캐시를 쓸 수 있다.


@SpringBootApplication
@EnableJpaAuditing
@EnableCaching
class KotlinTestApplication

fun main(args: Array<String>) {
    runApplication<KotlinTestApplication>(*args)
}

 

RedisConfig 추가


직렬화해서 저장할거기 때문에 StringRedisSeriablizer()을 설정해준다.

 

스프링에서 redis를 사용하는 방법은 Jedis와 Lettuce가 있는데 Lettuce가 성능이 더 좋기 때문에 Lettuce를 사용할거다.

https://jojoldu.tistory.com/418 이 글의 일부분을 참조했다.

 

                                                                                               TPS                           CPU                    Connection  응답 속도

jedis no connection pool 31,000 20% 35 100ms
jedis use connection pool 55,000 69.5% 515 50ms
lettuce 100,000 7% 6 7.5ms

lettuce가 압도적으로 성능이 좋은걸 볼 수 있다.

@Configuration
class RedisConfig : CachingConfigurerSupport() {
    @Bean
    fun lettuceConnectionFactory(): LettuceConnectionFactory {
        val lettuceClientConfiguration = LettuceClientConfiguration.builder()
            .commandTimeout(Duration.ZERO)
            .shutdownTimeout(Duration.ZERO)
            .build()
        val redisStandaloneConfiguration = RedisStandaloneConfiguration("localhost", 6379)
        return LettuceConnectionFactory(redisStandaloneConfiguration, lettuceClientConfiguration)
    }

    @Bean
    fun redisTemplate(): RedisTemplate<*, *> {
        val template = RedisTemplate<ByteArray, ByteArray>()
        template.keySerializer = StringRedisSerializer()
        template.valueSerializer = StringRedisSerializer()
        template.setConnectionFactory(lettuceConnectionFactory())
        return template
    }

    @Bean
    override fun cacheManager(): CacheManager {
        val builder = RedisCacheManager.RedisCacheManagerBuilder
            .fromConnectionFactory(lettuceConnectionFactory())
        val configuration = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(1))
        builder.cacheDefaults(configuration)
        return builder.build()
    }
}

 

@Cacheable 추가


게시판 CRUD에 @Cacheable만 추가해줬다. 특이하게 arrayOf()를 사용해야 한다.

준비는 끝났으니 테스트 해보자

@RestController
@RequestMapping("/board")
class BoardController(val boardRepository: BoardRepository) {
    @GetMapping
    fun getBoardList() = boardRepository.findAll()

    @GetMapping("/{boardId}")
    @Cacheable(value = arrayOf("board"))
    fun getBoard(@PathVariable("boardId") boardId: Long): Board {
        return boardRepository.findById(boardId).get()
    }

    @PostMapping
    fun postBoard(
        @RequestBody board: Board
    ): Board {
        return boardRepository.save(board)
    }

    @PutMapping("/{boardId}")
    fun updateBoard(
        @RequestBody board: Board,
        @PathVariable("boardId") boardId: Long
    ): Board {
        var preBoard: Board = boardRepository.findById(boardId).get()
        preBoard.title = board.title
        preBoard.description = board.description
        preBoard.writer = board.writer
        return boardRepository.save(preBoard)
    }

    @DeleteMapping("/{boardId}")
    fun deleteBoard(@PathVariable("boardId") boardId: Long) {
        boardRepository.deleteById(boardId)
    }
}

Board 생성

@Entity
@Table(name = "board")
class Board : Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long? = null
    var title: String? = null
    var description: String? = null
    var writer: String? = null
}

 

TEST


첫 조회 - 241ms

처음 조회를 하게 되면 redis에 캐시가 올라가게 된다.

 

다시 한번 조회 - 10ms

댓글