κ°λ° λ
ΈνΈ
JPA μ°κ΄ κ΄κ³κ° μλ μν°ν° μμ± ν¨ν΄
dbbymoon
2023. 3. 9. 04:48
Objective
π‘ JPA μ°κ΄ κ΄κ³κ° μλ μν°ν°λ₯Ό μμ±νκΈ° μν΄μλ μ°κ΄ μν°ν°λ₯Ό var nullable νμ μΌλ‘ μ μΈνμ¬ μμ±ν΄μΌ ν©λλ€. νμ§λ§ λ°μ΄ν°λ‘ 보μμ λ ν΄λΉ μν°ν°λ var νμ λ nullable νμ λ μλκΈΈ μνλ κ²½μ° val non-nullable νμ μΌλ‘ μ€μ νκ³ JPA μν°ν°λ₯Ό μμ±νλ ν¨ν΄μ λν΄ κ³΅μ ν©λλ€.
Background
OrderEntity.kt
OrderProductEntity.kt
OrderService.kt
@Service
class OrderService(
private val orderRepository : OrderRepository
) {
fun saveOrder(param : OrderCreateParam) {
val order = OrderEntity(
orderId = param.orderId
)
val orderProductList = param.orderProductList.map {
OrderProductEntity(
order = order
)
}
order.orderProductList = orderProductList
orderRepository.save(order)
}
}
- OrderEntity λ₯Ό λ¨Όμ μμ±νκ³ , λ¨Όμ μμ±ν Orderμ ν¨κ» OrderProductEntityλ₯Ό μμ±νμ¬ orderProductListλ₯Ό set ν΄μΌ νλ€.
- λ²κ±°λ‘μ΄ κ²μ λμ§ΈμΉκ³ , orderProductListμ νμ μ΄ varμ΄λΌμ μΈμ μ΄λμ λ°λ μ μλ€λ λ¨μ μ΄ μλ€.
⇒ κ·Έλμ μ λ orderProductListλ₯Ό valλ‘ μ¬μ©νκ³ μΆμμ΅λλ€..
μκ³ μλ λ°μ΄ν°λ€λ§ κ°μ§κ³ μμ±μλ₯Ό νΈμΆνκ³ , init μμ μ²λ¦¬νμ
CreateOrderParam.kt
data class CreateOrderParam(
val userId: Long,
val orderProductList: List<CreateOrderProductParam>
)
data class CreateOrderProductParam(
val productId: Long
)
- μμ±μ νλΌλ―Έν°λ‘ λκΈΈ ν΄λμ€μ λλ€. μ΄ ν΄λμ€λ§ κ°μ§κ³ Service μ½λμμ OrderEntityλ₯Ό μμ±ν κ²μ λλ€.
OrderService.kt
@Service
class OrderService(
private val orderRepository : OrderRepository
) {
fun saveOrder(param : CreateOrderParam) {
val order = OrderEntity(param)
orderRepository.save(order)
}
}
- μλΉμ€ μ½λλ μ΄λ κ² λ κ²μ λλ€.
OrderEntity.kt
@Entity
@Table(name = "ORDER")
class OrderEntity(createOrderParam: CreateOrderParam) {
@Id
@Column(name = "ORDER_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
val orderId: Long? = null
@OneToMany(
cascade = [CascadeType.ALL],
fetch = FetchType.LAZY,
mappedBy = "order",
targetEntity = OrderProductEntity::class
)
val orderProductList: List<OrderProductEntity>
@Column(name = "USER_ID")
val userId: Long
init {
this.userId = createOrderParam.userId
this.orderProductList = createOrderParam.orderProductList.map {
OrderProductEntity(
createOrderProductParam = it,
order = this
)
}
}
}
- OrderEntity μ init μμ νλ‘νΌν°λ₯Ό μ΄κΈ°ννκ³ , OrderProductEntityλ₯Ό μμ±ν λ orderλ‘λ this ν€μλλ₯Ό ν΅ν΄ OrderEntityλ₯Ό λκΉλλ€.
OrderProductEntity.kt
@Entity
@Table(name = "ORDER_PRODUCT")
class OrderProductEntity(
createOrderProductParam: CreateOrderProductParam,
order: OrderEntity,
) {
@Id
@Column(name = "ORDER_PRODUCT_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
val orderProductId: Long? = null
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ORDER_ID", referencedColumnName = "ORDER_ID")
val order: OrderEntity
@Column(name = "PRODUCT_ID")
val productId: Long
init {
this.order = order
this.productId = createOrderProductParam.productId
}
}
- OrderProductEntity μμλ μμ±μμμ λ°μ OrderEntityλ‘ orderλ₯Ό μ΄κΈ°νν΄μ€λλ€.
μ½νλ¦°μ init
- μμ±μλ₯Ό ν΅ν΄ μΈμ€ν΄μ€κ° λ§λ€μ΄μ§ λ νΈμΆλλ ν¨μμ λλ€.
- μΈμ€ν΄μ€κ° λ§λ€μ΄μ§ λ, init λ΄λΆμ μ½λλ₯Ό ν΅ν΄ νλ‘νΌν°λ₯Ό μ΄κΈ°νν μ μμ΅λλ€.
- μ¬κΈ°μ λ°μν μ μλ λ¬Έμ κ° μλλ°μ…
- init λ΄λΆμμ μ΄κΈ°ννλ νλ‘νΌν°λ₯Ό final λ‘ μ€μ νλΌλ λ¬Έκ΅¬κ° λΉλλ€.
- μ°Έκ³ λ§ν¬
- μ΄ κ²½μ° Derived μμλ NPE κ° λ°μν μ μμ΅λλ€.
- Baseμ init μ½λλ₯Ό μν μ size νλ‘νΌν°λ₯Ό μ¬μ©νλλ°, Derivedμ sizeλ items.size λ‘ μ΄κΈ°ννκ³ μμ΅λλ€. νμ§λ§ μ΄ λ, itemsλ μ΄κΈ°νκ° λμ§ μμ μμ μ΄λ NPEκ° λ°μν©λλ€.⇒ λ°λΌμ, open classμ init λ΄λΆμμ μ κ·Όνλ μ΄λ€ νλ‘νΌν°λ νμ ν΄λμ€μ μν΄ μ‘°μλμ΄ μμΈκ° λ°μν μ μλ μν©λ€μ΄ μμ΄ final νλ‘νΌν°λ‘ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
open class Base {
open val size: Int = 0
init {
println("size = $size")
}
}
class Derived : Base() {
val items = mutableListOf(1, 2, 3)
override val size: Int get() = items.size
}
κΈ°λ³Έ μμ±μμ 컬λΌμ λμνλ νλ‘νΌν°λ€μ΄ μμ΄λ λ κΉ?
- Hibernateλ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν λ reflection κΈ°λ²μ μ¬μ©νμ¬ κ°μ²΄λ₯Ό μ΄κΈ°ν νλ€.
- νλμ 컬λΌμ 맀ννλ @Column μ΄λ Έν μ΄μ μ ν΅ν΄ 맀νν μ μκΈ° λλ¬Έμ κΈ°λ³Έ μμ±μμ κΌ μ»¬λΌμ λμνλ νλλ€μ΄ μμ΄μΌ νλ κ²μ΄ μλλλ€.
κ²°λ‘
- μ°κ΄ κ΄κ³κ° μλ μν°ν°λ₯Ό μμ±ν λ μ°κ΄ μν°ν°λ₯Ό κΌ var nullable typeμΌλ‘ μ€μ νμ§ μμλ μμ±ν μ μλ ν¨ν΄μ μ μ©ν΄λ³΄μλ€.
- νΈλΆνΈκ° κ°λ¦΄ μ μκΈ° λλ¬Έμ νμλ€μ μκ²¬μ΄ κΆκΈν©λλ€.
- νΉμ λ°μν μ μλ λ¬Έμ λ μμμ§λ μ΄μΌκΈ° ν΄μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.