[스프링부트 #18] JPA 매핑 클래스 비교 시 주의사항

도경원's avatar
Aug 25, 2025
[스프링부트 #18] JPA 매핑 클래스 비교 시 주의사항
Integer== 쓰면 안 된다

1. 왜 문제인가?

  • Integer, Long 같은 Wrapper 타입은 기본형(int, long)이 아니라 객체다.
  • == 연산자는 값이 아닌 참조(주소)를 비교한다.
  • 즉, 값이 같아도 서로 다른 객체면 == 결과는 false.

2. 대표적인 함정

Integer a = 1000; Integer b = 1000; System.out.println(a == b); // false — 참조가 다름 System.out.println(a.equals(b)); // true — 값이 같음
== 연산자는 100초중반 이상 부터 false가 난다.

3. JPA 매핑 엔티티에서 더 위험한 이유

  • 엔티티의 식별자(id) 필드는 보통 Long 또는 Integer로 선언한다.
  • 연관관계 매핑에서 id 비교 시 ==를 쓰면, 같은 PK임에도 불구하고 비교 실패 가능.
  • 실무에서 조회, 권한 체크, equals/hashCode 구현 시 치명적 버그로 이어질 수 있다.

4. 안전한 비교 방법

if (member.getId().equals(loginUserId)) { // 같은 회원임 }
  • 무조건 equals() 사용
  • null 가능성이 있으면 Objects.equals(a, b) 사용 추천
    • if (Objects.equals(member.getId(), loginUserId)) { // 안전한 null 비교까지 포함 }
정리하자면 Wrapper 타입은 절대 ==로 비교하면 안된다. 매핑 클래스의 식별자 비교 시 equals() 또는 Objects.equals() 필수다. 작은 값에서 ==가 맞게 나오는 거에 속지말자.
Share article

Gyeongwon's blog