외래키를 가진쪽이 JoinColumn
보통은 상품과 상품재고면 외래키를 가진건 상품이지만, 오더랑 연결하려면 외래키는 상품재고가 가져야만 한다고 한다.
그래서 상품재고에 JoinColumn을 쓴다.
그리고 lint를 쓰자는 말이 나와서
id("org.jlleitschuh.gradle.ktlint") version "12.1.0"
이걸 빌드 그래들에 추가하면 된다는데 추가하긴 했는데 뭐가 변했는지 잘 모르겠다.
package com.teamsparta.moamoa.product.model
import com.teamsparta.moamoa.infra.BaseTimeEntity
import jakarta.persistence.*
import java.time.LocalDateTime
@Entity
@Table(name = "product")
data class Product(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
@Column(name ="sellerId",nullable = false)
val sellerId: Long,
@Column(name ="price",nullable = false)
var price: Int,
@Column(name ="title",nullable = false)
var title: String,
@Column(name ="content",nullable = false)
var content: String,
@Column(name ="purchaseAble",nullable = false)
var purchaseAble: Boolean,
@Column(name ="ratingAverage",nullable = true)
val ratingAverage: Double,
@Column(name ="imageUrl",nullable = true)
var imageUrl: String,
@Column(name ="productDiscount",nullable = true)
val productDiscount: Double,
@Column(name ="likes",nullable = true)
val likes: Int,
@Column(name ="deleted_at")
var deletedAt: LocalDateTime? = null,
@Column(name ="userLimit")
val userLimit: Int,
@Column(name ="discount")
val discount: Double,
// @OneToOne(cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
// @JoinColumn(name = "product_stock_id")
// var productStock: ProductStock? = null,
@OneToOne(mappedBy = "product", cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
var productStock: ProductStock? = null,
//재고처리?
@Column(name = "is_sold_out", nullable = false)
var isSoldOut: Boolean = false
): BaseTimeEntity()
package com.teamsparta.moamoa.product.model
import com.teamsparta.moamoa.infra.BaseTimeEntity
import jakarta.persistence.*
@Entity
@Table(name = "product_stock")
data class ProductStock(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
// @OneToOne(mappedBy = "productStock", cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
// val product: Product,
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id")
val product: Product,
@Column(name = "stock")
var stock: Int,
@Column(name = "product_name")
val productName: String
): BaseTimeEntity()
이렇게 두개를 하나로 잇고 서비스임플을
override fun createProduct(request: ProductRequest): Product {
val product = Product(
title = request.title,
content = request.content,
imageUrl = request.imageUrl,
price = request.price,
purchaseAble = request.purchaseAble,
likes = request.likes,
productDiscount = request.productDiscount,
ratingAverage = request.ratingAverage,
sellerId = request.sellerId,
userLimit = request.userLimit,
discount = request.discount,
//deletedAt = null 필요없을듯
)
val productStock = ProductStock(
product = product,
stock = request.stock, // 초기 재고 설정
productName = request.title
)
product.productStock = productStock
productRepository.save(product)
return product
}
이렇게 해서 post를 할때 스톡도 같이 하도록 만들었다.
그런데 ./gradlew ktlintFormat을 쓰면 lint를 작동시킬수 있다고 한다. 그리고 페이징에 도전했는데, 너무 어렵다. 이게 쉽다고?