[Redis] CRUD with Spring Boot -1

반응형

이번 글에서는 spring boot에서 redis에 데이터를 CRUD 해보도록 하겠습니다.

1. Redis Server

이번 실습을 위해선 redis server가 하나 필요합니다. 저는 AWS EC2에 redis server를 구동시켰습니다.

image.png

2. application.yml

application.yml 파일에 아래와 같이 redis properties 정보를 입력합니다. redis의 default port는 6379입니다.

spring:
  redis:
    host: "hostname"
    port: 6379

3. build.gradle

build.gradle 파일을 열고 아래와 같이 redis dependency를 추가합니다. spring-boot 2에서 redis dependecy는 기본 client로 lettuce를 사용합니다.

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

4. Project Structure

이번 예제에서는 간단히 User entity를 사용해서 CRUD를 진행해보도록 하겠습니다. 전체 프로젝트 구조는 아래와 같습니다.

image.png

RedisConfig

먼저 project에서 사용할 redis configuration을 생성합니다.

@Configuration
@EnableRedisRepositories
@RequiredArgsConstructor
public class RedisConfig {

    private final RedisProperties redisProperties;

    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(redisProperties.getHost());
        redisStandaloneConfiguration.setPort(redisProperties.getPort());

        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration);
        return lettuceConnectionFactory;
    }

    @Bean
    public RedisTemplate<String, User> redisTemplate(){
        RedisTemplate<String, User> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}

redisProperties는 앞서 application.yml에 작성한 redis의 properties값을 가져와 redis configuration을 설정합니다.

User

User는 아래와 같이 3개의 field를 가집니다.

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private String id;
    private String name;
    private Long salary;
}

UserRepository

User의 CRUD를 담당할 Interface를 아래와 같이 생성합니다.

public interface UserRepository  {

    void save(User user);
    Map<String, User> findAll();
    User findById(String id);
    void update(User user);
    void delete(String id);

}

UserRepositoryImpl

만약 앞서 생성한 UserRepository Interface를 구현합니다. 이때 redisTemplate은 RedisConfig에서 생성한 @Bean을 사용합니다.

@Repository
public class UserRepositoryImpl implements UserRepository{

    private RedisTemplate<String, User> redisTemplate;

    private HashOperations hashOperations;

    public UserRepositoryImpl(RedisTemplate<String, User> redisTemplate) {
        this.redisTemplate = redisTemplate;
        hashOperations = redisTemplate.opsForHash();
    }

    @Override
    public void save(User user) {
        hashOperations.put("USER", user.getId(), user);
    }

    @Override
    public Map<String, User> findAll() {
        return hashOperations.entries("USER");
    }

    @Override
    public User findById(String id) {
        return (User) hashOperations.get("USER", id);
    }

    @Override
    public void update(User user) {
        save(user);
    }

    @Override
    public void delete(String id) {
        hashOperations.delete("USER", id);
    }
}

실제 CRUD 를 수행하는 대상은 HashOperations 입니다. redisTemplate.opsForHash() 메서드를 통해 hashOperations을 생성해 사용합니다.

UserController

간단한 @Restcontoller를 아래와 같이 생성합니다.

@RestController
@RequestMapping("/rest/user")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/add/{id}/{name}")
    public User add(@PathVariable("id") final String id, @PathVariable("name") final  String name ){
        userRepository.save(new User(id, name, 20000L));

        return userRepository.findById(id);
    }

    @GetMapping("/update/{id}/{name}")
    public User update(@PathVariable("id") final String id, @PathVariable("name") final  String name ){
        userRepository.save(new User(id, name, 1000L));

        return userRepository.findById(id);
    }

    @GetMapping("/all")
    public Map<String, User> all(){

        return userRepository.findAll();
    }
}

5. Test

RedisApplication을 실행해 서버를 구동하고, 위에서 작성한 API를 호출해보도록 하겠습니다.

image.png

전체 User 목록을 호출해보면 이전에 저장한 User 목록이 잘 출력되는 것을 확인할 수 있습니다.

image.png


참고 자료 : https://www.youtube.com/watch?v=eYfopvusG_s


추천서적

 

Redis Essentials

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

'Redis' 카테고리의 다른 글

[Redis] Cache with Spring Boot  (0) 2020.08.21
[Redis] CRUD with Spring Boot -2  (0) 2020.08.21
[Redis] HyperLogLog  (0) 2020.08.21
[Redis] Geo  (0) 2020.08.21
[Redis] Publish/Subscribe  (0) 2020.08.20

댓글

Designed by JB FACTORY