11/20

ezi·2023년 12월 18일
0
  1. reponse||requset dto에 domain 객체를 참조하여 들어가 있으면 좋지 않다.
    -> 왜 ? 참조
    또한 request는 사용자가 보내는 요청인데, 사용자는 brand에 대한 정보를 다 알지 못한다.

    [request]
    Brand brand; -> Long brandId
    [response]
    brandId에 대한 요청만 주기엔 부족할 수 있으니
    response엔 아래와 같이
    Brand brand -> ProductCreatedBrand brand

@Builder
public record ProductCreateServiceResponse(
        Long id,
        String productName,
        Long productPrice,
        ProductSize productSize,
        ProductCreatedBrand brand
) 
{
    public static ProductCreateServiceResponse of(Product savedproduct)
    {
        return new ProductCreateServiceResponse(
                savedproduct.getProductId(),
                savedproduct.getProductName(),
                savedproduct.getProductPrice(),
                savedproduct.getProductSize(),
                new ProductCreatedBrand(savedproduct.getBrand().getBrandId(), savedproduct.getBrand().getBrandName())
        );
    }

    public record ProductCreatedBrand(
            Long brandId,
            String brandName
    ) {}
}
  1. cud만 @Transactional 을 붙이는 것이 아니라, r의 서비스에도 @Transactional 을 붙인다.
    Search(r)만 따로 준 이유는 @Transactional(readOnly = true) 를 적용시키기 위해서
    영속성 컨텍스트를 만들지 않음 -> 조회만 할 뿐 변경될 일이 없으니 필요가 없음 -> 속도에 이득

  2. VO : 불변 객체

package com.onthelook.beotl.domain.post;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

@EqualsAndHashCode
@NoArgsConstructor
@Embeddable
public class PostProductSize {
    @Column(name = "size_value")
    private String sizeValue;

    @Enumerated(EnumType.STRING)
    private PostProductSizeType productSizeType;

    public PostProductSize(String sizeValue, PostProductSizeType productSizeType)
    {
        this.sizeValue = sizeValue;
        this.productSizeType = productSizeType;
    }
}

3-1. @EqualsAndHashCode 필요

3-2.따로 @EqualsAndHashCode 를 만든 경우 :

@Override
    public boolean equals(Object o)
    {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PostProductPosition that = (PostProductPosition) o;
        return
                that.getPositionY().doubleValue() == this.getPositionY().doubleValue() &&
                that.getPositionX().doubleValue() == this.getPositionX().doubleValue();
    }

    @Override
    public int hashCode()
    {
        return Objects.hash(positionY.doubleValue(), positionX.doubleValue());
    }

    private static boolean isInRange(BigDecimal value)
    {
        return (value.compareTo(BigDecimal.ZERO) > 0 && value.compareTo(BigDecimal.ONE) < 0);
    }

@EqualsAndHashCode를 하면 객체 자체를 비교하는 코드가 작성됨
하지만 객체 자체가 아닌 value값을 비교하고 싶기 때문에 커스텀하였음
3-2. VO객체를 사용한 경우 ProductSize

 public void update(String updatedName, Long updatedPrice, ProductSize updatedSize, Brand updatedBrand)
    {
        this.productName = updatedName;
        this.productPrice = updatedPrice;
        this.productSize = updatedSize;
        this.brand = updatedBrand;
    }

사용하는 서비스 코드에서 새로운 객체 생성 후 담궈주기(new)

ProductSize productSize = new ProductSize(dto.productSize().sizeType(), dto.productSize().sizeValue());
        product.update(dto.productName(), dto.productPrice(), productSize, brand);

** 질문 : ProductSize - 도메인에 있는 VO
그렇다면 이건 도메인 객체? VO 자체?
response 나 request에서 ProductSize를 사용하는 것은 Domain 객체?(-> 1번과 같이 수정 ) VO 자체? ( 수정 필요 x )

profile
차곡차곡

0개의 댓글