xpressengine/xe-core — pull request #901 by kijin (2014-08-11 06:08:44+00:00)
Title: DB 컬럼 정보를 불러오는 기능 + DB 컬럼 속성을 변경하는 기능

#894 작업을 하다가 아쉬운 점이 있어서 새 기능을 만들어 보았습니다.

현재는 모듈 업데이트를 하거나 그 밖에 DB 스키마 변경이 필요할 때 컬럼을 추가하거나 삭제할 수는 있지만, 이미 있는 컬럼의 자료형이나 길이를 변경할 수는 없도록 되어 있습니다. 그렇다고 쿼리를 직접 써서 변경한다면 XE의 원칙에 어긋나겠고요...

그래서 특정 테이블의 특정 컬럼에 대한 정보(자료형, 길이, 기본값, null여부)를 불러온 후 변경이 필요하다고 판단되면 변경을 요청할 수 있는 기능을 추가해 보았습니다.

`getColumnInfo()` 메소드는 해당 컬럼의 속성이 담긴 객체를 반환합니다.

$oDB->getColumnInfo('member', 'password');
object(stdClass)18 (6) {
["name"]=> string(8) "password"
["dbtype"]=> string(7) "varchar" // 실제 DB에서 사용하는 자료형 (DBMS마다 다름)
["xetype"]=> string(7) "varchar" // XE에서 사용하는 단순화된 자료형 (number, date 등)
["size"]=> int(60)
["default_value"]=> NULL
["notnull"]=> bool(true)
}

`modifyColumn()` 메소드는 컬럼 속성을 변경하는 데 사용하며, 사용하는 파라미터의 종류와 순서는 이미 있는 `addColumn()` 메소드와 같습니다.

// password 컬럼의 길이를 250자로 늘리는 명령
$oDB->modifyColumn('member', 'password', 'varchar', 250, null, true);

변경이 필요하지 않은 속성까지 변경되는 것을 막기 위해서는 `getColumnInfo()` 메소드에서 받은 값을 도로 집어넣는 것이 좋습니다.

$column_info = $oDB->getColumnInfo('member', 'password');
$oDB->modifyColumn('member', 'password', $column_info->xetype, 250,
$column_info->default_value, $column_info->notnull);

속성 변경에 성공한 경우 `true`, 실패한 경우 `false`를 반환합니다.

MySQL, MS SQL, 큐브리드 모두 동일한 기능을 갖도록 만들어졌으나, 일부 버전의 큐브리드는 컬럼 속성 변경이 불가능한 경우도 있습니다. 이 경우 `modifyColumn()` 메소드는 `false`를 반환하게 됩니다. 그 밖에도 DB 권한 등 여러 가지 이유로 스키마 변경에 실패할 수 있으므로, 이 메소드를 사용하는 모듈에서는 `false`를 반환하는 경우를 반드시 확인하고 적절한 조치를 취해야 합니다.

많은 테스트를 바라며, 모듈 업데이트시 새로운 기능을 구현하면서도 구 버전과의 호환성을 유지하고 싶은 분들에게 도움이 되면 좋겠습니다.