Redis?
- Key-value NoSQL DB
- 캐시 / 메세지 브로커 / Key-value Store로 사용가능
Redis 설치하기
- 의존성 추가 : spring-boot-starter-data-redis
- 레디스 인스턴스 생성
cf) redis는 공식적으로 윈도우를 지원하지 않지만, 능력자가 비공식적으로 사용할 수 있게 만들어놓았다.
해당 링크에서 설치한 뒤, 서버를 띄워서 cli를 사용하면 된다.
github.com/microsoftarchive/redis/releases
Redis 사용하기
첫번째 방법. StringRedisTemplate 또는 RedisTemplate
두번째 방법. CrudRepository
StringRedisTemplate 사용해보기
key:value를 조작할 수 있는 객체를 통해 직접 설정하는 방법
- RedisRunner class 생성 (implements ApplicationRunner)
- @Autowired StringRedisTemplate
- opsForValue() 메소드 = ValueOperations<K, V> 객체를 반환
(Key:value이므로 보통 <String, String>을 사용) - 해당 객체의 set(key, value)로 설정
- 어플리케이션이 실행되면서(ApplictionRunner) 자동으로 key:value를 설정한다.
@Component
public class RedisRunner implements ApplicationRunner {
@Autowired
StringRedisTemplate redisTemplate;
@Override
public void run(ApplicationArguments args) throws Exception {
ValueOperations<String, String> values = redisTemplate.opsForValue();
values.set("name", "kkambi");
values.set("age", "20");
}
}
CrudRepository 사용해보기
Spring Data JPA를 사용해 객체를 Relation으로 맵핑하는 것과 유사한 방법
1. Entity 역할의 클래스 생성
- @RedisHash("redis hash의 이름")을 도메인 클래스에 선언
- @RedisHash는 특정 해쉬값을 키, 해당 클래스의 인스턴스를 값으로 적재한다.
- ID필드에 @Id
- 나머지 필드는 어노테이션 없이 가능
- getter / setter 설정
@RedisHash
public class Forecast {
@Id
private String id;
private String POP; //강수확률
private String PYT; //강수형태
private String T3H; //3시간 기온
public String getPOP() {
return POP;
}
public void setPOP(String POP) {
this.POP = POP;
}
public String getPYT() {
return PYT;
}
public void setPYT(String PYT) {
this.PYT = PYT;
}
public String getT3H() {
return T3H;
}
public void setT3H(String t3H) {
T3H = t3H;
}
}
2. CrudRepository를 상속받는 AccountRepository Interface 생성
- CrudRepository<도메인 클래스 타입, Key 타입>
- Key는 String
- JPA Repository를 사용하는 것처럼 똑같이 사용하면 된다.
(Account 인스턴스 생성 → 필드값 설정 → save() 메소드) - CrudRepository를 extends하는 경우, findAll()은 Iterable<Forecast>를 반환하기 때문에 오버라이딩해준다.
public interface ForecastRepository extends CrudRepository<Forecast, String> {
@Override
List<Forecast> findAll();
}
cf) CrudRepository는 레디스에 특화된 것은 아니고, Spring Data의 최상위 Repository 인터페이스들 중 하나!
3. 테스트
- 해당 코드는 레디스에 계속해서 Forecast 객체를 저장하므로, 테스트 전 cleanUp하거나, 테스트 종료 시 삭제하는 과정이 필요하다.
@RunWith(SpringRunner.class)
@SpringBootTest
public class ForecastRepositoryTest {
@Autowired
private ForecastRepository forecastRepository;
@Test
public void save_forecast_in_redis() {
//given
String POP = "20";
String PTY = "10";
String T3H = "27";
forecastRepository.save(new Forecast.Builder()
.pop(POP)
.pty(PTY)
.t3h(T3H)
.build());
//when
List<Forecast> forecasts = forecastRepository.findAll();
//then
Forecast forecast = forecasts.get(0);
assertThat(forecast.getPOP()).isEqualTo(POP);
assertThat(forecast.getPTY()).isEqualTo(PTY);
assertThat(forecast.getT3H()).isEqualTo(T3H);
}
}
@RedisHash의 의미?
- 해당 클래스의 엔티티들이 수많이 저장될 텐데, 이들만을 보관하는 Hash Key를 설정.
- 이 해쉬 공간 속에서 각 엔티티들이 hash_id (@id에 맵핑되는 값)을 가지게 된다.
- 결과적으로 삼중 해쉬맵을 사용한다고 이해하면 된다.
- HashMap<String, HashMap<String, Account>>로 이해
- 첫번째 String은 @RedisHash의 이름
- 두번째 String은 hash_id
- Account는 key:value 형태로 값을 저장하고 있으며, getter로 value를 가져올 수 있음
(필드 이름이 key가 된다)
Redis 주요 커맨드
- keys *
- get {key}
- hgetall {key} : hash get all
- hget {key} {column} : hash get (key = hash_id / column = 엔티티에서 조회할 key)
- del {key}
Redis 커스터마이징
- 아무 설정을 하지 않았는데도, localhost:6379에 띄워진 Redis Instance에 연결한 것을 볼 수 있다.
- Spring Boot의 AutoConfiguration 덕분이다.
- 프로퍼티 설정을 통해 커스터마이징
- spring.redis.*
- 기본 포트 : 6379 (spring.redis.port)
- 기본 인스턴스 URL : localhost (spring.redis.url)
'학습 > Spring' 카테고리의 다른 글
[spring] 스프링 부트에서 Spring Security 커스터마이징하기 (0) | 2020.05.21 |
---|---|
[spring] 스프링 부트에서 Spring Security 사용하기 (0) | 2020.05.19 |
[spring] 데이터베이스 초기화 및 마이그레이션 (0) | 2020.05.17 |
[spring] 스프링 어노테이션 및 메소드 정리 (1) | 2020.05.10 |
[spring] 스프링 부트에서 Spring Data JPA 사용하기 (0) | 2020.05.07 |
댓글