반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
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
반응형
'프레임워크(Framework) > JPA' 카테고리의 다른 글
[JPA] 엔티티(Entity) 설계 시 주의사항 (1) | 2022.12.12 |
---|---|
[JPA] 값 타입 컬렉션 - 값 타입 (4) (0) | 2022.12.11 |
[JPA] 값 타입과 불변 객체 - 값 타입 (2) (0) | 2022.12.09 |
[JPA] 기본값 타입과 임베디드 타입 - 값 타입 (1) (0) | 2022.12.08 |
[JPA] 영속성 전이(CASCADE)와 고아 객체 (0) | 2022.12.07 |