[Redis] CRUD with Spring Boot -2

반응형

이번 글에서는 spring boot의 CRUD Repository를 활용해서 CRUD를 구현해보겠습니다.

1. Redis Server

이번 실습을 위해선 redis server가 하나 필요합니다. 저는 AWS EC2에 redis server를 구동시켰습니다.

image.png

2. application.yml

application.yml 파일에 아래와 같이 redis properties 정보를 입력합니다. redis의 default port는 6379입니다.

spring:
  redis:
    host: "hostname"
    port: 6379

3. build.gradle

build.gradle 파일을 열고 아래와 같이 redis dependency를 추가합니다. spring-boot 2에서 redis dependecy는 기본 client로 lettuce를 사용합니다.

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

4. Project Structure

이번 예제에서는 Point entity를 사용하도록 하겠습니다. 또한, Spring Data의 CRUD Repository를 사용해보도록 하겠습니다.

RedisConfig

이번에 사용할 redisTemplate은 byte[]를 입력받도록 하겠습니다.

@Configuration
@EnableRedisRepositories
@RequiredArgsConstructor
public class RedisConfig {

    private final RedisProperties redisProperties;

    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(redisProperties.getHost());
        redisStandaloneConfiguration.setPort(redisProperties.getPort());

        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
        return lettuceConnectionFactory;
    }


    @Bean
    public RedisTemplate<?, ?> redisTemplate(){
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}

Point

Point는 아래와 같은 구조를 가지며 @RedisHash를 사용해 Point Class가 Redis 객체라고 명시하도록 하겠습니다. 이때 입력한 "point"는 향후 key값을 생성할 때 사용됩니다.

@Getter
@RedisHash("point")
public class Point implements Serializable {

    @Id
    private String id;
    private Long amount;
    private LocalDateTime refreshTime;

    @Builder
    public Point(String id, Long amount, LocalDateTime refreshTime){
        this.id = id;
        this.amount = amount;
        this.refreshTime = refreshTime;
    }

    public void refresh(long amount, LocalDateTime refreshTime){
        if(refreshTime.isAfter(this.refreshTime)){
            this.amount = amount;
            this.refreshTime = refreshTime;
        }
    }
}

PointRepository

이전과는 다르게 CrudRepository를 사용하도록 하겠습니다. 이 경우에는 redis를 JPA처럼 사용할 수 있습니다.

@Repository
public interface PointRedisRepository extends CrudRepository<Point, String> {

}

간단한 CRUD 기능만 사용할 것이므로 추가적인 Impl 클래스는 사용하지 않겠습니다.

5. Test

RedisApplicationTest

이번에는 JUnit을 사용해 redis의 CRUD가 정상적으로 작동하는지 확인해보겠습니다. 아래와 같이 Test를 작성하고 실행합니다.

@SpringBootTest
@RunWith(SpringRunner.class)
class RedisApplicationTests {

    @Autowired
    private PointRedisRepository pointRedisRepository;

    @After
    public void tearDown() throws Exception{
        pointRedisRepository.deleteAll();
    }

    @Test
    public void 기본_등록_조회기능() {
        // given
        String id = "minho";
        LocalDateTime refreshTime = LocalDateTime.of(2020,1,9,0,0);
        Point point = Point.builder()
                        .id(id)
                        .amount(1000L)
                        .refreshTime(refreshTime)
                        .build();
        // when
        pointRedisRepository.save(point);

        // then
        Point savedPoint = pointRedisRepository.findById(id).get();
        assertThat(savedPoint.getAmount(), is(equalTo(1000L)));
        assertThat(savedPoint.getRefreshTime(), is(equalTo(refreshTime)));
    }

}

아래와 같이 정상적으로 Test가 통과한것을 확인할 수 있습니다.

image.png

redis server의 log는 아래와 같습니다. 😁

image.png


참고 자료 : https://jojoldu.tistory.com/297 👏👏👏


추천서적

 

Redis Essentials

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

'Redis' 카테고리의 다른 글

[Redis] Cache with Spring Boot  (0) 2020.08.21
[Redis] CRUD with Spring Boot -1  (0) 2020.08.21
[Redis] HyperLogLog  (0) 2020.08.21
[Redis] Geo  (0) 2020.08.21
[Redis] Publish/Subscribe  (0) 2020.08.20

댓글

Designed by JB FACTORY