글쓴이 보관물: Toughman

이케아 에케달렌(EKEDALEN)

이케아 에케달렌(EKEDALEN) 제품 선택은 순전히 개인의 상황과 취향에 따른 것 입니다.
별도의 지원을 받은 사실이 없습니다.

구매동기

외할머니 댁에 식탁을 놓아 드릴 때 세트가 되는 레르함(LERHAMN) 의자를 구매하려고 했습니다. 하지만 원목색상의 재고가 없어서 색상이 식탁과 비슷한 의자를 찾아보게 되었습니다. 그것이 에케달렌(EKEDALEN) 의자였습니다. 가격이 레르함(LERHAMN) 의자의 두배가 넘었습니다. 하지만 상대적으로 더 튼튼해 보였고 더 좋은 것을 놓아드리자는 생각이 들어 구매하게 되었습니다. 모양은 같지만 재질에 따라 가격이 달랐습니다. 필자는 참나무로 된 제품을 선택했습니다.

구입 및 조립

매장에 방문해서 위치를 확인하고 두개를 차에 실어왔습니다. 포장이 간단하게 되어 있습니다.

이케아 에케달렌(EKEDALEN) 포장상태
이케아 에케달렌(EKEDALEN) 포장상태

포장을 뜯어보면 시트와 프레임으로 구분되어 있습니다. 등판쪽은 완성되어 있고 앞쪽 다리와 시트만 올려서 조립하면 됩니다.

등쪽 프레임
등쪽 프레임
철제 부속품
철제 부속품

조립은 어렵지 않은데 중간에 방향을 잘 확인해야 하는 부분이 있습니다. 아무생각 없이 하다보니 안쪽으로 가야할 부분이 바깥쪽으로 조립이 되는 실수를 했습니다.

앞쪽 프레임에 철제 부속품을 부착한 모양
앞쪽 프레임에 철제 부속품을 부착한 모양
앞뒤 프레임을 연결해 주는 부분 연결 모습
앞뒤 프레임을 연결해 주는 부분 연결 모습

앞뒤 프레임은 연결해 주는 중간 부분을 연결하고 안쪽부분을 철제 부속품을 대고 단단히 조입니다.

앞뒤 프레임 연결부분 작업
앞뒤 프레임 연결부분 작업

앞뒤 프레임 연결부분을 모두 조이고 시트를 얻고 고정하면 조립은 마무리됩니다.

프레임 완성
완성 후 테이블과 같이 놓은 모습
완성 후 테이블과 같이 놓은 모습

사용

확실히 레르함(LERHAMN) 의자보다는 무게도 많이 나가고 튼튼합니다. 대치품으로 사게 되었지만 더 튼튼하고 고급스런 느낌이 좋았습니다. 외할머니께서도 그렇게 뚝딱 만들어지는 것이 신기하다고 하시면서 좋아하셨습니다. 제품 정보는 다음의 주소에서 확인하실 수 있습니다.

https://www.ikea.com/kr/ko/catalog/products/20341022/?rccode=pc_detail_forme_kr

Android ROOM 사용한 Master/Detail 관계 정의

개요

Android ROOM 은 Android Jetpack 에 포함된 컴포넌트 입니다. SQLite DB에 쉽게 접속하고 이용할 수 있게 해 주는 일종의 ORM(Object-relational mapping) 라이브러리 입니다. 이전에는 SQLite DB에 접속하려면 정형화된 별도의 클래스를 사용했습니다. 조금 지루한 작업이라고 할 수 있었습니다. 이것을 줄여주고 쉽게 SQLite DB 연동작업을 할 수 있도록 도와줍니다.

기초적인 연동방법은 좋은 글이 많으므로 그것을 참고하시면 됩니다. 이 글에서는 부모가 되는 테이블과 자식이 되는 테이블을 어떻게 정의하는지 살펴보도록 하겠습니다. 언어는 코틀린(Kotlin)을 기준으로 합니다.

Master/Detail 관계 정의

Master/Detail 관계는 기본적으로 1:N(일대다) 으로 이해하시면 됩니다. 하나의 부모에 자식이 여럿있는 개념입니다. 1:N(일대다) 관련 자료를 찾아보시면 더 자세한 내용을 보실 수 있습니다.

Android ROOM 에서는 클래스 파일에 테이블을 정의합니다. 코드는 다음과 같습니다.

@Entity(tableName = "test_parent")
class TestParent(@PrimaryKey @ColumnInfo(name = "parent_seq") var parentSeq: Int,
          @ColumnInfo(name = "parent_name") var parentName: String?,
.
.
.
)

@Entity(
    tableName = "test_detail",
    indices = [Index("parent_seq")],
    foreignKeys = [ForeignKey(entity = TestParent::class, parentColumns = ["parent_seq"], childColumns = ["parent_seq"], onDelete = ForeignKey.NO_ACTION)]
)

class TestDetail(@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "test_detail_seq") var testDetailSeq: Int,
                @ColumnInfo(name = "parent_seq") var parentSeq: Int,
.
.
.
)

12행이 핵심입니다. 부모 컬럼과 자식 컬럼이 지정된 것을 볼 수 있습니다. onDelete는 부모 테이블의 자료가 삭제되었을때의 동작입니다. 예제에서는 아무런 동작도 하지 않도록 했습니다. 각자의 상황에 맞는 값을 지정하면 됩니다. 사용할 수 있는 값과 의미는 다음의 주소에서 확인할 수 있습니다.

https://developer.android.com/reference/android/arch/persistence/room/ForeignKey.html#CASCADE

결과만 보면 간단한데 Master/Detail 관계를 정의한 예제를 거의 찾아볼 수 없었습니다. 코틀린(Kotlin)으로 된 예제는 없었습니다. 위 코드를 참조하셔서 필요한 부분에 적용하시면 됩니다.

필요한 필드만 업데이트

android ROOM을 이용해서 테이블을 갱신(update)해야 하는 경우가 있습니다. 기본적인 예제를 적용해보면 모든 필드가 갱신되는 것을 알 수 있습니다. 필요한 필드만 갱신하려면 Query 형태로 정의해야 합니다. Data Object Access(DAO) 클래스에 다음과 같이 정의합니다.


    @Query("update test_parent set parent_name = :parentName, photo = :parentPhoto, memo = :parentMemo where parent_seq = :parentSeq")
    fun updateParent(parentSeq:Int, parentName:String?, parentPhoto:String?, parentMemo:String?)

변수로 값을 전달해서 Query 내에 :변수명 형태로 대입해서 필요한 필드만 갱신 되도록 작업하시면 됩니다.

이상 Android ROOM 라이브러리를 사용한 Master/Detail 관계 정의에 대해서 알아보았습니다.