개발/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) 사용

매핑 설계 시 고려 사항:

  1. 데이터 정밀도:
    • Oracle의 NUMBER 타입은 매우 넓은 범위의 숫자와 정밀도를 표현할 수 있다. Java의 int, long, double로 모든 NUMBER 타입을 정확하게 표현하지 못할 수 있으므로, 정밀한 숫자 계산이 필요한 경우 java.math.BigDecimal을 사용하는 것이 좋다.
  2. 날짜 및 시간:
    • Oracle의 DATE 타입은 년, 월, 일, 시, 분, 초 정보를 저장한다. Java의 java.util.Date와 매핑하는 것이 일반적이다.
    • 밀리초 단위의 정밀도가 필요한 경우 TIMESTAMP를 사용하고 java.sql.Timestamp와 매핑한다.
    • 타임존 정보를 다루어야 하는 경우 TIMESTAMP WITH TIME ZONE을 사용하고, java.sql.Timestamp 또는 java.time.OffsetDateTime (Java 8 이상)과 매핑할 수 있다.
  3. 대용량 데이터:
    • CLOB, NCLOB과 같은 대용량 텍스트 데이터는 java.lang.String으로 매핑할 수 있지만, 메모리 문제가 발생할 수 있다. java.io.Reader 또는 java.io.InputStream으로 처리하는 것이 더 효율적일 수 있다.
    • BLOB과 같은 대용량 바이너리 데이터는 byte[]로 매핑할 수 있지만, 메모리 문제가 발생할 수 있다. java.io.InputStream으로 처리하는 것이 더 효율적일 수 있다.
  4. 사용자 정의 타입:
    • Oracle의 객체 타입이나 컬렉션 타입과 같은 사용자 정의 타입을 사용하는 경우, TypeHandler를 직접 구현하여 매핑을 정의해야 한다.
  5. 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 사용