MyBatis는 Java에서 많이 사용되는 ORM 프레임워크 중 하나로, SQL과 객체 간의 매핑을 효율적으로 처리해 줍니다.
하지만 select 쿼리를 사용할 때 조회 결과가 아예 없을 경우, 예상치 못한 NullPointerException이 발생할 수 있습니다. 이 글에서는 MyBatis에서 null 예외가 발생하는 원인과 이를 안전하게 처리하는 다양한 방법에 대해 알아봅니다.
📌 문제 상황: 조회 결과가 없는 경우 null 반환
MyBatis의 selectOne() 메서드는 기본적으로 단일 객체를 반환합니다. 이때 쿼리 결과가 없으면 null을 반환하게 되며, 이를 별도의 체크 없이 사용하면 아래와 같은 에러가 발생할 수 있습니다.
User user = userMapper.selectUserById(1);
System.out.println(user.getName()); // NullPointerException 발생 가능
✅ 해결 방법 1: null 체크로 안전하게 처리
가장 기본적이면서 확실한 방법은, null 여부를 직접 확인하는 것입니다.
User user = userMapper.selectUserById(1);
if (user != null) {
System.out.println(user.getName());
} else {
System.out.println("사용자를 찾을 수 없습니다.");
}
이 방식은 코드가 다소 길어지지만, MyBatis에서 조회 결과가 null일 수 있음을 가정하고 안전하게 코드를 구성할 수 있습니다.
✅ 해결 방법 2: Optional로 더 깔끔하게
Java 8 이상에서는 Optional을 활용해 더욱 세련된 null 처리를 할 수 있습니다.
▶ Mapper 인터페이스
Optional<User> selectUserById(int id);
▶ 호출부
userMapper.selectUserById(1)
.ifPresentOrElse(
user -> System.out.println(user.getName()),
() -> System.out.println("사용자 없음")
);
단, Optional은 MyBatis에서 기본으로 지원하지 않기 때문에 MyBatis 3.5 이상 버전에서만 적용하거나 별도의 설정이 필요할 수 있습니다.
✅ 해결 방법 3: 빈 객체 반환 (Null 대신)
조회 결과가 null일 경우, 미리 정의된 기본 객체를 반환하여 NullPointerException을 방지할 수도 있습니다.
public User selectUserSafe(int id) {
User user = userMapper.selectUserById(id);
return user != null ? user : new User(); // 빈 객체 반환
}
이 방법은 특히 테스트나 디폴트 값을 기반으로 동작할 때 유용합니다.
✅ 해결 방법 4: 컬렉션으로 조회 (selectList)
selectList()는 조회 결과가 없을 경우 null이 아닌 빈 리스트 ([]) 를 반환합니다. 따라서 컬렉션 형태로 반환하도록 쿼리를 구성하는 것도 좋은 방법입니다.
List<User> users = userMapper.selectUsersByRole("admin");
if (users.isEmpty()) {
System.out.println("해당 역할의 사용자가 없습니다.");
}
단일 결과가 필요한 경우에는 List의 첫 번째 요소만 사용하거나 .stream().findFirst() 등으로 변환해 사용할 수 있습니다.
✅ 해결 방법 5: SQL에서 기본 값 설정 (보조 방법)
SQL 내부에서 기본 값을 지정하는 방식도 있습니다. 예를 들어, MySQL에서는 IFNULL 또는 COALESCE 함수를 사용할 수 있습니다. 하지만 이 방식은 데이터 자체가 null일 때만 의미가 있으며, 결과가 없을 때(null row) 는 여전히 Java 단에서의 처리가 필요합니다.
MyBatis에서 조회 결과가 없을 때 발생하는 NullPointerException은 사소하지만 자주 발생할 수 있는 문제입니다. 다음과 같은 방법들을 적절히 활용하면 안정적인 코드 작성이 가능합니다:
- null 여부 직접 체크
- Java 8+에서는 Optional<T> 사용
- 기본 객체 반환
- 리스트 기반 반환으로 null 방지
- 필요시 SQL에서 기본 값 설정
특히 협업 환경이나 대규모 프로젝트에서는 이러한 예외를 미리 방지하는 코딩 스타일이 유지보수성을 높이고, 안정성을 확보하는 데 큰 도움이 됩니다.
'스마트웹앱콘텐츠전문가 > JAVA' 카테고리의 다른 글
효율적인 Java 배열 처리법: null 값 처리와 배열 변환을 위한 코드 예시 (0) | 2025.04.17 |
---|---|
Java에서 배열 요소까지 검증하려면? 유효성 어노테이션 완전 분석 (0) | 2025.04.09 |
자바 롬복(Lombok) 이클립스 설정법과 활용 팁 (0) | 2025.03.14 |
자바 롬복(Lombok) 완벽 가이드: 애너테이션으로 코드 간소화하기 (0) | 2025.03.14 |
JPA EntityManager: 영속성 관리부터 트랜잭션까지 완벽 가이드 (0) | 2025.03.13 |