Notice
Recent Posts
Recent Comments
Link
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- mapping
- Dynamic dispatch
- annotation
- static dispatch
- spring
- Visitor pattern
- getOrCreate
- ์ฑ๋ด
- NullPointerException
- EntityToDto
- line messaging api
- ngrok
- DtoToEntity
- linebot
- Optional
- visitor proxy pattern
- java
- springboot
- enum
- webhook
- Modelmapper
- double dispatch
- reflection
- Controller
- ํ ๋น์ ๋ด
Archives
- Today
- Total
database by narae :p
JPA ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ ์ํฐํฐ ์์ฑ ํจํด ๋ณธ๋ฌธ
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์ผ๋ก ์ค์ ํ์ง ์์๋ ์์ฑํ ์ ์๋ ํจํด์ ์ ์ฉํด๋ณด์๋ค.
- ํธ๋ถํธ๊ฐ ๊ฐ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ํ์๋ค์ ์๊ฒฌ์ด ๊ถ๊ธํฉ๋๋ค.
- ํน์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ ์์์ง๋ ์ด์ผ๊ธฐ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
'๊ฐ๋ฐ ๋ ธํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA @OneToMany - targetEntity (0) | 2023.03.09 |
---|---|
๋์ปค + ELK ๋ถ์ฐ ํ๊ฒฝ ์ ํ (0) | 2020.05.24 |
๋์ปค Docker ์ ๋ฆฌ 1 (0) | 2020.05.16 |
๋๋ธ ๋์คํจ์น double dispatch (0) | 2020.01.07 |
user level lock (0) | 2019.06.12 |