[MyBatis] null 데이터 저장하기

이 포스팅은 “그린컴퓨터아카데미”에서 진행중인 NCS기반의 교육과정에서 프로젝트 형상관리 능력단위에 대한 보조 교육자료로 활용되고자 작성되었습니다.

이 포스팅의 내용을 이해하는데 필요한 MyBatis의 기본적인 연동 방법은 숙지가 되어 있는 상태라고 가정하겠습니다.

테이블 구조 확인

다음과 같은 구조의 테이블이 있다고 가정해 보겠습니다. 오프라인 강의에서 활용되는 샘플 테이블에서 Alter Table명령어를 사용하여 hiredate컬럼을 Null 허용으로 수정하였습니다.

 

초기 데이터는 다음과 같이 저장되어 있습니다.

 

Null 데이터를 저장하기 위한 시도

이 테이블에 MyBatis를 통하여 데이터를 저장하기 위한 Professor이라는 클래스가 다음과 같이 정의되어 있다고 해 봅시다. 일반적인 Java Beans 클래스 입니다.

 

이 클래스를 사용하여 다음과 같이 데이터를 저장하고자 합니다. 아래의 코드를 보면 21, 22라인에서 comm필드와 hiredate컬럼에 저장될 데이터가 주석으로 막혀 있습니다. 이렇게 설정했을 때 데이터가 저장되는 상황을 확인해 보도록 합시다.

 

결과확인

결과는 아래와 같습니다. String 타입은 null이 저장되지만 int형 데이터는 0으로 저장되어 집니다.

그 이유는 멤버변수의 데이터 타입이 String과 같은 객체 형태인 경우 특별히 값이 할당되지 않으면 null로 초기화가 되지만 숫자 형식의 기본 데이터 타입은 값이 설정되지 않을 경우 0으로 기본 초기화가 진행되는 Java언어의 특성 때문 입니다.

 

 

명시적으로 Null 데이터 저장하기

명시적으로 null 데이터를 저장하기 위해서 테스트 코드에서 Professor 객체의 setter를 통해 다음과 같이 null을 설정해 보겠습니다.

위와 같이 처리할 경우 String 타입으로 설정되어 있는 setHiredate() 메서드의 호출은 정상적으로 처리되지만 int 형 변수를 파라미터로 받는 setComm() 메서드에 대한 호출은 컴파일 에러가 됩니다. 이러한 현상은 기본 데이터 타입을 사용하는 모든 경우가 동일합니다.

 

 

명시적으로 Null 데이터 저장하기 위한 방법

해결책은 간단합니다. Professor 클래스의 멤버변수가 다른 클래스의 객체로 선언되면 됩니다. 그리고 JAVA언어에는 기본 데이터 타입에 대응되는 Wrapper 클래스가 존재합니다. int형 변수를 Integer 클래스의 객체로 선언하면 명시적으로 Null을 설정할 수 있게 됩니다.

멤버변수의 데이터 타입이 int에서 Integer로 변경되면 getter, setter 메서드도 수정되어야 합니다.

 

 

이제 다음과 같이 테스트 클래스에서 setter를 통한 null 설정이 가능해 집니다. (21,22 라인을 확인해 보세요)

 

실행 후 결과를 확인해 보면 아래와 같이 varchar 타입의 컬럼과 int 타입의 컬럼에 모두 0이 저장되어 있는 것을 확인할 수 있습니다.

 

이제 즐깁시다~!!!

유용하셨다면 덧글 필수~!!!

답글 남기기