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 = "재정의할 이름"))
참고
'자바 > 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 |