일반적으로 데이터에 대한 데이터를 메타데이터(metadata)라고 합니다. JDBC에서 DatabaseMetaData 인터페이스는 현재 연결된 데이터베이스에 대한 다양한 정보를 조회할 수 있는 메서드를 제공합니다. 예를 들어 데이터베이스 이름, 드라이버 버전, 최대 컬럼 길이 등을 확인할 수 있습니다.
DatabaseMetaData는 애플리케이션이 실행 환경의 데이터베이스 기능을 동적으로 파악해야 할 때 특히 유용합니다. 특정 DBMS에서만 지원하는 기능을 사용하기 전에 지원 여부를 먼저 확인하면 이식성 높은 코드를 작성할 수 있습니다.
DatabaseMetaData의 주요 메서드
| 메서드 | 설명 |
|---|---|
| getDriverName() | 현재 사용 중인 JDBC 드라이버의 이름을 반환합니다. |
| getDriverVersion() | 현재 JDBC 드라이버의 버전을 반환합니다. |
| getUserName() | 데이터베이스에 접속한 사용자 이름을 반환합니다. |
| getDatabaseProductName() | 현재 연결된 데이터베이스 제품의 이름을 반환합니다. |
| getDatabaseProductVersion() | 현재 데이터베이스 제품의 버전을 반환합니다. |
| getNumericFunctions() | 해당 데이터베이스에서 사용 가능한 수학 함수 목록을 반환합니다. |
| getStringFunctions() | 해당 데이터베이스에서 사용 가능한 문자열 함수 목록을 반환합니다. |
| getSystemFunctions() | 해당 데이터베이스에서 사용 가능한 시스템 함수 목록을 반환합니다. |
| getTimeDateFunctions() | 해당 데이터베이스에서 사용 가능한 날짜·시간 함수 목록을 반환합니다. |
| getURL() | 현재 연결된 데이터베이스의 URL을 반환합니다. |
| supportsSavepoints() | 현재 데이터베이스가 세이브포인트(savepoint)를 지원하는지 확인합니다. |
| supportsStoredProcedures() | 현재 데이터베이스가 저장 프로시저(stored procedure)를 지원하는지 확인합니다. |
| supportsTransactions() | 현재 데이터베이스가 트랜잭션을 지원하는지 확인합니다. |
사용 예제
다음 예제는 Connection 객체에서 getMetaData() 메서드를 호출하여 DatabaseMetaData 객체를 얻고, 배치 업데이트 지원 여부와 함께 드라이버 정보, 사용자 정보, 각종 함수 목록을 조회하는 방법을 보여줍니다.
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
public class DatabaseMetadataExample {
public static void main(String args[])throws Exception {
// 연결 생성
String mysqlUrl = "jdbc:mysql://localhost/sampleDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
// DatabaseMetaData 객체 생성
DatabaseMetaData dbMetadata = con.getMetaData();
// supportsBatchUpdates() 메서드 호출
boolean bool = dbMetadata.supportsBatchUpdates();
if(bool) {
System.out.println("Underlying database supports batch updates");
} else {
System.out.println("Underlying database doesnt supports batch updates");
}
// 드라이버 이름 조회
System.out.println(dbMetadata.getDriverName());
// 드라이버 버전 조회
System.out.println(dbMetadata.getDriverVersion());
// 사용자 이름 조회
System.out.println(dbMetadata.getUserName());
// URL 조회
System.out.println(dbMetadata.getURL());
// 수학 함수 목록 조회
System.out.println("Numeric functions: "+dbMetadata.getNumericFunctions());
System.out.println("");
// 문자열 함수 목록 조회
System.out.println("String functions: "+dbMetadata.getStringFunctions());
System.out.println("");
// 시스템 함수 목록 조회
System.out.println("System functions: "+dbMetadata.getSystemFunctions());
System.out.println("");
// 날짜·시간 함수 목록 조회
System.out.println("Time and Date funtions: "+dbMetadata.getTimeDateFunctions());
}
}
실행 결과
Connection established......
Underlying database supports batch updates
MySQL-AB JDBC Driver
mysql-connector-java-5.1.12 ( Revision: ${bzr.revision-id} )
root@localhost
jdbc:mysql://localhost/sampleDB
Numeric functions:
ABS,ACOS,ASIN,ATAN,ATAN2,BIT_COUNT,CEILING,COS,COT,DEGREES,EXP,FLOOR,LOG,LOG10,MAX
,MIN,MOD,PI,POW,POWER,RADIANS,RAND,ROUND,SIN,SQRT,TAN,TRUNCATE
String functions:
ASCII,BIN,BIT_LENGTH,CHAR,CHARACTER_LENGTH,CHAR_LENGTH,CONCAT,CONCAT_WS,CONV,ELT,E
XPORT_SET,FIELD,FIND_IN_SET,HEX,INSERT,INSTR,LCASE,LEFT,LENGTH,LOAD_FILE,LOCATE,LO
CATE,LOWER,LPAD,LTRIM,MAKE_SET,MATCH,MID,OCT,OCTET_LENGTH,ORD,POSITION,QUOTE,REPEA
T,REPLACE,REVERSE,RIGHT,RPAD,RTRIM,SOUNDEX,SPACE,STRCMP,SUBSTRING,SUBSTRING,SUBSTR
ING,SUBSTRING,SUBSTRING_INDEX,TRIM,UCASE,UPPER
System functions:
DATABASE,USER,SYSTEM_USER,SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION
Time and Date funtions:
DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME,MONTHNAME,QUARTER,WEEK,YEAR,H
OUR,MINUTE,SECOND,PERIOD_ADD,PERIOD_DIFF,TO_DAYS,FROM_DAYS,DATE_FORMAT,TIME_FORMAT
,CURDATE,CURRENT_DATE,CURTIME,CURRENT_TIME,NOW,SYSDATE,CURRENT_TIMESTAMP,UNIX_TIME
STAMP,FROM_UNIXTIME,SEC_TO_TIME,TIME_TO_SEC