본문 바로가기
CODE/CodeKnowledge

[SQL] mybatis에서 int와 integer의 차이 (null를 오류로 반환하지 않는 것은?)

by 솔리닉__ 2023. 7. 16.
반응형

MyBatis를 사용하다 보면 resultType="int"와 resultType="Integer" 중 어떤 것을 사용해야 하는지 고민하게 됩니다.

특히 조회 결과가 없거나 NULL 값이 반환될 수 있는 쿼리에서는 예상치 못한 오류가 발생할 수 있습니다.

이번 글에서는 MyBatis에서 int와 Integer의 차이점, null 반환 시 발생하는 오류, 그리고 실무에서 어떤 타입을 선택해야 하는지 알아보겠습니다.

MyBatis란?

MyBatis는 Java 객체와 SQL 데이터베이스를 연결해주는 SQL Mapper 프레임워크입니다.

개발자는 직접 SQL을 작성하면서도 객체와 데이터베이스 간의 매핑을 편리하게 처리할 수 있습니다.


MyBatis int와 Integer 차이

1. int 사용 시

<select id="getCount" resultType="int">
    SELECT COUNT(*)
    FROM table_name
</select>

int는 Java의 기본형(Primitive Type)입니다.

특징은 다음과 같습니다.

  • 32비트 정수형
  • null 저장 불가
  • 기본값은 0
  • 조회 결과가 null이면 예외 발생 가능

예를 들어 MyBatis가 조회 결과를 null로 반환해야 하는 상황에서 int 타입으로 매핑하면 오류가 발생할 수 있습니다.


2. Integer 사용 시

<select id="getCount" resultType="Integer">
    SELECT COUNT(*)
    FROM table_name
</select>

Integer는 int의 래퍼 클래스(Wrapper Class)입니다.

특징은 다음과 같습니다.

  • 객체(Object) 타입
  • null 저장 가능
  • 데이터베이스 NULL 값 표현 가능
  • Optional한 값 처리에 유리

조회 결과가 존재하지 않거나 NULL이 반환되는 경우에도 Integer는 정상적으로 처리할 수 있습니다.


MyBatis에서 null 반환 시 오류가 발생하는 이유

다음과 같은 Mapper 메서드가 있다고 가정해보겠습니다.

int getUserAge(Long userId);

만약 SQL 실행 결과가 NULL이라면 MyBatis는 이를 int 타입으로 변환해야 합니다.

하지만 int는 null을 저장할 수 없기 때문에 다음과 같은 예외가 발생할 수 있습니다.

Attempted to return null from a method with a primitive return type (int)

반면 Integer를 사용하면 null 자체를 반환할 수 있으므로 오류가 발생하지 않습니다.

Integer getUserAge(Long userId);

실무에서는 int와 Integer 중 무엇을 사용해야 할까?

int 사용이 적합한 경우

  • 반드시 값이 존재하는 경우
  • COUNT 결과처럼 null이 발생하지 않는 경우
  • 기본값 0으로 처리해도 문제없는 경우

Integer 사용이 적합한 경우

  • 조회 결과가 없을 수 있는 경우
  • 데이터베이스 컬럼이 NULL을 허용하는 경우
  • 값의 존재 여부 자체가 중요한 경우
  • Optional한 데이터를 처리하는 경우

MyBatis int vs Integer 비교

타입 기본형(Primitive) 객체형(Wrapper)
NULL 저장 불가능 가능
기본값 0 null
조회 결과 없음 오류 가능 정상 처리
사용 권장 상황 값이 반드시 존재 값이 없을 수 있음

 

결론은 null값을 반환할 일이 있을 거 같은 쿼리에서는 integer를 resultType으로 사용하면 오류를 반환하지는 않습니다. 그게 정답은 아니라는 거고, 오류로 반환할 때 이런 경우때문이라는 걸 참고하셨으면 좋겠습니다!
반응형

댓글