대외활동 기록/NEXTERS 15th

[Spring] 자바 직렬화 Serializable (+JPA Entity)

칸타탓 2019. 8. 3. 18:25

* 오류 발생

  • Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Composite-id class must implement Serializable

    public class MissionHistory implements Serializable {
        private static final long serialVersionUID = 1L;
    
        @Id
        @Column(name="mission_id")
        private long missionId;
    
        @Id
        @Column(name="user_id")
        private long userId;
    
        @Column
        private int time;
    
        @Column
        private LocalDateTime updated;
    }
  • JPA로 Entity를 설계하던 중 위와 같은 오류 발생

  • 기본키를 복수로 지정해주었더니 직렬화를 해야만한다는 메세지 발생 => 복합키를 사용했기 때문

  • 다른 Entity와 연관되어있는 Entity는 Serializable을 구현해야 한다고 한다.

 

* JPA에서 복합키를 구현하는 방법은?

  • Entity에는 보통 @Id를 하나만 사용한다.
  • BUT, 복합키로 이뤄져 있을 때는 아래를 고려하여 설계해야 한다.
  • @Embeddable, @IdClass 두개를 사용하여 복합키를 설정한다.
    • @EmbededId@IdClass 방식 보다 좀더 객체지향 방식
  • @EmbeddedId 를 이용하여 엔티티를 설계할 때에는 Serializable 인터페이스를 구현한 클래스를 선언하고 필드에 복합키로 사용되는 컬럼을 선언하면 된다.

 

* 코드 수정

  • 위 코드를 @IdClass를 사용해서 아래와 같이 수정했다.
  @NoArgsConstructor
  @Table(name="`mission_consumption_history`")
  @Getter
  @Entity
  @IdClass(MissionHistoryId.class)
  public class MissionHistory {
      @Id
      private long missionId;

      @Id
      private long userId;

      @Column
      private int time;

      @Column
      private LocalDateTime updated;
  }
  public class MissionHistoryId implements Serializable {
      private static final long serialVersionUID = 1L;

      @Column(name="mission_id")
      private long missionId;

      @Column(name="user_id")
      private long userId;
  }

 

* 직렬화란?

  • 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술
  • 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)

 

* 사용 이유

  • 자바 직렬화 형태의 데이터 교환은 자바 시스템 간의 데이터 교환을 위해서 존재한다.

  • 자바 직렬화는 자바 시스템에서 개발에 최적화되어 있다.


참고한 곳

http://woowabros.github.io/experience/2017/10/17/java-serialize.html

http://woowabros.github.io/experience/2019/01/04/composit-key-jpa.html

'대외활동 기록 > NEXTERS 15th' 카테고리의 다른 글

[JPA] SQL Mapper와 ORM  (0) 2019.07.28
[JPA] OneToMany, ManyToMany 관계 설정하기  (0) 2019.07.28