반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

이번주 코로나 Blog Tutorial 은 데이터베이스 입니다.

모바일기기에서는 SQLite을 사용하는데요.

이번엔 내용이 좀 기네요.

이번주 튜토리얼을 2회나 3회로 나눠서 소개해 드리겠습니다.

======= o ======= o ======== o ======== o =======

Database Access in Corona with SQLite   

프로그래밍 세계에서 특히 웹 프로그래머한테 데이터베이스 기술은 아주 큰 부분을 차지합니다. 데이터베이스는 아주 많은 데이터를 저장할 수 있는 훌륭한 기술입니다. 그것만이 아니라 그 저장한 데이터를 나중에 찾아서 사용할 수도 있습니다. 이것이 가장 중요한 역할이죠.

예를 들어 note 앱을 만든다면 유저 개개인이 만든 note들을 데이터베이스에 저장해야 할 겁니다. 물론 각각의 note를 텍스트 파일로도 저장할 수 있을 겁니다. 하지만 그러면 아마 수많은 파일을 관리해야 될겁니다. (데이터베이스를 사용하면 그냥 한게의 .db 파일만 있으면 되겠죠.) 그리고 데이터를 저장하고 찾고 하는 방법도 데이터베이스 이용과 다른 방법을 사용해야 합니다.




데이터베이스 파일은 SQL 테이블에 데이터가 저장이 됩니다.

그런데 이렇게 데이터를 저장하고 다시 나중에 검색하고 하는 일을 이전에 우리가 다루지 않았었나요?

이전에 JSON tutorial에서 제가 JSON은 같은 형태의 정보를 쉽게 저장할 수 있는 좋은 도구라고 말했었습니다. 코로나에서 디코드된 JSON 스트링이 루아 테이블로 컨트롤 하는 겁니다.


그래서 데이터베이스와 연관되서 JSON을 사용할 때 아미면 데이터베이스의 내용을 JSON으로 보낼 때 두 부분 모두 아주 파워풀하게 사용될 수 있습니다. 이런 방법들은 그 나름대로의 특징이 있습니다. 앱을 만들 때 필요에 따라 이러한 데이터를 다루는 기술을 이용하시면 됩니다.

이러한 방법들 중 어떤 방법을 사용할까를 정하는 기본적인 룰은 아주 큰 용량의 데이터를 다루게 되면 (특히 그 데이터를 search하고 앱 내에 저장되어야 한다면) 데이터베이스 기술을 사용하는것이 좋을 겁니다. 작은 용량의 데이터라면 예를 들어 configuration data나 case 들 같은 경우는 단순하게 Lua table에 저장해서 파일로 저장하고 나중에 이 파일을 이용해야 합니다. 이 경우에는 JSON으로 간단하게 처리하면 됩니다.

사실 많은 경우 큰 용량의 데이터를 저장해야할 앱을 다룰 때 SQLite와 JSON을 함께 사용하게 됩니다. JSON 객체가 단지 string일 경우 JSON blobs 를 데이터베이스에 저장할 수 있습니다. 그리고 그것을 나중에 Lua 변수로 로드하고 JSON 라이브러리를 사용해서 그 string을 table로 convert 하게 됩니다. JSON은 좀 더 작은 data chunk를 관리 합니다. 그리고 데이터베이스는 이 JSON blobs들의 모임인 큰 data structure를  organize 하게 되는 겁니다.

JSON과 함께 사용하면 데이터베이스를 사용하는데 훨씬 간편하게 사용할 수 있는 부분이 있습니다. 이와 관련해서는 나중에 다루겠습니다.

이 튜토리얼에서는 database를 create하고 파일로 저장을 하고 정보를 저장하고 데이터를 검색하는 기능을 코로나 앱에서 어떻게 해야 하는지에 대해 다루겠습니다.

Creating a database

데이터베이스를 생성하는 방법에는 두가지가 있습니다. 첫번째는 메모리에 데이타베이스를 만드는 방법으로 이 경우에는 앱이 사용중일 때만 만들어지고 사용되고 이 앱이 꺼지면 없어지게 됩니다. 그리고 두번째 방법은 데이터베이스 파일에 생성하는 겁니다. 이렇게 되면 언제든지 로드될 수 있겠죠. 이 튜토리얼에서는 메모리에서 데이터베이스를 다루는 방버은 커버하지 않을 겁니다.

데이터베이스를 사용하는 예제가 아래에 있습니다. 데이터베이스를 생성하고 save된 데이터베이스를 오픈하기 위해서 아래 작업들을 해야 합니다.

require "sqlite3"

local path = system.pathForFile( "data.db", system.DocumentsDirectory )
local db = sqlite3.open( path )


NOTE : 데이터베이스를 만드는 장소는 system.DocumentsDiretory를 사용할것을 추천합니다. 프로젝트 리소스 디렉토리는 writable 하지 않고 temp/cache 디렉토리는 OS에 의해서 순식간에 정리될 수도 있습니다. 그러므로 system.DocumentsDirectory 가 가장 안전한 곳입니다.

다시 예제로 돌아가서요. 첫번째 줄은 sqlite3 namespace를 통해서 SQLite 함수를 만드는 겁니다. 마지막줄은 특정 위치에 있는 데이터베이스 파일을 로드하기 위해 (혹은 그 위치에 데이터베이스가 없으면 생성하기 위한) sqlite3.open()을 하는 겁니다.

Creating a Table

테이블 (루아 테이블이 아닌 SQL 테이블), 컬럼, row 등과 같이 SQLite 데이터베이스를 사용하게 되면 일상에서 사용하는 용어들을 접하게 됩니다. 테이블은 데이터의 카테고리를 연상하실 수 있을 겁니다. 저 위에 note 앱을 예로 들을 때 얘기 한건데요. 앱 세팅, 유저 세팅 그리고 유저가 생성한 노트를 보관하기 위해서 각각 다른 테이블들을 가질 수 있습니다.

각각의 SQL 테이블은 복수의 컬럼들을 가질 수 있습니다. 예를 들어 id, name, description, website 등등. 프로퍼티라고 생각할 수 있겠죠. 테이블에 insert 된 각각의 아이템들은 row라고 합니다. Row는 실제로 다루게 되는 데이터들이 됩니다. 이 row들을 만들기 위해서 먼저 컬럼들을 만들어야 하는 것이죠.

local tablesetup = [[CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY autoincrement, name, description, website);]]
db:exec( tablesetup )


위의 예제에 있는 tablesetup 변수에는 SQL Query 가 string으로 저장돼 있습니다. 이 쿼리는 데이터베이스가 무엇을 해야 하는지 정리해 놓은 겁니다. 그 다음에 우리는 이 쿼리를 실행하게 되죠. db.exec로 실행을 합니다. 그러면 이 쿼리가 데이터베이스에 전달 되서 데이터베이스가 그 쿼리대로 일을 합니다. 위 예제에서는 text 라는 테이블이 만들어 지고 그 테이블에는 4개의 컬럼들이 있게 됩니다.

    id (primary key that will auto-increment upon inserting new rows)
    name
    description
    website


NOTE 1 : 대개 테이블의 첫번째 컬럼은 id 입니다. 이것은 primary key로 세팅 됩니다. (모든 테이블은 한개의 primary key 가 있어야 됩니다.) auto-increment flag는 row가 추가 될 때마다 이 컬럼의 값이 자동적으로 그 다음 id number로 설정 된다는 겁니다. (1,2,3,4 이렇게 순서가 매겨 지겠죠.) 그러니까 개발자는 이 컬럼의 row 값들을 따로 입력할 필요가 없습니다.

NOTE 2 : 위 예제에서 query string이 따옴표 대신  double brackets ([[ 와 ]]) 로 싸여져 있는 것을 보실 수 있을 겁니다. 왜냐하면 SQL query 를 만들 때 그 안에 큰 따옴표나 작은 따옴표가 사용되어야 하기 때문에 [[와 ]] 를 사용해서 좀 더 안전하게 코딩할 수 있도록 한 겁니다.

이제 새롭게 만든 test라는 SQL 테이블에 각각의 row들을 insert 할 수 있습니다. 모든 row들은 id,name,description, website 프로퍼티들이 있습니다. 그리고 각 row들은 이에 대해 각각 다른 값들을 가지고 있을 수 있습니다. 조금 전에 얘기했듯이 컬럼은 테이블에서 row에 대한 프로퍼티들로 생각할 수 있습니다.

반응형