복합키, 직렬화

keep_going·2023년 4월 11일

지식저장

목록 보기
7/11
  • 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 클래스를 사용하고 있음


  • 위에서 Serializable이란

자바에서 제공하는 인터페이스 중 하나
객체의 상태를 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이 발생할 수 있다.

profile
keep going

0개의 댓글