Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

임베디드 타입 본문

인프런/[인프런] 자바ORM 표준 JPA 프로그래밍

임베디드 타입

Seung__ 2021. 8. 12. 23:07

1. 임베디드 타입


  • 새로운 값 타입을 직접 정의할 수 있음
  • JPA는 embedded type이라고 함
  • 주로 기본 값 타입을 "모아서" 만들기 때문에 복합 값 타입이라고 함.
  • int String과 같은 값 타입임!

 

 

2. 예시


  • 회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주소 도시, 주소 번지, 주소 우편번호를 가진다.

  • 흠.. 공통적인 요소들이 있는데... 묶어보자.
  • 회원 엔티티는 이름, 근무기간, 주소를 가진다. 

  • 이처럼 묶어낼 수 있는게 임베디드 타입임.
  • Member의 구성
    • 즉, Period, Address라는 클래스를 생성해서 값 타입으로 씀

3. 임베디드 타입 사용 방법


  • @Embeddable : 값 타입을 정의하는 곳에 사용
  • @Embedded : 값 타입을 사용하는 곳에 표시
  • 기본생성자 필수~~

 

 

 

4. 임베디드 타입의 장점


  • 재사용이 좋음
  • 높은 응집도
  • Period.isWork()처럼 해당 값 타임만 사용하는 의미있는 메서드를 만들 수도 있음 . 
  • 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함.

 

 

 

5. 임베디드 타입과 테이블 매핑


  • 임베디드 타입을 쓰든 안쓰든 테이블에서는 바뀌는게 없어
  • 단지 매핑만 좀 달라짐 ㅋㅋㅋ
  • 임베디드 타입은 엔티티의 값일 뿐!! 그냥 값임!
  • 임베디드 타입을 사용하기 전 후 매핑하는 테이블은 같음
  • 객체와 테이블을 아주 세밀하게(find-grained)매핑하는 것이 가능
  • 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수 보다 클래스의 수가 더 많음. ㄷ

 

6. 예시


  • Address
    @Embeddable
    public class Address {
    
        private String city;
        private String street;
        private String zipcode;
    
        public Address() {
        }
    
        public Address(String city, String street, String zipcode) {
            this.city = city;
            this.street = street;
            this.zipcode = zipcode;
        }
     }​
  • Period
    @Embeddable
    public class Period {
    
        //기간
        private LocalDateTime startDate;
        private LocalDateTime endDate;
    
        public Period() {
        }
    
    }​
  • Member
    @Entity
    public class Member {
    
        //기간
        @Embedded
        private Period period;
        //주소
        @Embedded
        private Address address;
        
    }​
  • Test
Member member = new Member();
member.setUserName("a");
member.setAddress(new Address("city", "street", "321654"));
member.setPeriod(new Period());

em.persist(member);

tx.commit();​

 

 

 

7. 임베디드 타입과 연관관계


  • 임베디드는 임베디드를 가질 수 있음.
  • 임베디드가 엔티티를 가질 수 있음....? FK만 들고 있으면됨 ㅋㅋㅋㅋ 쌉가능
    • @Embeddable
      public class Address {
      
          private String city;
          private String street;
          private String zipcode;
          
          //임베디드는 엔티티를 가질 수 있음.
          private Member member;
          
      }

 

 

 

8. @AttributeOverride : 속성 재정의


  • 한 엔티티에서 같은 값 타입을 여러 번 사용하면..?
  • 컬럼 명이 중복됨...ㅠㅠ
  • @AttributeOverrides, @AttributeOverride를 사용해서 컬럼명 속성을 재 정의가능.

 요렇게 중복되게 쓰면 어떻게 될까?

//주소
@Embedded
private Address address;
//주소
@Embedded
private Address homeAddress;​

예외 터진다 ㅋㅋㅋㅋㅋㅋ

.MappingException: Could not determine type for: hellojpa.Member, at table: Member, for columns: [org.hibernate.mapping.Column(member)]
  • @AttributeOverride 쓰자!
    • 임베디드의 각 항목에 대해서 column 명을 별도로 지정하면된다.
          @Embedded
          @AttributeOverrides({
                  @AttributeOverride(name = "city", column = @Column(name = "HOME_CITY")),
                  @AttributeOverride(name = "street", column = @Column(name = "HOME_STREET")),
                  @AttributeOverride(name = "zipcode", column = @Column(name = "HOME_ZIPCODE"))
          })
          private Address homeAddress;​
    • Hibernate: 
          /* insert hellojpa.Member
              */ insert 
              into
                  Member
                  (city, street, zipcode, HOME_CITY, HOME_STREET, HOME_ZIPCODE, endDate, startDate, TEAM_ID, USERNAME, MEMBER_ID) 
              values
                  (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

 

 

 

9. 임베디드 타입과 null


  • 임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null

 

10. GitHub : 210812 Embedded Type


 

GitHub - bsh6463/JPA

Contribute to bsh6463/JPA development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글

값 타입 비교  (0) 2021.08.13
값 타입과 불변 객체  (0) 2021.08.13
기본 값 타입  (0) 2021.08.12
[예제] 연관관계 관리  (0) 2021.08.12
영속성 전이(CASCADE),고아 객체  (0) 2021.08.12
Comments