반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 세션vs쿠키
- 필터vs인터셉터
- @Controller
- 쿠키의 정의
- SpringMVC
- Validation
- 세션의 정의
- 세션이란
- n+1
- spring MVC
- 인터셉터의 정의
- MVC
- springSecurityFilterChain 오류
- 필터의 정의
- java.lang.AssertionError
- 유연한 컨트롤러1 - v5
- optional
- controller
- filter vs interceptor
- Testcode
- spring
- application-properties
- 김영한
- jpa
- BindingResult
- 401오류
- 구글 보안 api 활용
- .orelseThrow
- 쿠키란
- abap value in field Data Class error
Archives
- Today
- Total
ABAP DUMP ERROR 24시
Embedded 타입 본문
반응형
# 인프런 김영한의 자바 ORM 표준 JPA 프로그래밍 - 기본편을 개인적으로 정리한 글입니다.
정리
pirvate int age; 같은 코드는 봤는데
private Address address 처럼 Address 갖고 있는 애들은 뭘까?
=> Entity 이거나 임베디드 타입이야
Q : 임베디드 타입이 뭐야?
A : 같은 타입, 같은 성격을 띄는 필드 속성들을 묶어서 정의
// 치킨 이라는 임베디드안에 양념치킨,후라이드치킨,간장치킨을 속성을 정의한다.
Q : 임베디드 타입을 왜 사용해?
A :
1. 높은 재사용성
2. 높은 응집도
3. 객체와 테이블을 아주 세밀하게 매핑하는것이 가능
Q : 어떻게 사용해?
A : @Embeddable : 값 타임을 정의 한다. // 치킨이라는 class 가 @Embeddable을 갖고 있겠네
@Embedded : 값 타임을 사용하는 곳에 정의한다 // 치킨을 사용하는 class 에서 사용한다!
+ 기본 생성자는 필수로 생성해야해!
Q : 한 엔티티에게서 같은 값 타입을 사용하려면 어떻게 해야해?
A : @AttributeOverrides , @AttributeOverride 를 사용해서 컬럼명 속성을 재정의 해야해!
살펴보기
1. 기본값 타입 vs 임베디드 타입
기본값 타입 | 임베디드 타입 |
생명주기를 엔티티에 의존 (회원 삭제시 회원 이름, 나이, 주소등이 삭제된다) |
임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존한다. |
값 타입을 공유하면 안된다. (회원 이름 변경시 다른 회원의 이름이 변경된다) |
임베디드 Type도 int ,String 과 같은 값 타입이다. 즉 엔티티가 아니고 엔티티의 값일 뿐이다! |
새로운 값 타입을 직접 정의할 수 있다. 값인만큼 역시나 side Effect가 있을수 있으니 조심! |
Q : 임베디드 타입을 왜 사용해? (예시)
Member(table) |
id |
name |
startDate |
endDate |
city |
street |
zipcode |
처럼 몰아두는 것 보다
Member(Entity) | Member(table) |
id : Long | id |
name : String | name |
workPeriod : Period | workPeriod |
homeAddress : Address | homeAddress |
위와 같이 정의 해주는게 더 깔끔 하다!
Q : 어떻게 사용해?(예시)
다음과 같이 startDate 와 endDate를 Period로!
city, street,zipcode를 Address로 묶는다고 하면!
코드는
Period , Address class를 만들어 @Enbeddable 을 넣고
@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
public Period(){
}
}
@Embeddable
@Getter
@Setter
public class Address {
private String city;
private String street;
private String zipcode;
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
public Address() {
}
}
Member 에 @Embedded를 정의해서 사용한 것을 확인할수 있지!
@Entity
@Getter
@Setter
public class Member {
@Id@GeneratedValue
@Column(name = "member_id")
private Long id;
@Column(name = "username")
private String username;
//기간 Period
@Embedded
private Period workPeriod;
//주소
@Embedded
private Address homeAddress;
Q : 한 엔티티에게서 같은 값 타입을 사용하려면 어떻게 해야해?(예시)
public class Member {
@Id@GeneratedValue
@Column(name = "member_id")
private Long id;
@Column(name = "username")
private String username;
//기간 Period
@Embedded
private Period workPeriod;
//주소
@Embedded
private Address homeAddress;
private Address workAddress;
위처럼 Class내에 같은 임베디드 값 타입을 사용해서 재정의할수 없어!
@AttributeOverrides , @AttributeOverride 를 사용해서 컬럼명 속성을 재정의 해야해!
@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "city",
column=@Column(name = "work_city")),
@AttributeOverride(name = "street",
column = @Column(name = "work_street")),
@AttributeOverride(name = "zipcode",
column = @Column(name = "work_zipcode"))
})
private Address workAddress;
---------------------------------------------------------번외-----------------------------------------------------------------
반응형
'[WEB]Back-end > JPA' 카테고리의 다른 글
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 전략 (0) | 2022.01.21 |
---|---|
컬렉션 값 타입 (Collection value type)의 한계 (0) | 2022.01.20 |
영속성 전이 :CASCADE (0) | 2022.01.17 |
Proxy 어떻게 최적화해? (0) | 2022.01.14 |
JPA Proxy가 뭐야? 왜 사용해? (0) | 2022.01.13 |
Comments