![[스프링부트 #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=3840&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