![[스프링부트 #18] JPA 매핑 클래스 비교 시 주의사항](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%255B%25EC%258A%25A4%25ED%2594%2584%25EB%25A7%2581%25EB%25B6%2580%25ED%258A%25B8%2B%252318%255D%2BJPA%2B%25EB%25A7%25A4%25ED%2595%2591%2B%25ED%2581%25B4%25EB%259E%2598%25EC%258A%25A4%2B%25EB%25B9%2584%25EA%25B5%2590%2B%25EC%258B%259C%2B%25EC%25A3%25BC%25EC%259D%2598%25EC%2582%25AC%25ED%2595%25AD%26tag%3DTemplate%2B1%26description%3D%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%252323ec86%26bgEndColor%3D%252323ec86%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3D%26blogTitle%3DGyeongwon%2527s%2Bblog&w=2048&q=75)
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