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 관계 정의에 대해서 알아보았습니다.

Lonsonho 스마트 플러그

Lonsonho 스마트 플러그 제품 선택은 순전히 개인의 상황과 취향에 따른 것 입니다.
별도의 지원을 받은 사실이 없습니다.

구매동기

사용중인 Docking Station을 백업 용도로 사용하고 있었습니다. NAS처럼 항상 켜놓기는 부담스러웠습니다. 스케줄로 주기적으로 백업을 받는데 시간을 맞추어 켜는 것이 불가능했습니다. 고민을 하다가 원하는 시간에만 전원이 들어오면 좋겠다고 생각했습니다. 이런 기능을 하는 아날로그(?) 플러그가 있었습니다. 그런데 15분 단위로만 조정이 가능해서 필자의 상황과는 맞지 않았습니다. 이리저리 찾아보니 스마트 플러그라는 것이 있었습니다. 기능은 제가 딱 찾는 것 이었습니다. 국내 제품들이 있었는데 모양이 모두 필자의 상황과는 맞지 않았습니다. 멀티탭에 Docking station이 연결되어 있는데 너무 커서 도저히 연결할 수 없었습니다.

당연히 해외쪽 사이트를 검색해 보게되었습니다. 기능은 비슷한데 국내와 플러그 모양이 다르다보니 변환기를 추가로 연결해야 하는 문제가 있었습니다. 공간이 부족한데 거기에다가 변환기까지 장착하는 것은 아니라고 생각했습니다. 국내와 규격이 같은 스마트 플러그를 찾아보는 것이 가장 좋은 방법이었습니다.

검색을 잘 못해서인지 시간이 좀 소요되었습니다. 그러다가 Lonsonho 스마트 플러그 를 발견하게 되었습니다. 일단 크기가 마음에 들었습니다. 플러그 규격이 같고 전압이 국내에서 사용할 수 있는 조건을 충족했습니다. 가격도 대략 15,000원 정도여서 국내 제품보다 훨씬 저렴했습니다.

구입

Lonsonho 라는 브랜드를 처음 보아서 조금 불안했는데 상품평은 나쁘지 않아 구매했습니다. 배송은 대략 10일 정도 소요되었습니다. 전파인증을 하지 않은 전자제품은 한개 이상 구매하면 나머지는 폐기된다는 글을 보았습니다. 그리고 생각했던 대로 잘 동작할지 확신이 서지 않아 일단 한개만 구입했습니다.

Lonsonho 스마트 플러그 상자
Lonsonho 스마트 플러그 상자

제품을 받아보니 크지 않고 구성이 단순했습니다. 플러그 하나와 설명서가 전부였습니다.

Lonsonho 스마트 플러그 상자 개봉
Lonsonho 스마트 플러그 상자 개봉

상자에서 꺼내보니 아래 사진과 같은 모양이었습니다.

 스마트 플러그 모양
스마트 플러그 모양

위쪽에 반투명하게 보이는 부분이 전원이 들어오면 불빛이 나타나는 부분입니다.

사용

Smart Life 앱을 설치하고 플러그에 꽂으면 다음과 같이 불빛이 나타납니다. 스위치를 5초동안 누르면 깜빡이면서 플러그를 등록할 수 있는 상태가 됩니다. 스마트폰을 5G가 아닌 WIFI에 연결 후 플러그를 등록해야 합니다. 등록 후 다시 5G WIFI로 연결하면 됩니다.

Lonsonho 스마트 플러그 전원 연결
Lonsonho 스마트 플러그 전원 연결

등록 후 앱을 통해서 여러가지 설정을 할 수 있습니다. 필자는 시간에 따라 켜고 끄는 기능만 이용했습니다. 켜고 끄는 것도 전원과 불빛을 따로 설정할 수 있습니다. 아래 이미지는 필자가 사용하는 등록된 스마트 플러그 입니다.

Lonsonho 스마트 플러그 목록
Lonsonho 스마트 플러그 목록
Lonsonho 스마트 플러그 전원 및 불빛 설정
스마트 플러그 전원 및 불빛 설정
스마트 플러그 전원 스케줄
스마트 플러그 전원 스케줄

크기도 작고 가격도 저렴해서 잘 구매했다는 생각이 듭니다. 처음 사용한 플러그에 만족해서 두개를 더 구매했습니다. 다른 장비와 구형 선풍기 타이머로 사용하고 있습니다. 국내 스마트 플러그가 마음에 들지 않거나 필자처럼 사용할 수 없는 공간이나 여건이면 좋은 선택이 될 것 같습니다.