개발/Mybatis
Mybatis에서 Oracle과 Java의 일반적인 데이터 타입 매핑
함수형 인간
2025. 1. 24. 07:10
Oracle 데이터 타입 | Java 데이터 타입 | MyBatis Type Alias | 비고 |
CHAR, VARCHAR2, NCHAR, NVARCHAR2 | java.lang.String | string | 문자열 |
LONG | java.lang.String | string | 매우 긴 문자열 |
NUMBER | java.math.BigDecimal | bigdecimal |
정밀한 숫자, 금융 계산에 적합
|
NUMBER(p) | java.lang.Integer | int |
p (정밀도)가 10 이하인 경우
|
NUMBER(p) | java.lang.Long | long |
p (정밀도)가 10 초과 19 이하인 경우
|
NUMBER(p,s) | java.lang.Double | double |
부동 소수점 숫자
|
FLOAT | java.lang.Double | double |
부동 소수점 숫자
|
INTEGER, INT | java.lang.Integer | int | 정수 |
SMALLINT | java.lang.Short | short | 정수 |
DATE | java.util.Date | date | 날짜 및 시간 |
TIMESTAMP | java.sql.Timestamp | timestamp |
날짜 및 시간 (밀리초 정밀도)
|
TIMESTAMP WITH TIME ZONE | java.sql.Timestamp | timestamp |
타임존 정보를 포함한 날짜 및 시간
|
BLOB | byte[] | byte[] | 바이너리 데이터 |
CLOB | java.lang.String | string |
대용량 텍스트 데이터
|
NCLOB | java.lang.String | string |
대용량 유니코드 텍스트 데이터
|
RAW | byte[] | byte[] |
원시 바이너리 데이터
|
BOOLEAN | java.lang.Boolean | boolean |
논리값 (true/false) - Oracle 12c부터 지원, 이전 버전은 CHAR(1) 또는 NUMBER(1) 사용
|
매핑 설계 시 고려 사항:
- 데이터 정밀도:
- Oracle의 NUMBER 타입은 매우 넓은 범위의 숫자와 정밀도를 표현할 수 있다. Java의 int, long, double로 모든 NUMBER 타입을 정확하게 표현하지 못할 수 있으므로, 정밀한 숫자 계산이 필요한 경우 java.math.BigDecimal을 사용하는 것이 좋다.
- 날짜 및 시간:
- Oracle의 DATE 타입은 년, 월, 일, 시, 분, 초 정보를 저장한다. Java의 java.util.Date와 매핑하는 것이 일반적이다.
- 밀리초 단위의 정밀도가 필요한 경우 TIMESTAMP를 사용하고 java.sql.Timestamp와 매핑한다.
- 타임존 정보를 다루어야 하는 경우 TIMESTAMP WITH TIME ZONE을 사용하고, java.sql.Timestamp 또는 java.time.OffsetDateTime (Java 8 이상)과 매핑할 수 있다.
- 대용량 데이터:
- CLOB, NCLOB과 같은 대용량 텍스트 데이터는 java.lang.String으로 매핑할 수 있지만, 메모리 문제가 발생할 수 있다. java.io.Reader 또는 java.io.InputStream으로 처리하는 것이 더 효율적일 수 있다.
- BLOB과 같은 대용량 바이너리 데이터는 byte[]로 매핑할 수 있지만, 메모리 문제가 발생할 수 있다. java.io.InputStream으로 처리하는 것이 더 효율적일 수 있다.
- 사용자 정의 타입:
- Oracle의 객체 타입이나 컬렉션 타입과 같은 사용자 정의 타입을 사용하는 경우, TypeHandler를 직접 구현하여 매핑을 정의해야 한다.
- NULL 처리:
- Oracle의 NULL 값은 Java의 null과 매핑된다. null 값을 적절히 처리해야 한다.
- 예를 들어 오라클에서 숫자 타입(NUMBER, INTEGER, FLOAT 등) 컬럼이 NULL 값일 때, MyBatis를 통해 Java의 int 타입 필드로 가져오면 null을 int로 변환할 수 없기 때문에 예외가 발생한다.
( org.apache.ibatis.exceptions.TypeException) - -> Java 필드를 Integer와 같은 Wrapper 클래스로 변경
- -> SQL 쿼리에서 NVL 또는 COALESCE 사용