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으로 사용하면 오류를 반환하지는 않습니다. 그게 정답은 아니라는 거고, 오류로 반환할 때 이런 경우때문이라는 걸 참고하셨으면 좋겠습니다!
'CODE > CodeKnowledge' 카테고리의 다른 글
| [SQL] BULK INSERT (mysql과 oracle 차이점) (0) | 2023.07.24 |
|---|---|
| 젠킨스란 무엇일까? (feat.수동배포 차이점 ) (0) | 2023.07.23 |
| [TIP] jar안에 class파일 미리보는 법 (매우 간단함) (0) | 2023.07.15 |
| [SQL] selfjoin 셀프조인에 대해 알아보기 (쓰임, 정의, 방법) (0) | 2023.07.13 |
| [국비과제] 자바스크립트 이용 회원가입 형식 만들기 (0) | 2023.07.12 |
댓글