개발+IT

Kotlin + Room + RxJava로 안드로이드 개발할때 신경써야할 것들

Kotlin, Room, RxJava 모두 요즘 안드로이드 씬(?)에서 잘 쓰이고 있는 것으로 안다. 무엇보다도 내가 잘 쓰고 있고. 여튼 이 세 조합으로 안드로이드 개발할때 신경써야 할 게 생각나서 기록한다.

1) @Transaction 은 open 함수로

Room Dao를 만들 때 단일 명령이 아닌 복합명령을 만들 때는 Transaction 어노테이션을 쓴다. RxJava를 이용한 트랜잭션을 또 다른 방법을 쓰긴 하지만 여기서는 다루지 않을 것이다(개인적으로 이쪽이 훨씬 귀찮은 것 같다 그냥 트랜잭션 함수를 만들고 그걸 Rx로 감싸주는게 훨 편함). 여튼 자바에서 트랜잭션 함수를 만들때는 다음과 같은 형태가 된다.

요래 해놓으면 빌드할때 Room이 알아서 이렇게저렇게 구현을 해준다. 그런데 코틀린에서는?

별 생각 없이 이렇게 구현하면 빌드할 때 에러가 난다. 이유인 즉슨 빌드할때 구현체를 만들어야되는데 Kotlin에서는 일반 클래스나 함수를 public으로 선언해도 상속을 할 수가 없기 때문. 그러니 구현체에서 아이고 이거 나한테는 방법이 없어 하고 빌드 오류를 뱉는 것이다. 그렇다면 어떻게? 상속을 할 수 있게 해주면 된다.

바로 이렇게. 근데 이게 안하다가 하면 한번씩 까먹게 되는지라...여튼 신경을 써줘야 함.

2) 일회성으로 목록을 쿼리할 때는 Single을 쓰자.

실제 프로덕션에서는 어떨지 모르겠지만 깃헙이나 여기저기 올라와있는 샘플 코드를 보면, Room과 RxJava를 섞어쓸 때는 반환 타입으로 Flowable을 많이 쓴다. 당연히 Observable보다야 나은 선택이고. 근데 쿼리를 1회성으로만 날려야하는 순간이 꼭 한번씩은 있기 마련이다. 그런 상황에서 반환할게 단일 엔티티라면야 Maybe를 쓰겠지만, 엔티티의 목록이라면 Maybe가 나을까 Single이 나을까? 

위의 두 쿼리는 똑같은 결과를 가져온다. onSuccess로 비어있는 리스트를 반환하는 것이다. 테이블 안에 값이 있거나 없거나 반환을 하는 경우라면 아무래도 반드시 값을 반환하도록 되어있는 Single을 쓰는게 낫지 않을까? 사실 뭐 이거는 꼭 그래야한다기보다는 내 생각이긴 하다. 그런데 아무리 생각해도 값을 반환하게 되어있으면 Single을 쓰는게 의미상 명확할 것 같긴 해...

*참고: Flowable로 목록을 쿼리하면 Maybe와 마찬가지로 쿼리 결과가 없어도 빈 목록을 반환한다.

GAE BAL JA

구본본 님의 창작활동을 응원하고 싶으세요?

hell yeah, world
hell yeah, world
구독자 71
멤버십 가입

0개의 댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.
새로운 알림이 없습니다.