JPA에서 @Embeddable과 @EmbeddedId는 복합 키를 구현하기 위한 어노테이션
@Embeddable 어노테이션은 다른 엔티티의 속성으로 사용될 수 있는 클래스를 정의할 때 사용됨
이 어노테이션을 사용하면 해당 클래스를 다른 엔티티의 일부로 포함시킬 수 있음
@EmbeddedId 어노테이션은 @Embeddable 어노테이션이 적용된 클래스를 pk로 사용하기 위해 사용됨
복합 키를 구현하기 위한 어노테이션으로, 해당 어노테이션이 적용된 클래스의 인스턴스가 복합 키를 나타내는 값으로 사용됨
@EmbeddedId를 사용하여 복합 키를 구현하려면 복합 키를 나타내는 클래스에 @Embeddable 어노테이션을 적용하고 해당 클래스를 pk로 사용할 엔티티 클래스에 @EmbeddedId 어노테이션을 적용해야함
예제)
@Embeddable
public class EmployeeId implements Serializable {
private Integer empNo;
private String deptNo;
}
@Entity
public class Employee {
@EmbeddedId
private EmployeeId id;
private String name;
private String job;
}
Employee 엔티티에서 EmployeeId 클래스를 복합키로 사용하고 있음
EmployeeId 클래스에 @Embeddable 어노테이션이 적용되어 있고 Employee 엔티티에서는 @EmbeddedId 어노테이션이 적용된 id 속성으로 EmployeeId 클래스를 사용하고 있음
자바에서 제공하는 인터페이스 중 하나
객체의 상태를 byte stream으로 변환(직렬화, serialization)하거나 바이트 스트림에서 객체의 상태를 복원(역직렬화, deserialization)하는 기능을 제공한다.
자바에서 객체를 직렬화하면, 객체의 상태를 파일이나 네트워크 등에서 전송하거나 저장할 수 있게 된다. 이 때, 해당 객체의 클래스가 Serializable 인터페이스를 구현하고 있어야 한다.
예를 들어, 다음과 같이 Serializable 인터페이스를 구현한 클래스를 정의할 수 있다.
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
// ...
}
위 코드에서 Person 클래스는 Serializable 인터페이스를 구현하고 있다. 따라서 이 클래스의 인스턴스를 직렬화하거나 역직렬화할 수 있다.
Serializable 인터페이스를 구현한 클래스에서는 직렬화 가능한 필드들을 transient 예약어를 사용하여 표시할 수 있으며, 해당 필드는 직렬화 대상에서 제외된다. 또한, Serializable 인터페이스를 구현한 클래스의 필드에는 Serializable 인터페이스를 구현한 객체들만 할당할 수 있다. 그렇지 않으면 직렬화 과정에서 NotSerializableException이 발생할 수 있다.