2021-11-14 [jpa] kotlin 에서 @OneToMany 의 mutableList 를 방어적으로 사용하기 (backing field 를 이용, 데이터 캡슐화) (수정 : 2022-07-16)
Spring/Spring JPA 2021. 11. 14. 18:40개요
코틀린에서는 MutableList<Any> 와 List<Any> 가 있다. jpa 에서 @OneToMany 로 관계 맺을 때, 좀 더 안정적인 코드를 작성하는 법을 익힌다.
코드
바로 코드를 본다. Item : ItemTag = 1 : N 의 관계를 맺고있다.
문제가 되는 부분은 itemTags 인데 반환할때는 List<T> 타입인 itemTags 로 반환하고 데이터 영속화는 _itemTags 한다. MutableList<T> 를 통해서 데이터는 추가되는 것에 대해 제약을 받지 않고 반환도 불변하게 내려주기 때문이다. 외부에 변경하는 것을 불허한다는 생각에 방어적 코딩이라는 생각이 든다.
@Entity
@Table(name = "item")
class Item (
@Column(name = "name")
val name: String,
@Column(name = "price")
val price: Double,
@Enumerated(EnumType.STRING)
@Column(name = "type")
val type: Type
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
protected set
@OneToMany(mappedBy = "item", fetch = FetchType.LAZY)
private val _itemTags: MutableList<ItemTag> = mutableListOf()
val itemTags: List<ItemTag>
get() = _itemTags
enum class Type(desc: String) {
FOOD("음식"),
LIFE("생활"),
FASHION("패션"),
CAR("자동차")
}
fun addItemTag(itemTag: ItemTag) {
val itemTagIds = this._itemTags.map { it.id }
if (itemTagIds.contains(itemTag.id)) {
return
}
this._itemTags.add(itemTag)
itemTag.set(this)
}
}
참고
코틀린 코딩 컨벤션에 backing properties 내용이 있다.
https://kotlinlang.org/docs/coding-conventions.html#names-for-backing-properties
'Spring > Spring JPA' 카테고리의 다른 글
20201009 [jpa] querydsl 내, query projection 사용해보기 (0) | 2020.10.09 |
---|---|
20201001 [jpa] JPA N+1 문제를 만들어보고 해결해보기. (수정 2020-10-05) (0) | 2020.10.01 |
20190919 [jpa] 스프링 테스트 코드 상에서 DB 에 데이터 적재. (0) | 2019.09.19 |
20190720 [문제해결] Infinite recursion (StackOverflowError) (3) | 2019.07.20 |
20190710 [jpa] JPA 알아보기 03 : TestEntityManager 살펴보기 (수정 20190817) (0) | 2019.07.10 |