본문 바로가기
TIL(Today I Learned)

2024.12.23 Today I Learned

by 승환파크 2024. 12. 23.

@Embedded 와 @Embeddable

@Embeddable 어노테이션은 별도의 클래스에 공통 속서을 정의하고 이를 값객체(Value Object)로 사용할 수 있게 만드는 어노테이션이다. 이 클래스는 다른 엔티티에 포함될 수 있다.

 

@Embedded 어노테이션은 @Embeddable로 정의된 객체를 엔티티에 포함시키는 어노테이션으로 포함된 객체는 부모 엔티티의 일부로 간주되며 독립적으로 관리되지 않는다.

 

주요 특징

  1. 재사용 가능
    공통 속성을 별도로 분리해 여러 엔티티에서 재사용할 수 있다.
  2. 부모 엔티티와 동일한 생명주기
    포함된 객체는 독립적인 생명주기를 가지지 않고 부모 엔티티와 함께 관리된다.
  3. 단일 테이블 매핑
    포함된 객체의 속성을 독립적인 테이블이 아닌 부모 엔티티 테이블에 컬럼으로 추가된다.

예제 코드

프로젝트를 진행하던 코드로 작성을 했다.

1. Location 클래스 

Location 클래스는 위도와 경도 정보를 담고있으며, @Embeddable 로 정의해 다른 엔티티에서 재사용이 가능하도록 설계하였다.

@Embeddable
@Getter
@Setter
@ToString
public class Location {
    private double latitude;  // 위도
    private double longitude; // 경도
}

 

2. Feed 클래스

Feed 클래스는 게시글 정보를 관리하는 클래스로 여러 컬럼을 포함함과 동시에 Location 객체를 함께 포함한다.

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Entity
@Table(name = "Feed")
public class Feed {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String postId; // 게시글 ID

    @Column(length = 50, nullable = false)
    private String userid;  // 사용자 ID

    @Column(nullable = false)
    private String content; // 게시글 내용

    @Embedded // Location 객체 포함
    private Location location;

    @Column(nullable = false)
    private LocalDateTime time; // 게시글 생성 시간
}

 

이렇게 작성하면 Location 객체의 필드인 latitude 와 longitued 는 Feed 테이블의 컬럼으로 매핑된다.

 

장점

  1. 코드 재사용성
    Location 객체를 재사용이 가능하게 만들어 여러 엔티티에서 사용할 수 있다.
  2. 가독성
    논리적으로 그룹화된 값 객체를 활용하여 엔티티의 구조를 단순화할 수 있다.
  3. 유연한 매핑
    @Embedded 와 @AttributeOverrides를 조합하면 컬럼 이름을 유연하게 재정의 할 수 있다.

 

JPA의 @Embedded 와 @Embeddable 은 반복적인 속성 매핑을 간단하게 처리하고, 재사용 가능한 값 객체를 통해 코드의 유지보수성을 크게 향상시킬 수 있다. 특히 Location 과 같이 공통적으로 사용되는 정보를 객체로 정의하여 재사용하면 코드의 가독성과 생산성을 높일 수 있다는 장점이 존재한다.

'TIL(Today I Learned)' 카테고리의 다른 글

2025.01.01 Today I Learned  (0) 2025.01.01
2024.12.24 Today I Learned  (0) 2024.12.23
2024.12.19 Today I Learned  (2) 2024.12.19
2024.12.17 Today I Learned  (3) 2024.12.17
2024.10.13 Today I Learned  (1) 2024.10.13