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