코딩을 업무로 하며 살고 있지만, 집에서는 코딩하고 글 쓰고 하는 일이 근래에 거의 없었는데, 

 

최근에 오랜만에 뭔가 정리를 해야 될것 같은 구현들이 있어 정리도 할겸 구조도 잡을겸 정리하다보니, 

 

생각보다 Database를 사용하는 부분에 있어 데이터 와 코드를 구분해서 구현하는 경우가 많이 없는 것같아서 정리도 할겸 해서 글을 남겨둔다.

 

Android에서 database를 사용하는 방법은 여러 도구들이 있고, 예제들도 많이 있는데, 코딩을 할때 데이터로서 관리해야 될 부분과, 코드로서 작성해서 관리해야 될 부분을 좀 많이 나누고 정리하는 편이다 보니 데이터베이스를 구성하는 테이블의 스키마, 즉 "컬럼 이름", "컬럼 데이터 타입", "컬럼 제약"등은 구현이 아닌 데이터 그자체로서 관리하여 이후 실제 구현은 그 것들을 사용할때만 코드로 작성하여 분리해두면 이후 구현은 자주 바뀌고 때에 따라 여러 처리를 할수도 있지만, 데이터 베이스를 구성하는 스키마는 코드보다는 많이 바뀔일이 발생하지 않는다.

table 생성에 필요한 정보는 asset으로 table_main.json이라는 파일에 정리해두고, SQLiteOpenHelper의 구현에서 AssetManager를 이용하여 json파일을 읽어들인 다음 그

규칙에 맞는 테이블을 생성하는 단순하고 간단한 접근 방법이다.

 

테이블의 정의는 아래와 같이 하였다.

각각의 필드는 아래와 같은 의미를 가진다.

 name : 테이블의 이름

 schemas : 테이블의 스키마 정보(컬러명, 데이터 타입, 제약,...)

 version : 테이블의 버전, 이 부분은 이후 데이터 베이스 업그레이드시 이용하기 위해 테이블 버전 관리

 

table_main.json을 읽어온 다음 실제 데이터 베이스에 테이블을 생성하는 구현은 아래와 같다.

SQLiteOpenHelper의 onCreate 에서 db에 json에서 읽어드린 정보를 이용하여 table 의 이름과 생성 스키마를 조합하여 테이블을 생성하도록 할수 있다.

 

이후 버전 관리등이 필요한 경우 SQLiteOpenHelper의 onUgrade, onDowngrade가 호출되는데 이때는 Database 의 버전과 table의 버전을 비교하여 관리하는 방법으로 구현을 하거나, db 자체에 table들의 버전정보를 기록해두었다가, json이 변경되면 자동으로 업그레이드를 하도록 하는 방법으로 구현을 할수도 있다.

 

이 부분은 다음에 또 정리할때 이어서 작성하도록 하겠다.

블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

개발 업무를 몇년째 하고 있는데, 일부 개발자분들이 thread를 new Thread().start() 와 같이 단편적인 worker로만 사용하는 경우가 많이 있고, 백그라운드로 동작시키면서 queue 처리가 필요한 작업을 하려고 할때 thread pool을 만들고 pool size를 1로 해서 구현하는 경우가 있는가 하면, 내부에 lock, unlock, semaphore, flag 등을 동원하여 쓰레드를 제어하는 경우도 있다.


쓰레드는 잘 쓰면 참 좋은 도구이지만, 잘못 쓰면 디버깅도 힘들고 이슈가 발생하여도 재현도 잘 되지 않으며, 그리고 결정적으로 고치기는 매우 힘들다.


나는 플래그 사용하는 것도 싫어하고, 멤버 변수에 thread 변수를 생성하여 if thread가 생성되었나? 되었으면 blocking list에 insert 하는 구조도 좋아하지 않는다.


최근 업무로 구조를 새로 잡는 프로젝트가 있는데, 진짜 지옥 of 지옥이다.


개인적으로정리도 해둘겸해서 백그라운드 작업용도로 사용할 쓰레드를 Handler, Looper와 함께 사용하는 방법으로 정리해둔다.


두가지 방법이 있는데, 첫번째는 안드로이드의 Thread와 Handler 그리고 Looper를 직접 사용하는 방법이다.



Thread 를 상속받아 run 내부에 Looper 와 hanlder를 직접 사용하여 queued 백그라운드 처리를 할수 있다.


작업을 요청할때는 아래와 같이 요청하면 된다.



Hander에 메시지를 보내는것으로 작업요청은 끝이고, Handler에 의해서 작업요청이 queue에 의해서 하나씩 순차적으로 처리가된다.


데이터 정합성을 보장해야하는 경우 요청이 들어오는 순서대로 처리를 해야 정합성을 그마나 보장할수 있다. (반드시 해당 쓰레드 한군데에서만 데이터 베이스에 접속을 하는것도 빠지면 안된다.)



두번째 방법은 위와 같은 구현을 Android에서 제공하는 것이 있는데, 바로 HandlerThread이다.



작업을 요청하는 방법은 첫번째 방법과 다르지 않다.



Thread 관리를 위해서 별도로 구현한 ThreadMonitor와 ClosableThread인터페이스가 있는데, Looper.loop() 통한 무한루프를 가지고 있는 쓰레드이기 때문에 때문에 작업이 모두 끝나면 getLooper.quit() 등으로 looper를 종료시켜주어야 한다.


위에서 request시  thread 의 state를 관리하여 CountdDownLatch로 동시성 제어를 하는 이유는, 쓰레드가 생성되고 running 상태가 되고나서야 Handler를 통해서 메시지를 보내기 위해서이다.


실행결과는 다음과 같이 요청에 대해서 순차적으로 처리가 된다.



쓰레드 id를 보면 첫번째 구현으로 만든 SimpleThread는 32164 이고, 두번째 구현으로 만든 SimpleHandlerThread는 32163 이다.


이 둘의 쓰레드를 각각 모니터링하여 작업이 모두 끝나면 쓰레드를 종료시켜주기 위한 ThreadMonitor를 각각 생성하여 추가하였는데, 작업이 끝날때마다 onProcessed 를 전달받아 작업 요청사항들을 관리하고 종료가되면 쓰레드들을 종료시키는 기능을 한다.


플래그 사용하는 것을 싫어하기 때문에 사용하는 방법이기 때문에 아래 첨부한 소스를 참고하여 다른 방법으로 응용하여 사용하여도 좋을듯하다.


ClosableThread.java

MainActivity.java

Monitor.java

SimpleHandlerThread.java

SimpleThread.java

ThreadMonitor.java



블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

오늘 아침 눈뜨자 마자 갑자기 코딩이 하고 싶어서 일요일인데도 불구하고 6시 10분에 눈이 번쩍 하고 떠졌다.


꿈을 꾼것인지, 뭔지 ... 


어제는 계속 낚시하는 공부만 하다가 잤는데, 눈뜨자마자 그간 미뤄왔던 안드로이드 앱 수정과 그에 맞는 웹호스팅중인 php 코드도 좀 수정을 해야 겠다 마음을 먹고 바로 컴퓨터를 켰다.


오전내내 만들고 수정한것은 사람들이 대체 무엇을 검색하고 왜 검색하는지 다음,네이버 등을 들어가서 일일이 클릭해서 보는게 귀찮아서 내가 보고 싶을때, 사람들이 많이 본 검색어와 뉴스들을 한방에 긁어오는 웹앱을 만들었다. 근데 웹앱으로 만들어두니까, 가독성도 떨어지고, 나중에 저장해뒀다가 보는것이 불편해서 아예 이슈만 저장하는 블로그를 하나 팠다.


한번씩 긁 읽어볼 필요가 있을때, 즐겨찾기 해둔 웹앱을 실행해서 긁어다가 블로그에 넣고 앉아서 클릭 또는 넣어놓고 출퇴근중에 하나씩 보면 꿀같은 휴식을 취할수가 있다.


이런 웹앱 만드는것은 너무나 간단해서 아주 아주 오래전에 만들어뒀던 php 코드를 살짝 수정해서 완성했다.

처음에는 물론 버그가 있어서, 제일처음 글 올린것은 링크가 다 ....깨졌다.


오늘 자기전에 긁어서 저장해놨다가 내일 출근할때 봐야지.


이런 웹앱을 만드는데는 다른 것을 많이 사용하는 것보다 php로 curlsimplehtmldom 라이브러리만 있으면 만들수 있다.


예제 코드를 하나 올려보면 아래와 같이 함수로 하나 만들어두면 글을 긁어올수 있고, simplehtmldom을 사용하여 요소별로 분리할수 있다.





이것을 하고 나니, 오후가 되었는데, 왠지 오늘 코딩빨이 좀 받는 느낌이 들어서, 그간 귀찮아서 미뤄두었던 kpop app 의 업데이트를 위한 서버 작업, 앱 수정 배포도 했다.




생각보다 많은 외국인들이 사용해주고 메일도 주고 해서 업데이트를 빨리 해야지 하고 있었는데, 지난 몇년간 시달림이 있다보니, 이런 여유시간도 많이 없었고, 여유시간에 코딩을 한다는 것 자체가 정말 오랫만이되어버려서 2년인가 4년 만에 코딩을 다시 한 느낌이 든다.


지금 업데이트 올려보니, 그간 구글에서 많은 정책이 바뀌어서 그것 하나 하나 맞춰주느라.. 진땀 뺐다.


그리고 그간 사용하던 도메인하고, 웹호스팅도 다음달부로 만료된다고 해서 그것들도 다 연장하고 결재하고나니 일요일이 휘리릭 다갔네~


그래도 뭔가 그간 화장실 가고 싶은데 못갔던 느낌으로 몇년간 지내다가 이참에 정리해버리니 뭔가 정리된 느낌도 들고, 이제 앱 리뷰 오는거랑 해서 잘 업데이트 하면서 관리좀 해야지~~ 하며 마음을 다 잡았다.



블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

솔직히 이 개발자에게는 모니터를 3개는 줘야 될듯.


코딩하는 것 보니까... 근데 나하고는 스타일이 많이 다르다. 


나는 편의위주의 코딩환경인데, 좀 열악한... ㅠ.ㅠ


모니터 3개는 줘라 좀... 하나는 작업된 결과를 늘 띄워놓는 용도, 하나는 코드만 보는 용도, 하나는 중간 중간 검색하고 다른 툴을 사용하는 화면.


개발자들이 보면 이해할 법한 영상이군...



블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,

머신 러닝 공부하는 재미에, 일찍 퇴근.!!!


새로운걸 알아가는 그 과정은 너무나 즐겁다. 그 끝이 무엇인지는 몰라도~~



'코딩하고 > Python' 카테고리의 다른 글

python으로 딥러닝 시작하기!!!  (0) 2017.07.04
블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,