프로젝트

@Eembbed, @Embeddable 이 무엇일까?

매일_공부 2024. 6. 14. 16:31
반응형
@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을 작성해야 할 수도 있다.

 

 

 

 

 

반응형