JPA 값 타입
값타입: JPA의 데이터 타입 분류
JPA의 데이터 타입 분류
- 엔티티 타입
- @Entity로 정의하는 객체
- 데이터가 변해도 식별자로 지속해서 추적 가능
- 값 타입
- int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
- 식별자가 없고 값만 있으므로 변경시 추적 불가
값 타입 분류
- 기본값 타입
- 자바 기본 타입(int,double)
- 래퍼 클래스 (Integer,Long)
- String
- 자바의 값 타입은 공유 해서는 안된다. (기본 값 타입은 공유가 되지 않는다)
- ex) int,double 과 같은 기본타입은 공유되지않음
- Integer 래퍼 클래스 String 특수클래스는 공유가능한 객체이지만 변경 X
int a=10; int b=a; a=20; System.out.println("a =" + a); //20 System.out.println("a =" + b); //10
- 임베디드 타입 (embedded type, 복합 값 타입)
- 새로운 값 타입을 직접 정의할 수 있음
- JPA는 임베디드 타입 이라 함
- 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
- 컬렉션 값 타입 (collection value type)
- 임베디드 타입(복합 값 타입)
- 임베디드 = 포함하다
- @Embeddable :데이터 베이스가 매핑하려는 필드가 포함된 JAVA 클래스를 정의하여 유형을 정의 할 수 있다.
- @Embedded : 를 사용하여 정의한 유형을 사용할 수 있다.
ex)
@Embeddable public class Address{ private String street; private String city; private String state; } @Entity public class Person{ @Id @GeneratedValue private Long id; private String name; @Embedded private Address address; }
- ㅇ임베디드 객체를 사용함으로서 코드의 간결함과 응집도를 가져갈 수 있다.
- 값 타입과 불변 객체
- 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험함
Address address = new Address("city", "street", "10"); Member member=new Member(); member.setUsername("member1"); member.setAddress(address); em.persist(member); Member member2=new Member(); member2.setUsername("member2"); member2.setAddress(address); em.persist(member2); member.getAddress().setCity("hi"); //member 객체와 member2 객체의 city값이 동시에 변경됨
Address address = new Address("city", "street", "10"); Member member=new Member(); member.setUsername("member1"); member.setAddress(address); em.persist(member); Address copyAdress = new Address(address.getCity(), address.getStreet(), address.getZipcode()); Member member2=new Member(); member2.setUsername("member2"); member2.setAddress(copyAdress); em.persist(member2); member.getAddress().setCity("hi");
- 객체 타입은 공유참조를 피할 수 없다. → 객체 자체를 수정하여 변경
Address address = new Address("city", "street", "10"); Member member=new Member(); member.setUsername("member1"); member.setAddress(address); em.persist(member); Address newAddress=new Address("city","street","1000"); member.setAddress(newAddress);
불변 객체
- 객체 타입을 수정할 수 없데 만들면 부작용을 원천차단
- 값 타입은 불변 객체로 설계
- 불변객체: 생성시점이후 값을 변경할수 없는 객체
- 값 타입의 비교
- 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야함
- 동일성 비교: == (인스턴스의 참조 값을 비교)
- 동등성 비교: equals() (인스턴스의 값을 비교)
- 값 타입 컬렉션