코딩마을방범대

Redis - (6) Java에서 Redis 사용하기(Repository) 본문

💡 백엔드/Redis

Redis - (6) Java에서 Redis 사용하기(Repository)

신짱구 5세 2023. 6. 19. 17:55
728x90

 

 

Redis - (1) 기본 개념

Redis - (2) 우분투 서버에 Redis 세팅하기

Redis - (4) Java에서 Redis 사용하기(Jedis)

Redis - (5) Java에서 Redis 사용하기(Lettuce)


 

5에서는 RedisTemplate를 통해 직접 Redis에 접근했다면

이번엔 RedisTemplate를 통해 RedisRepository에서 접근해서 사용하는 방식이다.

 

 

build.gradle


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

 

 

 

application.yml

!! 트랜잭션을 사용하지 않는 경우 pool 옵션은 줄 필요 없음 !!


  
spring:
redis:
# 레디스 서버 주소 (local일 경우 localhost)
host: ip주소
# 비밀번호
password: 비밀번호
# 레디스 서버 포트
port: 포트번호
# 커넥션 타임아웃 (단위 밀리세컨드)
timeout: 1000
pool:
# 풀에서 관리하는 idle 커넥션의 쵀소수 대상 (양수일 때만 유효)
max-idle: 8
# 풀에서 관리하는 idle 커넥션의 최소수 대상 (양수일 때만 유효)
min-idle: 0
# pool에 할당될 수 있는 커넥션 최대수 (음수로 하면 무제한)
max-active: 8
# pool이 바닥났을 때 예외 발생 전, 커넥션 할당 차단 최대 시간(단위 밀리세컨드, 음수는 무제한 차단)
max-wait: -1

 

 

RedisProperties


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

 

 

Configuration

spring-boot 2.2 버전 이상부터는 autoConfiguration에 의해 restTemplate과 redisConnectionFactory가 자동 생성된다.
(redis template Bean 4개)

redisTemplate와 stringRedisTemplate의 차이는 Serializer(직렬화)

redisTemplate JdkSerializationRedisSerializer방식

stringRedisTemplate StringRedisSerializer방식


  
@Configuration
@RequiredArgsConstructor
public class RedisConfiguration {
private final RedisProperties redisProperties;
private String host;
private int port;
private String password;
@PostConstruct
protected void init() {
host = redisProperties.getHost();
port = redisProperties.getPort();
password = redisProperties.getPassword();
}
// TCP 통신
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
// 패스워드 있을 경우
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(host);
redisStandaloneConfiguration.setPort(port);
redisStandaloneConfiguration.setPassword(password);
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
return lettuceConnectionFactory;
// 패스워드 없을 경우
return new LettuceConnectionFactory(new RedisStandaloneConfiguration(host, port));
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
직렬화          : Java 내부의 데이터들을 외부에서 사용 가능하도록 바이트 형태로 데이터를 변환하는 기술
역직렬화      : 바이트 데이터를 원래 Object로 변환하는 기술

LettuceConnectionFactory

  • Lettuce로 Redis와의 연결을 진행
  • Redis의 주소와 포트를 파라미터로 넣어줌

RedisTemplate

  • 데이터의 추가 조회 작업 수행

 

 

 

Model


  
@Getter
@RedisHash("people")
public class Person {
@Id
String id;
String firstname;
String lastname;
Address address;
@Builder
public Person(String id, String firstname, String lastname, Address address) {
this.id = id;
this.firstname = firstname;
this.lastname = lastname;
this.address = address;
}
}
@Getter
public class Address {
private String address;
public Address(String address) {
this.address = address;
}
}

 

 

Repository


  
public interface PersonRedisRepository extends CrudRepository<Person, String> {
}

 

 

사용


  
@Service
@RequiredArgsConstructor
public class RedisTest {
private final PersonRedisRepository redisRepository;
public void redisTest(){
Address address = new Address("서울특별시 서울시청");
Person person = new Person(null, "fisrt", "last", address);
Person savedPerson = redisRepository.save(person);
}
}

 

 

위와 같이 사용하여 저장 시 

people이라는 set 타입people:id라는 hash 타입이 저장됩니다.

 

1. people ( set타입 ) 조회 시

Person 객체의 id를 null 값으로 주었기 때문에 redis의 랜덤값이 id로 지정됨


  
> smembers people

 

2. people:id ( hash타입 ) 조회 시

Person 객체에서 지정한 필드들이 key값으로 나옴


  
> hkeys people:id

 

Person 객체의 값들이 출력됨


  
> hvals people:id

 

 

 

 

 


참고사이트

[Java + Redis] Spring Data Redis로 Redis와 연동하기 - RedisRepository 편

 

 

 

728x90