본문 바로가기
자바/Spring

JPA @Embedded, @Embeddable, @AttributeOveride, @AssociationOveride

by 샐리_ 2023. 10. 17.

PostgreSQL에서 Oracle로 마이그레이션 작업 진행 중 FK 중복으로 FK 컬럼명을 변경해야 하는데 @Embedded 어노테이션 사용으로 중복된 컬럼명을 변경하는 방법이 달랐다.

데이터베이스 마이그레이션 관련 작업 관련해서 정리한 글을 썼는데, 그 글에 이 내용까지 덧붙이게 되면 너무 길어지고 다양한 내용이 한 곳에 정리되어 더 복잡할 것 같아 따로 글을 쓰기로 하였다.

(PostgreSQL to Oracle migration 정리 -> https://hyo11.tistory.com/27)


@Embedded, @Embeddable

엔티티 내 일부 데이터를 하나의 객체로 묶어 보다 객체 지향적으로 설계할 수 있다.

예를 들어 회원 엔티티가 다음과 같다고 가정해 보자.

@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private String name;
    
    private String city;
    private String street;
    private String zipcode;
}

이때 도시, 도로명, 우편번호를 하나의 객체로 묶어 보다 객체지향적으로 설계할 수 있다. 이럴 때 사용하는 것이 @Embedded, @Embeddable이다.

임베디드 타입을 생성하기 위해 @Embeddable 어노테이션을 주소 클래스에 생성해 주고, member 객체에서 임베디드 타입으로 된 주소 객체를 @Embedded 어노테이션을 이용해서 사용한다.

@Embeddable
@Getter
public class Address {
    private String city;
    private String street;
    private String zipcode;
}

 

@Entity
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private String name;
    
    @Embedded
    private Address address;
}

정리해 보면 아래와 같다.

  • @Embeddable : 값 타입을 정의하는 곳에 표시
  • @Embedded : 값 타입을 사용하는 곳에 표시

임베디드 타입은 기본 생성자가 필수이다.(임베디드 타입이란 하이버네이트에서 임베디드 타입을 컴포넌트(components)라고 한다.)

이렇게 사용하는 이유는 코드의 재사용성과 높은 응집도에 있다.


@AssociationOverride

임베디드 타입의 엔티티 관계에 대한 매핑을 재정의 할 때는 @AssociationOveride를 사용한다.

사용방법은 아래와 같다.

@Embedded
@AssociationOverride(name = "name", JoinColumns = @JoinColumn(name = "column_name"), foreignKey = @ForeignKey(name = "재정의할 이름"))

 

@AttributeOverride

임베디드 타입의 기본 속성이나 필드, ID 속성이나 필드의 매핑을 재정의 할 때는 @AttributeOverride를 사용한다.

사용방법은 아래와 같다.

@Embedded
@AttributeOverride(name = "name", column = @Column(name = "재정의할 이름"))

 

참고

https://galid1.tistory.com/592

반응형

'자바 > Spring' 카테고리의 다른 글

Spring Batch ORA-08177 오류  (0) 2024.01.19
IntelliJ Cannot resolve symbol 에러  (0) 2023.10.20
@RequestMapping 경로 '/' 유무  (1) 2023.10.20
Spring과 Spring Boot의 차이  (3) 2023.10.17