본문 바로가기
개발 이야기/Springboot

[Kotlin] Springboot + Redis 사용법

by 농개 2020. 4. 26.

Redis메모리 DB로 일반적인 DB(disk를 사용)보다 속도가 빠릅니다.

그렇기 때문에 대량의 데이터를 다루는 서비스에서 캐시 서버로서 많이 사용됩니다.

 

해당 글에서는 코틀린을 사용해 Springboot + Redis 연동 및 간단한 사용방법을 정리합니다.

 

 

01. Dependency 추가

build.gradle.kt 파일을 열어 아래와 같이 Redis 사용을 위한 lib를 추가해줍시다.

...(중략)
repositories {
	mavenCentral()
}

dependencies {
	implementation("org.springframework.boot:spring-boot-starter-web")
	implementation("org.springframework.boot:spring-boot-starter-data-jpa")
	implementation("org.springframework.boot:spring-boot-starter-jdbc")
	implementation("org.springframework.boot:spring-boot-starter-data-redis") // 추가

spring-boot-starter-data-redis를 추가해줬습니다.

해당 라이브러리는 내부적으로 Lettuce라는 Redis 클라이언트 모듈을 이용해서 Redis 서버 연결을 수행합니다.

(예전에는 Jedis라는 모듈을 사용했는데, Springboot 2.0 이후 부턴 Lettuce가 기본 모듈로 채택되었습니다.)

 

 

 

02. application.properties 추가

(... 중략)
# Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379

 

 

 

 

03. Domain / Repository 작성

Redis에 입력될 HashMap 구조의 Domain을 아래와 같이 작성해봅시다.

package com.example.demo.api.redistest.domain

import org.springframework.data.redis.core.RedisHash
import javax.persistence.Id

@RedisHash("member")
data class Member (
        @Id
        val id : String? = null,
        val name : String? = null,
        val email: String? = null,
        var age: Int? = null
)

Redis에 hash 포맷으로 저장할 것이기 때문에 @RedisHash라는 Annotation을 사용해줬습니다.

 

그리고 위 객체의 입출력을 담당할 CrudRepository를 작성해줍시다.

package com.example.demo.api.redistest.repository

import com.example.demo.api.redistest.domain.Member
import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository

@Repository
interface MemberRepositoryRedis : CrudRepository<Member, String>{
}

 

 

04. Endpoint(Controller) 작성

package com.example.demo.api.redistest

import com.example.demo.api.redistest.domain.Member
import com.example.demo.api.redistest.repository.MemberRepositoryRedis
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/redis-test")
class RedisTestController (
        val memberRepositoryRedis: MemberRepositoryRedis
) {
    @GetMapping("/members")
    fun getMemberList(): ResponseEntity<Any> {
        val users = memberRepositoryRedis.findAll()

        val data = HashMap<String, Any>()
        data["userList"] = users
        return ResponseEntity.ok(data)
    }

    @PostMapping("/member")
    fun setMember(@RequestBody member: Member): ResponseEntity<Any> {
        memberRepositoryRedis.save(member)

        val data = HashMap<String, Any>()
        data["stats"] = "success"
        return ResponseEntity.ok(data)
    }
}

위와 같이 Redis에 저장된

member를 모두 가져오는 /redis-test/members

member를 저장하는 /redis-test/member를 정의해줬습니다.

 

 

이제 API가 정상 작동되는지 테스트해봅시다.

 

05. Member 입력

아래와 같은 데이터를 POST 전송~

// localhost:8080/redis-test/member POST
{
  "id": "115",
  "name": "Oh",
  "email": "eee@naver.com",
  "age": 15
}

 

redis-cli를 통해 잘 들어갔는지 확인해봅시다.

# redis-cli
127.0.0.1:6379> keys *
1) "member"
2) "member:115"
127.0.0.1:6379> 

member라는 hash와 member:115라는 객체가 저장됬네요!

Redis는 hash 저장시 HASH:ID 형태로 key를 잡습니다.(관습)

 

키를 값들이 잘 저장되었는지도 확인해봅니다.

127.0.0.1:6379> hgetall member:115
 1) "_class"
 2) "com.example.demo.api.redistest.domain.Member"
 3) "id"
 4) "115"
 5) "name"
 6) "Oh"
 7) "email"
 8) "eee@naver.com"
 9) "age"
10) "15"
127.0.0.1:6379> 

 

잘 저장된 것 같네요!