@Entity
@Getter @Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member",cascade = CascadeType.REMOVE)
private List<Order> orders = new ArrayList<>();
private String loginId;
private String password;
@OneToMany(mappedBy = "member")
private List<LikedItem> likedItems = new ArrayList<>();
}
멤버에는 Address라는 주소 정보가 들어있고,
@Embeddable
@Getter
public class Address {
private String city;
private String street;
private String zipcode;
protected Address() {
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
}
주소는 도시, 거리와 코드 정보를 가지고 있다.
여기에서 @Embeddable 과 @Embedded는 무엇일까?
결론부터 말하면,
@Embeddable은 현재 클래스가 다른 엔티티의 내장될 수 있음을 명시한다.
@Embeddable을 가진 주소 엔티티는 다른 엔티티에서 사용될 수 있다는 것이다.
@Embedded는 @Embeddable로 지정된 클래스의 인스턴스를 현재 엔티티에 포함한다는 의미이다
이렇게 하면 Address 클래스의 필드들은 Member 엔티티의 필드로 취급되어 데이터베이스 테이블에 매핑된다.
왜 사용하는가?
1. 코드 재사용성
여러 엔티티에서 공통으로 사용하는 필드를 Address 클래스로 정의하면서 중복 코드를 줄일 수 있다.
또한 공통적인 데이터 구조가 하나의 클래스에 모여 있기 때문에 유지보수가 용이하다.
한 클래스만 수정하면 클래스를 사용하는 모든 엔티티가 자동으로 변경 사항을 반영하기 때문이다.
2. 엔티티 구조의 명확성
관련된 필드를 하나의 클래스로 그룹화 하여서 엔티티의 논리적인 구조를 더 명확하게 할 수 있다
또한 엔티티 클래스가 깔끔해지고, 가독성이 향상된다. 주소의 모든 필드를 맴버 클래스에 모두 포함시키지
.않고, 관련 있는 필드들을 클래스로 묶어 멤버 엔티티가 더 짧아지고 가독성이 좋아진다.
그럼 클래스로 구현하지 구지 @Embedded를 써야할까?
@Embbedded를 사용할 때의 장점
1. 자동 매핑
@Embeddable과 @Embedded를 사용하면 JPA 가 자동으로 이 클래스를 테이블의 필드로 매핑한다.
단순 클래스를 사용하면 이를 위해 별도의 매핑 코드를 작성해야 한다.
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="street", column=@Column(name="street")),
@AttributeOverride(name="city", column=@Column(name="city")),
@AttributeOverride(name="state", column=@Column(name="state")),
@AttributeOverride(name="zipCode", column=@Column(name="zip_code"))
})
private Address address;
위처럼 단순 클래스의 경우, 하나씩 필드에 매핑해주어야 한다.
2. SQL 생성
위 에노테이션을 사용하여 복합 값을 가진 필드를 처리할 때 필요한 SQL을 자동으로 생성해준다.
단순 클래스를 사용할 경우, 복합 값을 표현하기 위해 수동으로 SQL을 작성해야 할 수도 있다.
'프로젝트' 카테고리의 다른 글
[트러블 슈팅] cascade의 위험성.. (0) | 2025.01.11 |
---|---|
[트러블 슈팅] 복잡한 연관관계에서의 삭제 (0) | 2025.01.11 |
[트러블 슈팅] git pull fatal: Could not read from remote repository. (0) | 2025.01.03 |
[트러블 슈팅] 상속관계에서의 builder 패턴 (1) | 2025.01.03 |
[트러블 슈팅] 일대일 관계에서 save 순서 및 외래키 관리 org.hibernate.TransientObjectException: persistent instance references an unsaved transient instance of (1) | 2025.01.02 |