
📝 기본값 타입
int a = 4;
long b = 5L;
Integer c = 4;
String d = "hello world";
자바 기본타입(int, double), 래퍼 클래스 (Integer, Long), String이 이에 해당하며 primitive type의 경우는 항상 값을 복사하고 래퍼클래스나 String같은 특수 클래스의 경우는 공유 가능한 객체이지만 불변이여서 기존 값을 변경할 수 없다.
📝 임베디드 타입
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
protected Address() {
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
@Embedded
private Address address;
protected Member() {
}
public Member(String name, Address address) {
this.name = name;
this.address = address;
}
}
일반적인 클래스를 의미하며 여러 값 타입들이 모여서 만들어진 타입이다.
@Embedded로 @Embeddable을 사용한 클래스를 주입할 수 있으며 Address는 테이블이 따로 만들어지지 않는다.
Member테이블에 필드로 들어가게 된다.
임베디드 타입을 사용하는 경우 재사용이 가능해지며 주소를 확인하는 등 의미 있는 메서드를 만들어서 재사용이 더욱 좋아진다.
여담으로 임베디드는 Entity는 아니지만 JPA와 관련있는 테이블형식의 느낌이기 때문에 protected를 사용해서 Entity를 만드는 방향과 동일하게 가는게 철학에 맞다. (기본생성자는 필수)
📝 불변 객체
String a = "hello";
a = a + " world";
한 번 만들어지면 내부 상태를 바꿀 수 없는 객체입니다. 위 코드는 변경하는 것이 아닌 새로운 객체가 만들어지는 것입니다.
String는 불변 객체로 되어있어서 공유 참조가 일어나도 문제가 없습니다.
int a = 10;
int b = a;//기본 타입은 값을 복사
b = 4;
기본 타입(primitive type)의 경우는 기본 타입 값을 복사하고 변경해도 주소를 참조하는 형태가 아니기 때문에 문제가 없다.
Address a = new Address(“Old”);
Address b = a; //객체 타입은 참조를 전달
b. setCity(“New”)
객체 타입의 경우는 얕은 참조가 일어나기 때문에 값 변경시 같이 영향을 받게 된다. 이걸 공유 참조라고 하는데 부작용 원천 차단을 위해 생성자로 생성만 할 수 있게하고 setter를 만들지 않게 해서 차단해야한다
📝 컬렉션 값 타입
@Entity
@Table(name = "member")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 값 타입 컬렉션
@ElementCollection
@CollectionTable(
name = "favorite_food",
joinColumns = @JoinColumn(name = "member_id")
)
@Column(name = "food_name")
private Set<String> favoriteFoods = new HashSet<>();
}
값타입 컬렉션이란 컬렉션 자료구조를 이용한 방법이라 하나의 테이블로 되지 않고 컬렉션을 저장하기 위한 별도 테이블이 필요하다.
@ElementCollection, @CollectionTable을 이용해 사용할 수 있지만 값타입 컬렉션에 변경 사항이 발생시 주인 엔티티와 관련된 모든 데이터를 삭제하고 값타입 컬렉션에 있는 현재값을 모두 다시 저장하기 때문에 사용을 지양하며 일대다 관계를 사용하는 게 좋다.
값타입 컬렉션의 경우는 영속성 전이(CASCADE) + 고아 객체 기능을 필수로 가지게 되기 때문에 일대다 관계를 사용 한 이후 같이 설정해줘서 동일하게 동작하도록 유도한다.
🔗 참고 및 출처
https://www.inflearn.com/course/ORM-JPA-Basic























