코딩마을방범대

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

💡 백엔드/Redis

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

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

 

 

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 편

 

 

 

SMALL