안드로이드 DB 설계 : DB Contract VS DAO

조회수 2477회

안녕하세요. 안드로이드에서 DB 설계중인데요. 저는 DB 모델을 두고 DAO를 통해 자료를 주고받는 방식을 사용하고 있습니다. DBHelper는 거의 DB를 초기화하거나 DB를 반환하는 용도로만 사용하고 있습니다.

Record 모델은 다음과 같습니다.

public class Record {
    private long id;
    private String operation;
    private String day;
    private long elapsedTime;
    private int mistake;

    public Record(String day) {
         this.day = day;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) { this.id = id; }

    public String getDay() { return day; }

    public String getOperation() {
        return operation;
    }

  이하 생략

실제 CRUD가 이루어지는 RecordDAO입니다.

public class RecordDAO {

    private SQLiteDatabase database;
    private DBHelper dbHelper;
    private String[] allColumns = { DBHelper.COLUMN_RECORD_ID, DBHelper.COLUMN_RECORD_OPERATION,
            DBHelper.COLUMN_RECORD_DAY, DBHelper.COLUMN_RECORD_ELAPSED_TIME,
            DBHelper.COLUMN_RECORD_MISTAKE };

    public RecordDAO(Context context) {
        dbHelper = DBHelper.getInstance(context);
        database = dbHelper.getDb();
        //생성된 DBHelper를 이용해서 instance를 받아오고 DB를 받아온다.
    }

    public void close() { dbHelper.close(); }

    public void insertRecord(String operation, String day, long elapsedTime, int mistake) {
        //DB에 record 저장하기

        ContentValues values = new ContentValues();
        values.put(DBHelper.COLUMN_RECORD_OPERATION, operation);
        values.put(DBHelper.COLUMN_RECORD_DAY, day);
        values.put(DBHelper.COLUMN_RECORD_ELAPSED_TIME, elapsedTime);
        values.put(DBHelper.COLUMN_RECORD_MISTAKE, mistake);

        database.insert(DBHelper.TABLE_RECORDS, null, values);
    }

  이하 생략

Activity에서 DAO object를 얻고 해당하는 method를 실행시키는 방식으로 CRUD가 이루어집니다.

        recordDAO.insertRecord(currentRecord.getOperation(), currentRecord.getDay(), currentRecord.getElapsedTime(), currentRecord.hasMistake());

그런데 구글 안드로이드 문서에서는 이런 방식이 아니라 DB 모델에 대한 Contract를 작성하는 방식을 권하고 있습니다. 아래처럼 TABLE_NAME과 COLUMN 이름을 Contract에 작성합니다.

package com.example.android.pets.data;

import android.provider.BaseColumns;

public final class PetContract {

    private PetContract() {}

    public static final class PetEntry implements BaseColumns {

        public final static String TABLE_NAME = "pets";

        public final static String _ID = BaseColumns._ID;
        public final static String COLUMN_PET_NAME ="name";
        public final static String COLUMN_PET_BREED = "breed";
        public final static String COLUMN_PET_GENDER = "gender";
        public final static String COLUMN_PET_WEIGHT = "weight";

        public static final int GENDER_UNKNOWN = 0;
        public static final int GENDER_MALE = 1;
        public static final int GENDER_FEMALE = 2;
    }
}

이 경우에도 DBHelper는 테이블을 생성하고 반환하는 역할을 수행합니다. DAO가 없기 때문에 CRUD는 Activity내에서 직접 처리합니다.

 private void insertPet() {
        SQLiteDatabase db = mDbHelper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(PetEntry.COLUMN_PET_NAME, "Toto");
        values.put(PetEntry.COLUMN_PET_BREED, "Terrier");
        values.put(PetEntry.COLUMN_PET_GENDER, PetEntry.GENDER_MALE);
        values.put(PetEntry.COLUMN_PET_WEIGHT, 7);

        long newRowId = db.insert(PetEntry.TABLE_NAME, null, values);
    }

제가 DAO 방식으로 코드를 작성한 이유는 DB 입출력을 AsyncTask에 넣어서 한번에 처리하기 위함입니다. Google 문서에서 추천하는 Contract를 이용하는 방법은 어떤 장점이 있을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)