Spring
프록시 동등성 비교 - equals() 와 hashCode() 오버라이딩
주씨.
2024. 4. 28. 02:06
728x90
@Entity @Getter
public class Member{
@Id
private String id;
private String name;
@Override
public boolean equals(Object obj){
if (this == obj) return true;
if (!(obj instanceof Member)) return false; //-- 1
Member member = (Member) obj;
if (name != null ? !name.equals(member.getName())
: member.getName() != null) //-- 2
return false;
return true;
}
@Override
public int hashCode(){
return name != null ? name.hashCode() : 0;
}
}
-- 1
instanceof 가 아닌 == 로 동일성 비교를 해버리면, 결과가 다르다.
if (this.getClass() != obj.getClass()) return false;
프록시는 원본을 상속받은 자식 타입이므로 프록시의 타입을 비교할 때는 == 비교가 아닌 instanceof 를 사용해야 한다.
-- 2
member.name != null
프록시는 실제 데이터를 가지고 있지 않다.
따라서 프록시의 멤버변수에 직접 접근하면 아무 값도 조회할 수 없다.
프록시의 데이터를 조회할 때는 접근자(Getter) 를 사용해야 한다.