Spring JPA[DataType-2]
값 타임 공유 참조
저번 포스터에서는 값 타입에 대해 다뤘습니다.
하지만 값 타임을 공유하는 상황에서는 큰 부작용이 존재합니다.
임베디드 타임 같은 값 타임을 만약에 여러 엔티티에서 공유하면 부작용이 발생해서 위험합니다.
또한, 값 타입의 실제 인스턴스인 값을 공유하는것 또한 위험합니다.
예를 들어서 하나의 임베디드 타입값을 공유하고 있다고 생각 해보겠습니다.
1
2
3
4
5
6
7
@Embeddable
public class Address {
private String city;
private String zipCode;
}
위의 임베디드 클래스를, A, B 2개의 클래스에 공유를 하고 있습니다.
근데 A 클래스에서 Address의 값을 바꿔버리면, B 클래스 또한 공유를 받고 있기 때문에 B클래스의 Address의 값이 바껴버리는 문제가 발생합니다.
즉 데이터 일관성이 깨져버리는 것입니다. 이를 예방하기 위해서는 대신 값을 복사해서 사용하는것이 좋습니다.
하지만 값을 복사해서 사용하는 경우에도 한계가 존재합니다
객체 타입 한계
임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입입니다.
자바 기본타입은 값을 대입하면 값을 복사하지만, 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없습니다.
그래서, 객체타입을 수정할 수 없게 만들어버리면 부작용을 원천 차단할 수 있습니다.
값 타입은 불변객체로 설계해야합니다.
- 불변 객체 : Integer, String
즉, 생성자로만 값을 수정하고, 수정자(Setter)를 만들지 않으면 됩니다.
값 타입 비교
동일성 비교
인스턴스의 참조값을 비교할 때 사용되며, ==를 사용하면 됩니다.
동등성 비교
인스턴스의 값을 비교 할 때 사용되며, equals()를 사용 합니다.
결론
엔티티 타입과 값 타입은 JPA에서 사용되는 두 가지 주요 데이터 타입입니다.
엔티티 타입의 특징:
- 엔티티는 식별자(ID)를 가지고 있으며, 데이터베이스에서 고유하게 식별됩니다.
- 엔티티는 자체적인 생명 주기를 가지며, 데이터베이스에서 저장, 조회, 수정, 삭제될 수 있습니다.
- 여러 엔티티가 동일한 데이터를 공유할 수 있습니다.
값 타입의 특징:
- 값 타입은 식별자(ID)를 가지지 않습니다. 따라서 데이터베이스에서 고유하게 식별되지 않습니다.
- 값 타입의 생명 주기는 엔티티에 의존합니다. 즉, 값 타입은 엔티티와 함께 생성되고 삭제됩니다.
- 값 타입은 공유하지 않는 것이 안전하며, 보통 복사해서 사용하는 것이 권장됩니다.
- 값 타입은 불변 객체로 설계하는 것이 안전하며, 값 타입은 정말 값으로 취급되고 추적되어야 할 때만 사용되어야 합니다.
따라서, 엔티티와 값 타입을 혼동하여 사용하거나 엔티티를 값 타입으로 만드는 것은 지양해야 합니다.
값 타입은 주로 식별자가 필요 없고, 지속적으로 값이 변경되거나 추적되지 않아야 할 때 사용되며, 엔티티는 식별자가 필요하고 지속적으로 값을 추적하고 변경해야 할 때 사용됩니다.