할인율(DiscountRate)을 엔티티에 포함시키되, @Embedded를 사용하여 별도의 값 객체(Value Object)로 관리하려고 한다.
값 객체로 분리하면 데이터 검증과 비즈니스 로직을 응집력 있게 유지하면서 코드 재사용성과 테스트 용이성을 높일 수 있다고 한다.
@Embeddable
public class DiscountRate {
private int rate; // 할인율 값 (1~100)
protected DiscountRate() {
// JPA를 위한 기본 생성자
}
public DiscountRate(int value) {
if (value < 1 || value > 100) {
throw new IllegalArgumentException("Discount rate must be between 1 and 100.");
}
this.rate = value;
}
public int getRate() {
return rate;
}
// 할인율 계산과 관련된 로직을 추가 가능
public double apply(double originalPrice) {
return originalPrice * (100 - value) / 100.0;
}
@Embeddable 어노테이션 사용
@Entity
public class ProductEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Embedded
private DiscountRate discountRate;
protected Product() {
// JPA를 위한 기본 생성자
}
public Product(String name, int discountRate) {
this.name = name;
this.discountRate = new DiscountRate(discountRate);
}
public String getName() {
return name;
}
public DiscountRate getDiscountRate() {
return discountRate;
}
}
DiscountRate객체에 @Embedded 어노테이션 사용
@Mapper
public interface ProductMapper {
ProductMapper INSTANCE = Mappers.getMapper(ProductMapper.class);
@Mapping(source = "discountRate.rate", target = "discountRate")
ProductDTO toDto(ProductEntity entity);
}
위 형식 말고 주입형식으로 프로젝트에서는 사용해 볼 예정
DiscountRate 값 객체에 모아둘 수 있다.DiscountRate 클래스를 독립적으로 테스트할 수 있다.