[Spring] Spring + Redis 연동

nayoon·2021년 3월 31일
1

proj_130

목록 보기
3/3

컴퓨터에 레디스가 설치되었다는 가정 하에 진행합니다..

아래와 같이 레디스를 키고..!

Spring 내에서 레디스 설정

build.gradle에 아래와 같이 작성한다.

// build.gradle

dependencies {

	// 프로덕션
	implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    // 로컬
    implementation 'it.ozimov:embedded-redis:0.7.2'

}

main 함수에 가서 아래와 같이 작성한다.

// ServerApplication.java

@SpringBootApplication
@EnableCaching // 추가할 부분
public class ServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);
    }
}

application.properties에 가서 아래와 같이 작성한다.

// application.properties

spring.profiles.include=redis

윗 줄의 의미는 application-redis.properties에 있는 내용을 복사해서 읽어오겠다는 뜻과 같다. 따라서 application-redis.properties 파일을 만든다.

// application-redis.properties

spring.redis.host=127.0.0.1
spring.redis.password=
spring.redis.port=6379
// RedisConfig.java

@RequiredArgsConstructor
@Configuration
@EnableRedisRepositories
public class RedisConfig {

    private final RedisProperties redisProperties;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(redisProperties.getHost(), redisProperties.getPort());
    }

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

내장 레디스일 경우에만 사용한다. (profile = local)일 경우에만 사용한다.

// EmbeddedRedisConfig.java

@RequiredArgsConstructor
@Profile("local")
@Configuration
public class EmbeddedRedisConfig {

    private final RedisProperties redisProperties;

    private RedisServer redisServer;

    @PostConstruct
    public void redisServer() {
        redisServer = new RedisServer(redisProperties.getPort());
        redisServer.start();
    }

    @PreDestroy
    public void stopRedis() {
        if (redisServer != null) {
            redisServer.stop();
        }
    }
}

RedisConfig와 EmbeddedRedisConfig에서 쓰이는 RedisProperties를 정의한다.

// RedisProperties.java

@Getter
@Setter
@ConfigurationProperties(prefix="spring.redis")
@Component
public class RedisProperties {
    private String host;
    private int port;
}

테스트코드

// RedisTest.java

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {

    @Autowired
    private PointRedisRepository pointRedisRepository;

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

    @Test
    public void 기본_등록_조회기능() {
        // given
        String id = "nayoon";
        LocalDateTime refreshTime = LocalDateTime.of(2021, 3, 31, 12, 32);
        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(1000L));
        assertThat(savedPoint.getRefreshTime(), is(refreshTime));
    }

    @Test
    public void 수정기능() {
        // given
        String id = "nayoon";
        LocalDateTime refreshTime = LocalDateTime.of(2021, 3, 31, 0, 0, 0);
        Point point = Point.builder()
                .id(id)
                .amount(1000L)
                .refreshTime(refreshTime)
                .build();
        pointRedisRepository.save(point);

        // when
        Point savedPoint = pointRedisRepository.findById(id).get();
        savedPoint.refresh(2000L, LocalDateTime.of(2021, 4, 1, 0, 0, 0));
        pointRedisRepository.save(savedPoint);

        // then
        Point refreshPoint = pointRedisRepository.findById(id).get();
        assertThat(refreshPoint.getAmount(), is(2000L));
    }
}

참고 사이트

https://jojoldu.tistory.com/297

profile
뚜벅뚜벅 열심히 공부하는 개발자

0개의 댓글

관련 채용 정보