이번에 프로젝트를 진행하면서 장바구니 기능을 구현해야 하는데 굳이 영속성까지는 필요없을 것 같고, 알라딘처럼 장바구니에 담은지 30일이 지나면 삭제되는 경우도 있기 때문에 Redis를 이용해서 만들어보기로 했다.
의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
적용하기
@EnableRedisRepositories
@EnableDiscoveryClient
@SpringBootApplication
public class CartServiceApplication {
public static void main(String[] args) {
SpringApplication.run(CartServiceApplication.class, args);
}
}
main() 메서드가 있는 곳에 @EnableRedisRepositories 어노테이션을 추가한다.
public interface RedisRepository extends CrudRepository<Cart, String> {
}
JPA를 사용할 때와 비슷하게 인터페이스로 Repository를 만들어준다. JPA에서 엔티티 역할을 하는 객체, 기본키와 비슷하게 설정해주면 된다.
@Builder
@Getter
@RedisHash(value = "cart", timeToLive = 2592000) // 30일
public class Cart implements Serializable {
@Id
private String userId;
private String storeId;
private Map<Integer, Integer> productQuantityMap;
public void setUserId(String userId) {
this.userId = userId;
}
public void setProductQuantityMap(Map<Integer, Integer> productQuantityMap) {
this.productQuantityMap = productQuantityMap;
}
}
Cart 객체에서는 @RedisHash와 @Id를 붙여주었다.
@RedisHash는 나중에 저장될 때 키에 붙을 접두사와 얼마동안 해당 데이터를 유지시킬 것인지를 지정할 수 있다.
키 역할을 하는 곳에는 @Id를 붙여주어야 한다. 조심할 점은 jakarta.persistence.Id가 아닌 org.springframework.data.annotation.Id를 import 해주어야 한드는 점이다.
이렇게 하면 userId를 키로 해당 객체가 값으로 저장된다.
@Service
@RequiredArgsConstructor
public class CartService {
private final RedisRepository redisRepository;
public void add(String userId, RequestAddCart requestAddCart) {
Cart cart = CartMapper.INSTANCE.toCart(requestAddCart);
cart.setUserId(userId);
redisRepository.save(cart);
}
}
사용할 때도 Data JPA와 똑같이 사용할 수 있다. 사실 Spring Data의 목적이 반복되는 CRUD를 추상화하는 것이고, 쿼리 작성 대신 메서드명으로 작성 등 부가적인 기능을 제공하기 때문이다.
테스트하기

해당 부분 구현한 컨트롤러에 요청을 보내니 200 OK가 떴다. 그럼 이제 Redis로 가서 잘 저장되어 있는지 확인해보자.
나는 GCP에서 Docker로 Redis를 실행해놔서 다음과 같이 접속했다.
docker exec -it [컨테이너명] /bin/bash
redis-cli

확인해보니 cart를 접두사로 userId와 같이 키로 저장된 것을 확인할 수 있다.
'공부 > 기타' 카테고리의 다른 글
| [RabbitMQ] 우분투 22.04에 RabbitMQ 설치하기 (0) | 2024.09.21 |
|---|---|
| 프론트에서 쿠키를 사용 시 withCredentials 또는 credential 포함시켜야 하는 이유 (0) | 2024.06.15 |
| MapStruct는 Lombok보다 먼저 작성하자 (0) | 2024.04.29 |
| Apache Kafka 실행 및 기본 기능 테스트하기 (0) | 2024.04.03 |
| [테스트] 좋은 단위 테스트(Unit Test)를 위해서 (0) | 2024.02.19 |