ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [28] 스프링데이터: NoSQL - Redis
    Spring/Spring boot 2020. 9. 5. 08:29
    반응형

    REmote DIctionary Server는 속도가 빠른 오픈소스 in-memory key, value 데이터 구조 스토어입니다.

     

    REDIS를 사용하기 위해 spring boot project에 추가해야 할 의존성은 다음과 같습니다.

    <dependencies>
    	...
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
            <artipactId>spring-boot-starter-data-redis</artipactId>
    	</depedency>
        ...
    </dependencies>

     

     

    docker에 redis 이미지를 올립니다. (redis에서 사용하는 기본 port 번호는 6379입니다.) terminal에서 다음과 같은 docker 명령어를 입력하여 redis의 이미지를 docker에 올릴 수 있습니다.

    docker run -p 6379:6379 --name redis_boot -d redis

     

    이제 redis를 실행하기 위해 terminal에서 다음 명령어를 실행해주세요.

    docker exec -i -t redis_boot redis-cli

     

    redis 콘솔창에 keys * 를 입력하여 현재 key들을 확인해보면 아무 것도 없음을 볼 수 있습니다.

     

     

    spring data에서는 StringRedisTemplate 또는 RedisTemplate를 통해 redis를 사용할 수 있습니다.

    JPA와 마찬가지로 CrudRepository 인터페이스를 extends 하여 사용할 수 있습니다.

     

    사용자 계정에 대한 CRUD 기능을 작성하는 예제를 통해 Spring boot에서 redis를 어떻게 사용하는지 확인해보도록 합시다.

    우선 ID, 사용자명, 이메일 정보를 가진 계정 도메인을 먼저 작성 하도록 하겠습니다. account package를 만들고 그 안에 Account class와 AccountRepository interface를 생성합니다.

     

    Account class의 코드는 다음과 같습니다.

    package me.dave.account;
    
    import org.springframework.data.annotation.Id;
    import org.springframework.data.redis.core.RedisHash;
    
    @RedisHash("accounts")	//	①
    public class Account {
    
        @Id String id;	//	②
        private String username;
        private String email;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    }
    

    ① redis의 hash를 사용하기 위한 annotaion입니다.

    ② 자동생성되는 id입니다. long, String 어떤 type으로 해도 관계없습니다.

     

     

    AccountRepository interface의 코드는 다음과 같습니다.

    package me.dave.account;
    
    import org.springframework.data.repository.CrudRepository;
    
    public interface AccountRepository  extends CrudRepository<Account, String> {	//	①
    }
    

    ① CrudRepository<T, ID>는 curd를 다루는 최상위급 interface로 이를 상속 받으면 손쉽게 crud 기능을 정의할 수 있습니다.

     

     

    테스트를 위해 RedisRunner라는 이름으로 application runner class를 하나 만들어 줍니다.

    package me.dave;
    
    import me.dave.account.Account;
    import me.dave.account.AccountRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.ApplicationArguments;
    import org.springframework.boot.ApplicationRunner;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Component;
    
    import java.util.Optional;
    
    @Component
    public class RedisRunner implements ApplicationRunner {
    
        @Autowired
        StringRedisTemplate redisTemplate;	//	①
    
        @Autowired
        AccountRepository accountRepository;	//	②
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            ValueOperations<String, String> values = redisTemplate.opsForValue();	//	③
            values.set("dave", "daehee");	//	③
            values.set("springboot", "2.0");	//	③
            values.set("hello", "world");	//	③
    
            Account account = new Account();	//	④
            account.setEmail("dave@gmail.com");	//	④
            account.setUsername("dave");	//	④
    
            accountRepository.save(account);	//	⑤
    
            Optional<Account> byId = accountRepository.findById(account.getId());	//	⑥
            System.out.println(byId.get().getUsername());	//	⑥
            System.out.println(byId.get().getEmail());	//	⑥
        }
    }
    

    ① StringRedisTemplate 객체를 주입받습니다. 이 객체를 사용하여 redis를 사용할 수 있습니다.

    ② AccountRepository타입 객체를 주입 받습니다. 이 객체를 통해 CRUD를 진행합니다.

    ③ opsForValue()를 통해 StringRedisTemplate의 value 관련 연산들을 제공하는 객체를 받아오고 key, value pair를 저장합니다. (redisTemplate 타입도 사용할 수 있습니다.)

    ④ Account 객체를 생성하여 값을 넣습니다.

    ⑤ Account 객체의 내용을 redis에 저장합니다.

    ⑥ Id를 기준으로 Account 객체를 Optional<T>으로 가져오고 그 안의 값을 출력합니다.

     

     

    이제 정상적으로 데이터가 저장되었는지 redis 콘솔창에서 확인해보도록 합니다. 

    key * 로 모든 key를 확인하면 다음과 같이 입력된 key들이 조회됩니다.

     

     

    key에 해당하는 value는 아래와 같이 확인해볼 수 있습니다.

        get [Key] : 일반적인 key의 value를 가져옵니다.

        hget [Key] [Field] : hash code로 된 key의 value를 가져옵니다. colison을 고려하여 Field도 입력해줘야 합니다.

        hgetall [Key] : hash code에 해당하는 모든 value를 조회합니다.

    조회 결과는 다음과 같습니다.

     

     

    redis 커스터마이징

    application.properties에서 spring.redis.* 에 해당하는 설정 값들을 지정하는 것으로 커스터마이징 할 수 있습니다.

    아무런 설정 없이 redis를 사용할 수 있었던 이유는 기본 설정으로 6379 port를 통해 연결했기 때문인데, 만약 다른 URL에 접속한다거나 port를 변경하는 경우에는 각각에 해당하는 설정 값을 변경해줘야 정상적으로 사용할 수 있습니다.

     

     

    추가학습을 원하면

    https://redis.io/commands

     

    댓글

Designed by Tistory.