Android Room 에서는 어떻게 id를 생성할까

feat. @PrimaryKey(Autogenerate = true) 하면 일어나는 일

kimji1
4 min readApr 22, 2021

id 를 생성해줘야 하는 상황에서,
1. static 으로 counter를 만든다. 동기화가 필요하다면 관련 처리도 추가한다.
2.학생 때 대충 했던 것 처럼 list의 size 값을 사용한다.

정도의 방법이 생각났다.

그래서 Android Room 을 사용할 때,
“자동(?)으로 생성되는구나, 편하네! “하고 사용하던 `@PrimaryKey(Autogenerate = true) 를 했을 때 어떻게 처리되는지`가
내가 생각했던 방법으로 구현이 되었는지, 아니면 다른 어떤 방법으로 구현된건지 궁금해져서 Room 의 구현을 찾아보게 되었다. 일단,

결론

  • “자동으로 값을 생성한다” 의 세계는 생각보다 깊었다.
    (모르는게 많아서 코드를 파악하기에 능력이 부족했다.)
    (== 아직 구체적으로 설명할 수 없다.)
  • 개발을 업으로 하면서, “자동”이라는 말의 함정에 빠지지 말아야겠다.
  • Room 에서도 google/auto 를 사용하는 걸로 보이는데, 어떤 식으로 사용되고 있는지 파악하지 못해 더 찾아봐야 하지만 auto 에 대해서도 찾아봐야 할 것 같다.
  • TypeElement에 대해서도 더 봐야 할 것 같다.
  • annotation에 대해서 너무 아무 생각 없이 사용해 왔으니, 관련해서 공부를 해보고 코드를 파악하도록 해야겠다.

과정

class 이름에서 나타내듯이 AutoValue 대상이 되는 annotation을 정의하고 있다.

왜 인지는 모르지만, Field 의 List를 가지고 autoGenerateId 플래그를 가진다.

SQLite 에서 AUTOINCREMENT를 지원하는 걸로 보인다.

If a table contains a column of type INTEGER PRIMARY KEY, then that column becomes an alias for the ROWID. You can then access the ROWID using any of four different names, the original three names described above or the name given to the INTEGER PRIMARY KEY column. All these names are aliases for one another and work equally well in any context.

Room은 SQLite의 사용을 편리하게 해주는 라이브러리 정도로 생각하고 있었는데, SQLite에서 지원하는 기능일 거라는 생각을 못했던 것 같다.

자세한 내용은 SQLite AUTOINCREMENT 키워드에 대해 찾아보면 될 것 같다.

  • 잘못된 내용이나, 부족한 부분에 대해서 말씀해주시면 변경/추가하도록 하겠습니다.
  • Room의 구현에 대해서, 다른 궁금한 점이 있는 분은 Room Repository 에서 확인하면 될 것 같습니다.
  • Database 에서 auto incremente 인 PK를 어떻게 관리하는지는 간단하게 이 글을 보시면 좋을 것 같습니다.

--

--

kimji1
kimji1

No responses yet