프레임워크(Framework)/JPA

[JPA] 값 타입의 비교 - 값 타입 (3)

잇트루 2022. 12. 10. 22:21
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

Intro

JPA의 데이터 타입을 분류하면 엔티티 타입과 값 타입으로 구분할 수 있다.

 

엔티티 타입

  • @Entity로 정의하는 객체
  • 데이터가 변해도 식별자를 통해 지속해서 추적할 수 있다.
  • 예) 회원 엔티티의 키나 나이 등의 값을 변경해도 식별자로 인식 가능

 

값 타입

  • int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
  • 식별자가 없고 숫자나 문자 같은 속성만 있어 변경 시 추적이 불가능하다.
  • 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체

 

값 타입은 다음 3가지로 나눌 수 있다.

  • 기본값 타입 : 자바 기본 타입, 래퍼 클래스, String
    • 자바에서 제공하는 기본 데이터 타입

 

  • 임베디드 타입(Embedded type, 복합 값 타입) : 좌표, 포지션 등
    • JPA에서 사용자가 직접 정의한 값 타입

 

  • 컬렉션 값 타입(Collection value type) : 기본값 타입이나 임베디드 타입을 저장할 수 있는 것
    • 하나 이상의 값 타입을 저장할 때 사용

 

값 타입의 비교

값 타입 : 인스턴스가 달라도 그 안의 값이 같으면 같은 것으로 봐야 한다.

동일성(identity) 비교 : 인스턴스의 참조 값을 비교, == 사용

동등성(equivalence) 비교 : 인스턴스의 값을 비교, equals() 사용

 

동일성 비교

int a = 10;
int b = 10;
System.out.println("a == b = " + (a == b));

Address address1 = new Address("City", "street", "10000");
Address address2 = new Address("City", "street", "10000");
System.out.println("address1 == address2 = " + (address1 == address2));
a == b = true
address1 == address2 = false
  • address1과 address2는 인스턴스가 달라서 동일성 비교를 사용하면 false가 출력된다.

 

동등성 비교

Address address1 = new Address("City", "street", "10000");
Address address2 = new Address("City", "street", "10000");
System.out.println("address1 equals address2 = " + (address1.equals(address2));
address1 equals address2 = false
  • 값 타입은 a.equals(b)를 사용하여 동등성 비교를 해야 한다.
  • 하지만 위 코드의 경우 false를 반환하게 된다. (equals의 기본은 동일성 비교이기 때문)

따라서 값 타입의 equals() 메서드를 모든 필드에서 사용할 수 있도록 재정의(오버라이딩) 해야 한다.

 

equals() 메서드 오버라이딩

@Embeddable
public class Address {

    ...

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Address address = (Address) o;
        return Objects.equals(city, address.city) && Objects.equals(street, address.street) && Objects.equals(zipcode, address.zipcode);
    }

    @Override
    public int hashCode() {
        return Objects.hash(city, street, zipcode);
    }
}
  • equals 메서드 오버라이딩할 때는 hashCode() 메서드도 만들어서 자바 컬렉션에서 효율적으로 사용할 수 있도록 한다.
  • 인텔리 제이 환경에서 alt + insert 단축키를 활용하여 equals 메서드와 hashCode 메서드를 자동으로 만들 수 있다.
    • equals 메서드 오버라이딩은 최대한 자동으로 생성해 주는 것을 사용하는 것이 좋다.

 

오버라이딩 후 비교

Address address1 = new Address("City", "street", "10000");
Address address2 = new Address("City", "street", "10000");
System.out.println("address1 equals address2 = " + (address1.equals(address2)));
address1 equals address2 = true
반응형