설치법은 아래에 있어요
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
'스프링 부트 > 코틀린' 카테고리의 다른 글
[코틀린] 생성시간, 수정시간 Auditing으로 자동 적용하기 (0) | 2022.03.11 |
---|---|
[코틀린] QueryDSL 초기 설정법 (0) | 2022.03.11 |
[코틀린] 인터페이스 사용법 (0) | 2022.03.09 |
[코틀린] 데이터 클래스 data class (0) | 2022.03.09 |
[코틀린] for문, while문, Iterator 사용법 (0) | 2022.03.09 |
댓글