본문 바로가기

[JAVA] jdbcTemplate 사용 시 number 데이터 null 값 가져오는 방법

다프트 코더 2025. 4. 29.

데이터베이스 테이블에 숫자형(Number) 컬럼이 있습니다. 해당 컬럼의 값은 null인데 jdbcTemplete를 이용해 데이터를 조회하면 해당 컬럼의 값이 null이 아닌 0으로 들어오는 현상을 발견했습니다. 그래서 해당 현상에 대한 원인을 찾고 해결한 과정을 소개하겠습니다.

Primitive Type(원시 타입) 변수 선언

데이터베이스 테이블의 값을 담을 DTO 클래스를 생성할 때 숫자형(Number) 컬럼의 값을 담을 변수를 int, long 타입으로 선언한 게 원인이었습니다. int, long 타입은 Primitive Type(원시 타입)으로 정수, 실수, 문자, 논리 리터널 등의 실제 데이터 값을 저장하는 타입입니다. 그래서 int, long 타입으로 선언한 변수는 null 값을 가질 수 없기 때문에 null일 경우 0으로 처리돼서 값을 넣게끔 되어있었습니다.

public class user {
    private String userId;
    private String userName;
    private long userAge; //long(X) Long(O)
}

데이터베이스 테이블에는 userAge 값이 null로 되어있는데 소스에서는 userAge 값이 null이 아닌 0으로 되면서 비지니스 로직 분기가 정상적으로 처리되지 않았습니다.

long totalUserAge = 900;
if(userAge == null) {
    userAge = 1;
}

long = totalUserAge / userAge; //userAge값이 0이면 에러 발생

원시 타입으로는 int, long, double, float, boolean, byte, short, char 등이 있습니다.

Reference Type(참조 타입)으로 수정

 

int, long 타입이 아닌 Reference Type(참조 타입)으로 수정하였습니다. 참조 타입은 객체를 참조하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입입니다. 참조 타입은 null 값을 입력받을 수 있습니다.

public class user {
    private String userId;
    private String userName;
    private Long userAge; //long(X) Long(O)
}

user 객체에 userAge 변수를 long → Long 타입으로 변경 후 null 값을 정상적으로 조회해서 null 값을 넣어주는걸 확인하였습니다.

원시 vs 참조 타입 성능 차이

원시 타입은 스택 매모리에 존재하고 참조 타입은 스택 메모리에는 참조 값만 있는 상태고 실제 값은 힙 영역에 존재합니다. 그래서 참조 타입의 경우 최소 2번 메모리 접근을 해야 하고 일부 타입의 경우 언박싱 과정을 거쳐야 하기 때문에 참조 타입은 원시 타입에 비해서는 접근 속도가 느립니다.

 

마치며

데이터베이스 테이블 생성 시 숫자형(number) 컬럼은 null을 허용하지 않도록 하는 방법이 애초에 이런 오류가 발생하지 않도록 하는 근본적인 문제 해결 방법일 수도 있습니다. 하지만 현장에서는 테이블 컬럼 속성을 변경하는 것보다는 현재 상황에 맞게 코드를 변경하는 방법이 리스크가 더 낮기 때문에 위 방법으로 코드를 수정해서 문제를 해결하였습니다.

반응형

댓글