본문 바로가기
Backend/이커머스 api

order api - domain(model, product, redis, repository) redis

by 큌 2025. 2. 10.
반응형

redis(Cart)

package com.zerobase.cms.order.domain.redis;

import com.zerobase.cms.order.domain.product.AddProductCartForm;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.redis.core.RedisHash;

@Data
@NoArgsConstructor
@RedisHash("cart")
public class Cart {
    @Id
    private Long customerId;

    private List<Product> products = new ArrayList<>();
    private List<String> messages = new ArrayList<>();

    public Cart(Long customerId) {
        this.customerId = customerId;
    }

    public void addMessage(String message) {
        messages.add(message);
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Product {
        private Long id;
        private Long sellerId;
        private String name;
        private String description;
        private List<ProductItem> items = new ArrayList<>();

        public static Product from(AddProductCartForm form) {
            return Product.builder()
                    .id(form.getId())
                    .sellerId(form.getSellerId())
                    .name(form.getName())
                    .description(form.getDescription())
                    .items(form.getItems().stream().map(ProductItem::from).collect(Collectors.toList()))
                    .build();
        }
    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ProductItem {
        private Long id;
        private String name;
        private Integer count;
        private Integer price;

        public static ProductItem from(AddProductCartForm.ProductItem form) {
            return ProductItem.builder()
                    .id(form.getId())
                    .name(form.getName())
                    .count(form.getCount())
                    .price(form.getPrice())
                    .build();
        }
    }
}

Redis 장바구니 (Cart)

이 코드는 Redis 데이터베이스에 저장될 장바구니 정보를 담는 클래스(Cart)입니다. Redis는 인메모리 데이터 저장소로, 빠른 읽기/쓰기 속도를 제공하여 캐싱, 세션 관리, 실시간 데이터 처리 등 다양한 용도로 사용됩니다. 이 클래스는 고객 ID, 상품 목록, 메시지 목록 등의 정보를 저장합니다.

1. 클래스 구조 및 어노테이션

  • package com.zerobase.cms.order.domain.redis;: 이 클래스가 com.zerobase.cms.order.domain.redis 패키지에 속해 있음을 나타냅니다. 패키지는 관련 있는 클래스들을 묶어 관리하는 데 사용됩니다.
  • import com.zerobase.cms.order.domain.product.AddProductCartForm;: AddProductCartForm 클래스를 가져옵니다. 이 클래스는 장바구니에 상품을 추가하기 위한 폼 데이터를 담는 객체입니다.
  • import java.util.ArrayList;: ArrayList 클래스를 가져옵니다. ArrayList는 동적으로 크기가 조정되는 배열을 구현한 클래스입니다.
  • import java.util.List;: List 인터페이스를 가져옵니다. List는 순서가 있는 데이터 컬렉션을 나타냅니다.
  • import java.util.stream.Collectors;: Collectors 클래스를 가져옵니다. Collectors는 스트림 데이터를 수집하는 데 사용됩니다.
  • import javax.persistence.Id;: Id 어노테이션을 가져옵니다. 이 어노테이션은 해당 필드가 Redis 해시의 키임을 나타냅니다. (JPA 어노테이션이지만 Redis에서도 사용됩니다.)
  • import lombok.AllArgsConstructor;: Lombok 라이브러리의 어노테이션으로, 모든 필드를 인수로 받는 생성자를 자동으로 생성해줍니다.
  • import lombok.Builder;: Lombok 라이브러리의 어노테이션으로, 빌더 패턴을 자동으로 생성해줍니다.
  • import lombok.Data;: Lombok 라이브러리의 어노테이션으로, @Getter, @Setter, @ToString, @EqualsAndHashCode 어노테이션을 한 번에 적용해줍니다.
  • import lombok.NoArgsConstructor;: Lombok 라이브러리의 어노테이션으로, 인수가 없는 기본 생성자를 자동으로 생성해줍니다.
  • import org.springframework.data.redis.core.RedisHash;: RedisHash 어노테이션을 가져옵니다. 이 어노테이션은 해당 클래스가 Redis 해시에 저장될 객체임을 나타냅니다.
  • @Data: Lombok 라이브러리의 어노테이션으로, @Getter, @Setter, @ToString, @EqualsAndHashCode 어노테이션을 한 번에 적용해줍니다.
    • @Getter: 모든 필드에 대한 getter 메서드를 자동으로 생성해줍니다. getter 메서드는 객체의 필드 값을 외부에서 읽을 수 있도록 해줍니다.
    • @Setter: 모든 필드에 대한 setter 메서드를 자동으로 생성해줍니다. setter 메서드는 객체의 필드 값을 외부에서 설정할 수 있도록 해줍니다.
    • @ToString: toString() 메서드를 자동으로 생성해줍니다. toString() 메서드는 객체의 필드 값을 문자열로 표현하는 데 사용됩니다.
    • @EqualsAndHashCode: equals() 및 hashCode() 메서드를 자동으로 생성해줍니다. equals() 메서드는 두 객체가 같은지 비교하는 데 사용되며, hashCode() 메서드는 객체의 해시 코드를 생성하는 데 사용됩니다.
  • @NoArgsConstructor: Lombok 라이브러리의 어노테이션으로, 인수가 없는 기본 생성자를 자동으로 생성해줍니다. Redis에 데이터를 저장하고 검색할 때 기본 생성자가 필요합니다.
  • @RedisHash("cart"): 이 어노테이션은 해당 클래스가 Redis 해시에 저장될 객체임을 나타냅니다. "cart"는 Redis 해시의 이름을 지정합니다. 즉, 이 클래스의 객체는 "cart"라는 이름의 Redis 해시에 저장됩니다.
  • public class Cart { ... }: Cart 클래스를 정의합니다. public은 이 클래스가 모든 패키지에서 접근 가능하다는 것을 의미합니다.

2. 클래스 필드

  • @Id private Long customerId;: 고객 ID를 나타내는 속성입니다. 이 속성은 Redis 해시의 키로 사용됩니다.
    • @Id: 이 어노테이션은 해당 필드가 Redis 해시의 키임을 나타냅니다. 즉, 이 필드의 값은 Redis 해시에서 각 장바구니를 고유하게 식별하는 데 사용됩니다.
    • private Long customerId;: Long 타입의 customerId 필드를 정의합니다. Long은 long 타입의 래퍼 클래스이며, null 값을 가질 수 있습니다. private은 이 필드가 Cart 클래스 내에서만 접근 가능하다는 것을 의미합니다.
  • private List<Product> products = new ArrayList<>();: 상품 목록을 나타내는 속성입니다. 이 속성은 Product 객체의 리스트를 저장합니다.
    • private List<Product> products = new ArrayList<>();: Product 타입의 products 필드를 정의합니다. List는 순서가 있는 데이터 컬렉션을 나타내는 인터페이스이며, ArrayList는 List 인터페이스를 구현한 클래스입니다. new ArrayList<>()는 Product 객체를 저장할 수 있는 빈 리스트를 생성합니다.
  • private List<String> messages = new ArrayList<>();: 메시지 목록을 나타내는 속성입니다. 이 속성은 장바구니 관련 메시지 (예: 상품 가격 변경 알림, 재고 부족 알림 등)를 저장하는 데 사용됩니다.
    • private List<String> messages = new ArrayList<>();: String 타입의 messages 필드를 정의합니다.

3. 생성자

  • public Cart(Long customerId) { this.customerId = customerId; }: Cart 클래스의 생성자를 정의합니다. 이 생성자는 고객 ID를 인자로 받아 customerId 필드를 초기화합니다.

4. 메서드

  • public void addMessage(String message) { messages.add(message); }: 메시지 목록에 새로운 메시지를 추가하는 메서드입니다.

5. 내부 클래스 (Inner Class): Product

  • @Data @Builder @NoArgsConstructor @AllArgsConstructor public static class Product { ... }: Product 클래스를 정의합니다. 이 클래스는 상품 정보를 나타냅니다.
    • public static class Product { ... }: Product 클래스를 정의합니다. public은 이 클래스가 모든 클래스에서 접근 가능하다는 것을 의미합니다. static은 이 클래스가 외부 클래스의 객체에 의존하지 않음을 나타냅니다.
    • @Data @Builder @NoArgsConstructor @AllArgsConstructor: Lombok 어노테이션은 위에서 설명한 것과 동일합니다.
    • private Long id;: 상품 ID를 나타내는 속성입니다.
    • private Long sellerId;: 판매자 ID를 나타내는 속성입니다.
    • private String name;: 상품 이름을 나타내는 속성입니다.
    • private String description;: 상품 설명을 나타내는 속성입니다.
    • private List<ProductItem> items = new ArrayList<>();: 상품 아이템 목록을 나타내는 속성입니다. ProductItem은 Product 클래스 내부에 정의된 또 다른 내부 클래스입니다.
    • public static Product from(AddProductCartForm form) { ... }: AddProductCartForm 객체를 사용하여 Product 객체를 생성하는 메서드입니다.

6. 내부 클래스 (Inner Class): ProductItem

  • @Data @Builder @NoArgsConstructor @AllArgsConstructor public static class ProductItem { ... }: ProductItem 클래스를 정의합니다. 이 클래스는 상품 아이템 정보를 나타냅니다.
    • public static class ProductItem { ... }: ProductItem 클래스를 정의합니다. public은 이 클래스가 모든 클래스에서 접근 가능하다는 것을 의미합니다. static은 이 클래스가 외부 클래스의 객체에 의존하지 않음을 나타냅니다.
    • @Data @Builder @NoArgsConstructor @AllArgsConstructor: Lombok 어노테이션은 위에서 설명한 것과 동일합니다.
    • private Long id;: 상품 아이템 ID를 나타내는 속성입니다.
    • private String name;: 상품 아이템 이름을 나타내는 속성입니다.
    • private Integer count;: 상품 아이템 수량을 나타내는 속성입니다.
    • private Integer price;: 상품 아이템 가격을 나타내는 속성입니다.
    • public static ProductItem from(AddProductCartForm.ProductItem form) { ... }: AddProductCartForm.ProductItem 객체를 사용하여 ProductItem 객체를 생성하는 메서드입니다.

7. 핵심 개념 및 추가 설명

  • Redis (Remote Dictionary Server): Redis는 인메모리 데이터 저장소로, 빠른 읽기/쓰기 속도를 제공합니다. 다양한 데이터 타입 (String, List, Set, Hash 등)을 지원하며, 캐싱, 세션 관리, 실시간 데이터 처리 등 다양한 용도로 사용됩니다.
  • Spring Data Redis: Spring Data Redis는 Spring Framework에서 Redis를 쉽게 사용할 수 있도록 지원하는 모듈입니다. RedisTemplate, StringRedisTemplate, RedisHash 등의 기능을 제공하여 Redis 데이터베이스와 상호 작용할 수 있도록 해줍니다.
  • RedisHash: @RedisHash 어노테이션은 해당 클래스가 Redis 해시에 저장될 객체임을 나타냅니다. Redis 해시는 키-값 쌍으로 구성된 데이터 타입이며, 객체의 속성을 키로, 속성 값을 값으로 저장합니다.
  • @Id: @Id 어노테이션은 Redis 해시의 키로 사용될 필드를 지정합니다.
  • 내부 클래스 (Inner Class): 내부 클래스는 다른 클래스 내부에 정의된 클래스입니다. 내부 클래스는 외부 클래스의 멤버에 접근할 수 있으며, 코드 캡슐화를 높이는 데 사용됩니다. 내부 클래스는 static으로 선언될 수 있으며, 이 경우 외부 클래스의 객체에 의존하지 않고 독립적으로 사용할 수 있습니다.
  • Lombok: Lombok은 반복적인 코드를 줄여주는 Java 라이브러리입니다. @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor, @Data, @Builder 등의 어노테이션을 사용하여 boilerplate 코드를 자동으로 생성할 수 있습니다.
  • 빌더 패턴 (Builder Pattern): 빌더 패턴은 객체 생성을 더 유연하고 가독성 좋게 만들어주는 디자인 패턴입니다. 빌더 패턴을 사용하면 객체 생성 시 필요한 필드만 선택적으로 설정할 수 있습니다.
  • Stream API: Stream API는 Java 8부터 도입된 기능으로, 컬렉션 데이터를 효율적으로 처리하기 위한 기능입니다. stream(), map(), filter(), collect() 등의 메서드를 사용하여 데이터를 변환하고 수집할 수 있습니다.
반응형