[안드로이드 데이터베이스(DB) 프로그래밍 3 -SQLiteDatabase 사용 예제]의 예제에서는 SQL 문장을 만들 때, 테이블 이름(CONTACT_T)과 필드 이름(NO, NAME, ...)을 매번 직접 지정하였습니다.
private void init_tables() {
// 코드 계속 ...
String sqlCreateTbl = "CREATE TABLE IF NOT EXISTS CONTACT_T (" +
"NO " + "INTEGER NOT NULL," +
"NAME " + "TEXT," +
"PHONE " + "TEXT," +
"OVER20 " + "INTEGER" + ")" ;
// ... 코드 계속
}
private void load_values() {
// 코드 계속 ...
String sqlQueryTbl = "SELECT * FROM CONTACT_T" ;
// ... 코드 계속
}
private void save_values() {
// 코드 계속 ...
String sqlInsert = "INSERT INTO CONTACT_T " +
"(NO, NAME, PHONE, OVER20) VALUES (" +
Integer.toString(no) + "," +
"'" + name + "'," +
"'" + phone + "'," +
((isOver20 == true) ? "1" : "0") + ")" ;
// ... 코드 계속
}
그런데 만약, 기능 수정 또는 확장으로 인해 데이터베이스 구조가 변경되어야 한다면 어떻게 될까요? 그러한 구조 변경으로 인해 테이블 이름 또는 필드 이름이 수정되어야 된다면? 음.. 뭐, 어쩔 수 없이 모든 테이블, 필드 이름을 찾아서 수정된 이름으로 변경해야겠죠.
물론, 테이블이나 필드 이름이 사용되는 곳이 얼마 없으니 상관없지 않을까... 라고 생각할 수도 있습니다. 하지만 테이블과 필드의 갯수가 많아지고 SQL 문장을 조합하는 곳이 많아지면, 이름 수정 작업은 큰 부담으로 다가올 수 밖에 없습니다.
이런 문제를 해결할 수 있는 방법은 계약 클래스(Contract Class)를 사용하는 것입니다.
계약 클래스(Contract Class)는 프로그램 개발 과정에서 참조되는 여러 상수들을 정의한 클래스를 말합니다. 이 의미를 데이터베이스에서 적용해보자면, 데이터베이스의 계약 클래스(Contract Class)란, 테이블 이름, 열(Column) 이름, 기능 별 SQL 문장들에 대한 상수 정의를 포함한 클래스를 의미합니다. "계약(Contract)"이라는 단어가 "어떤 행위를 함에 있어 관련된 사람들이 지켜야 할 의무 또는 약속을 문서로 남긴 것"을 의미하듯, 계약 클래스(Contract Class)는 데이터베이스를 사용함에 있어 개발자가 사용해야 할 여러 정보를 상수로 정의해둔 것"이라고 정리할 수 있죠.
계약 클래스(Contract Class)를 사용함으로써 얻을 수 있는 장점은 데이터베이스와 관련된 정보를 한 곳에서 관리할 수 있다는 것과, 그로 인해 데이터베이스 구조 또는 이름이 변경될 때의 수정 작업을 최소화할 수 있다는 것입니다.
참고로, 계약 클래스(Contract Class)를 만들 때는 앱의 패키지 루트에 생성하는 것이 좋습니다. 앱 소스의 어디서든 바로 참조 가능하도록 만드는 것이 좋기 때문입니다. 그리고 계약 클래스(Contract Class)는 인스턴스를 만들 필요가 없기 때문에 생성자의 접근 제한자(Access Modifier)를 private으로 선언합니다.
계약 클래스(Contract Class)에 대한 구체적인 사용 방법은 아래 예제의 ContactDBCtrct 클래스를 참고하시기 바랍니다.