개요

코틀린에서는 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

Posted by doubler
,