@Embedded 와 @Embeddable
@Embeddable 어노테이션은 별도의 클래스에 공통 속서을 정의하고 이를 값객체(Value Object)로 사용할 수 있게 만드는 어노테이션이다. 이 클래스는 다른 엔티티에 포함될 수 있다.
@Embedded 어노테이션은 @Embeddable로 정의된 객체를 엔티티에 포함시키는 어노테이션으로 포함된 객체는 부모 엔티티의 일부로 간주되며 독립적으로 관리되지 않는다.
주요 특징
- 재사용 가능
공통 속성을 별도로 분리해 여러 엔티티에서 재사용할 수 있다. - 부모 엔티티와 동일한 생명주기
포함된 객체는 독립적인 생명주기를 가지지 않고 부모 엔티티와 함께 관리된다. - 단일 테이블 매핑
포함된 객체의 속성을 독립적인 테이블이 아닌 부모 엔티티 테이블에 컬럼으로 추가된다.
예제 코드
프로젝트를 진행하던 코드로 작성을 했다.
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 테이블의 컬럼으로 매핑된다.
장점
- 코드 재사용성
Location 객체를 재사용이 가능하게 만들어 여러 엔티티에서 사용할 수 있다. - 가독성
논리적으로 그룹화된 값 객체를 활용하여 엔티티의 구조를 단순화할 수 있다. - 유연한 매핑
@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 |