저번의 문제는 등록까지는 어케어케 됐는데 상품 수정을 해결을 못했다. 연결이 왜 안되는지는 모르겠지만! 답답하니까 다른 방법을 생각해봤다.
❓옵션을 하나로 생각
옵션안에 옵션을 하니까, 재귀함수로 인한 성능 문제가 생겼다. 지금으로서는 해결이 안됐다. 그래서 옵션을 하나로 관리하기로 했다.
{
"products": [
{
"id": "product_1",
"optionCombinations": [
{
"id": "opt_1",
"color": "빨강",
"size": "230",
"stock": 3
},
{
"id": "opt_2",
"color": "빨강",
"size": "240",
"stock": 7
},
{
"id": "opt_3",
"color": "파랑",
"size": null,
"stock": 2
}
]
}
]
}
이런 식으로 옵션의 칼럼을 여러개 둬서 관리하게끔 한다. 그러면 훨씬 쉬워진다! 그래서 옵션안에 옵션이 아니여도 빨강색의 여러 사이즈로 구분할 수 있고, 관리자들도 편하게 데이터 베이스를 볼 수 있을 것이다.
대신! 프론드엔드에서 구분해줘야한다. 최상위옵션을 선택하지 않으면 아래도 선택하지 못하게 해야한다.
내가 선택한 방식은
❗️EndPoint따로 두기
분리를 시켜준다는 이야기이다. 옵션을 만드는 api를 따로 만들어서 따로 관리하자! 그렇게 하면 일단 개발이 쉬워지고, ManyToOne의 관계로 쉽게 접근할 수 있다고 생각했다.
그래서 만든 상품 등록은 아래와 같다
@Transactional
public ProductResponse save(Admin admin, ProductRequest productCreateRequest) {
Admin admin1 = adminRepository.findById(admin.getId())
.orElseThrow(() -> new NoSuchElementException("관리자가 아닙니다."));
Product product = productRepository.save(new Product(
productCreateRequest.productName(),
productCreateRequest.price(),
productCreateRequest.description(),
productCreateRequest.category(),
productCreateRequest.productCondition()
));
if(productCreateRequest.productOption() != null){
List<ProductOption> productOptions = productCreateRequest.productOption().stream()
.map(optionRequest -> productOptionRepository.save(new ProductOption(
optionRequest.color(),
optionRequest.size(),
optionRequest.stock(),
product)))
.toList();
product.addOptions(productOptions);
}
List<ProductOptionResponse> optionResponses = convertRequestToResponse(product);
return new ProductResponse(
product.getId(),
product.getName(),
product.getPrice(),
product.getDescription(),
product.getCategory(),
product.getProductCondition(),
optionResponses,
LocalDateTime.now()
);
}
상품을 저장하고, 그 상품에 대한 옵션을 저장하자