스마트웹앱콘텐츠전문가/JAVA

MyBatis 조회 결과 null 예외 해결법: 안전한 select 처리 가이드

9D4U 2025. 4. 9. 16:55
728x90
반응형

MyBatis는 Java에서 많이 사용되는 ORM 프레임워크 중 하나로, SQL과 객체 간의 매핑을 효율적으로 처리해 줍니다.

하지만 select 쿼리를 사용할 때 조회 결과가 아예 없을 경우, 예상치 못한 NullPointerException이 발생할 수 있습니다. 이 글에서는 MyBatis에서 null 예외가 발생하는 원인과 이를 안전하게 처리하는 다양한 방법에 대해 알아봅니다.

 

 

 

img


📌 문제 상황: 조회 결과가 없는 경우 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에서 기본 값 설정

 

특히 협업 환경이나 대규모 프로젝트에서는 이러한 예외를 미리 방지하는 코딩 스타일이 유지보수성을 높이고, 안정성을 확보하는 데 큰 도움이 됩니다.

728x90