오늘은 먼저 제한을 구현했다.
data class ProductRequest(
@Schema(description = "제목은 최대 250자까지 가능하며, 최소 1자 이상이어야 합니다", example = "사과")
@field:Size(min = 1, max = 250, message = "제목은 최소 1자 이상, 최대 250자까지 가능합니다.")
val title: String,
@Schema(description = "내용은 최소 1자 이상, 최대 1000자까지 가능합니다", example = "상품 설명")
@field:Size(min = 1 ,max = 1000, message = "내용은 최소 1자 이상, 최대 1000자까지 가능합니다.")
val content: String,
val imageUrl: String,
@Schema(description = "가격은 0보다 커야 합니다", example = "100")
@field:Positive(message = "가격은 0보다 커야 합니다.")
val price: Double,
val purchaseAble: Boolean,
val userLimit: Int,
val discount: Double,
@Schema(description = "재고는 0보다 커야 합니다", example = "10")
@field:Positive(message = "재고는 0보다 커야 합니다.")
val stock: Int, // 재고?
)
제목에 @Schema(description = "제목은 최대 250자까지 가능하며, 최소 1자 이상이어야 합니다", example = "사과")
@field:Size(min = 1, max = 250, message = "제목은 최소 1자 이상, 최대 250자까지 가능합니다.") 이렇게 넣어서 글자수를 제한하는 식으로 제한을 만들고
@Operation(summary = "상품 등록", description = "새로운 상품을 시스템에 등록합니다.")
@PostMapping("/products")
fun createProduct(
@AuthenticationPrincipal user: UserPrincipal,
@RequestBody @Valid request: ProductRequest,
): ResponseEntity<ProductResponse> {
val product = productService.createProduct(user.id, request)
val response = ProductResponse(product)
return ResponseEntity.ok(response)
}
이렇게 컨트롤러의 post 부분에 @Valid를 넣고, 그래들에
implementation("org.springframework.boot:spring-boot-starter-validation")
이걸 넣어서 제한을 활성화 시켰다.
그리고 상품을 생성할때에 별점도 생성할수 있었다는걸 눈치채고 그것도 수정했다.
@Column(name = "ratingAverage", nullable = true)
var ratingAverage: Double? = null,
엔티티에서 별점 평균을 이렇게, ProductRequest에서 별정 평균부분을 삭제하고
@Transactional
override fun createProduct(
sellerId: Long,
request: ProductRequest,
): Product {
val seller =
sellerRepository.findByIdOrNull(sellerId)
?: throw ModelNotFoundException("seller", sellerId)
val product =
Product(
title = request.title,
content = request.content,
imageUrl = request.imageUrl,
price = request.price,
purchaseAble = request.purchaseAble,
userLimit = request.userLimit,
discount = request.discount,
seller = seller,
likes = 0,
)
val productStock =
ProductStock(
product = product,
stock = request.stock,
productName = request.title,
)
// product.productStock = productStock
productRepository.save(product)
productStockRepository.save(productStock)
return product
}
서비스임플의 크레이트 부분에도 별점을 지워버린다. 그런식으로 나머지 부분의 별점을 싹 지운다.
물론 get을 할때는 별점이 보여야하니까 리스폰스는 내버려두고, 엔티티의 별점을 널로 바꿨으니 리스폰스 부분도
var ratingAverage: Double?,
이렇게 ?를 넣어준다. 그런식으로 평균평점 뒤에 ?를 다 붙여주면 이제 스웨거에서 확인했을때 더이상 평균별점은 보이지 않는다.