컴퓨터에 레디스가 설치되었다는 가정 하에 진행합니다..
아래와 같이 레디스를 키고..!
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));
}
}