임베디드 타입
- 임베디드 타입은 복합 값 타입으로 불리며, 새로운 값 타입을 직접 정의해서 사용하는 방법을 말한다.
- 도, 시, 구와 같이 주소 컬럼이 여러 개 있으면 객체지향적이지 않고, 응집력을 떨어트리게 된다.
- 이를 위해선 Address라는 클래스를 만들고 이 안에 도, 시 ,구 컬럼을 넣으면 된다.
@Embeddable
- 임베디드 타입을 만든 곳, 클래스 정의부 위에 써준다.
- 이 어노테이션이 붙은 클래스는 entity의 확장판이라고 보면 된다. 따라서 @Column, @OnetoMany와 같은 것들을 사용해도 무방하다.
- 폴더 구조로는 이 임베디드 타입이 쓰이는 엔티티 폴더 속 embeddable 폴더안에 넣으면 깔끔하다.
@Getter
@Embeddable
public class DateInfo {
@NotNull
@Column(name = "year")
private Integer year;
@Column(name = "month")
private Integer month;
@Column(name = "day")
private Integer day;
}
cf) 이에 대한 dto는 따로 만들지 않고 request에서 DateInfo를 통해 바인딩을 받고, entitiy에 바로 할당해주는 게 좋을 거 같다. 따라서 DateInfo 클래스 내에 validation 검사가 필요하면 유효성 검사에 대한 어노테이션을 바로 붙여준다.
@Embedded
- 임베디드 타입을 엔티티로 지정된 클래스안에 속성으로 넣어주고 그 위에 넣어줄 어노테이션이다.
- 임베디드 타입을 사용했을 때 엔티티의 컬럼은 임베디드 타입에 설정한 속성이다. 즉, 임베디드 타입이 임베디드 타입 안에 들어있는 속성으로 치환된다.
...
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Embedded
private DateInfo dateInfo;
/* dateInfo가 dateInfo 속성들로 치환됨
@Column(name = "year")
private Integer year;
@Column(name = "month")
private Integer month;
@Column(name = "day")
private Integer day;
*/
@Column(name = "title")
private String title;
@Column(name = "content")
private String content;
@Column(name = "start_day")
private LocalDateTime startDay;
...
주의 사항 : 임베디드 타입 자체를 null로 처리하고 저장하면 그 안에 들어있는 컬럼들이 모두 null로 저장된다.
'Spring Boot > JPA' 카테고리의 다른 글
JPA - Projections (0) | 2025.02.18 |
---|---|
Page 객체 응답 시 직렬화 변경 사항 (0) | 2024.12.04 |
entity 기본 생성자 in jpa (0) | 2024.10.11 |
일반 join + Dto 바로 반환 (feat. N+1 문제) (0) | 2024.09.01 |
사용자 정의 리포지토리 (0) | 2024.08.29 |