κΈ°λ³Έκ°’ νƒ€μž…


JPA 의 데이터 νƒ€μž… λΆ„λ₯˜

  • μ—”ν‹°ν‹° νƒ€μž…
    • @Entity 둜 μ •μ˜ν•˜λŠ” 객체
    • 데이터가 변해도 μ‹λ³„μžλ‘œ μ§€μ†ν•΄μ„œ 좔적 κ°€λŠ₯
    • 예) νšŒμ› μ—”ν‹°ν‹°μ˜ ν‚€λ‚˜ λ‚˜μ΄ 값을 변경해도 μ‹λ³„μžλ‘œ 인식 κ°€λŠ₯
  • κ°’ νƒ€μž…
    • int, Integer, String 처럼 λ‹¨μˆœνžˆ κ°’μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μžλ°” κΈ°λ³Έ νƒ€μž…μ΄λ‚˜ 객체
    • μ‹λ³„μžκ°€ μ—†κ³  κ°’λ§Œ μžˆμœΌλ―€λ‘œ λ³€κ²½ μ‹œ 좔적 λΆˆκ°€
    • 예) 숫자 100을 200으둜 λ³€κ²½ν•˜λ©΄ μ™„μ „νžˆ λ‹€λ₯Έ κ°’μœΌλ‘œ λŒ€μ²΄

κ°’ νƒ€μž… λΆ„λ₯˜

  • κΈ°λ³Έκ°’ νƒ€μž…
    • μžλ°” κΈ°λ³Έ νƒ€μž…
    • 래퍼 클래슀
    • String
  • μž„λ² λ””λ“œ νƒ€μž…
  • μ»¬λ ‰μ…˜ κ°’ νƒ€μž…

κΈ°λ³Έκ°’ νƒ€μž…

  • 예) String name, int age
  • 생λͺ…μ£ΌκΈ°λ₯Ό 엔티티에 의쑴
    • 예) νšŒμ›μ„ μ‚­μ œν•˜λ©΄ 이름, λ‚˜μ΄ ν•„λ“œλ„ ν•¨κ»˜ μ‚­μ œ
  • κ°’ νƒ€μž…μ€ κ³΅μœ ν•˜λ©΄ X
    • 예) νšŒμ› 이름 λ³€κ²½ μ‹œ λ‹€λ₯Έ νšŒμ›μ˜ 이름도 ν•¨κ»˜ λ³€κ²½λ˜λ©΄ μ•ˆλ¨

μž„λ² λ””λ“œ νƒ€μž… (μ€‘μš”)


μžλ°”μ—μ„œ μš°λ¦¬λŠ” μƒˆλ‘œμš΄ κ°’ νƒ€μž…μ„ 직접 μ •μ˜ν•  수 μžˆλ‹€. JPA λŠ” 이λ₯Ό μž„λ² λ””λ“œ νƒ€μž…μ΄λΌκ³  ν•œλ‹€. 주둜 κΈ°λ³Έ κ°’ νƒ€μž…μ„ λͺ¨μ•„μ„œ λ§Œλ“€μ–΄μ„œ 볡합 κ°’ νƒ€μž…μ΄λΌκ³ λ„ ν•œλ‹€. μ΄λ ‡κ²Œ λ§Œλ“€μ–΄μ§„ μž„λ² λ””λ“œ νƒ€μž…μ€ int String κ³Ό 같은 κ°’ νƒ€μž…μœΌλ‘œ μ·¨κΈ‰λœλ‹€.

μ˜ˆμ‹œ

νšŒμ› μ—”ν‹°ν‹°λŠ” 이름, 근무 μ‹œμž‘μΌ, 근무 μ’…λ£ŒμΌ, μ£Όμ†Œ λ„μ‹œ, μ£Όμ†Œ λ²ˆμ§€, μ£Όμ†Œ 우편 번호λ₯Ό 가진닀. 이λ₯Ό 좔상화 ν•˜λ©΄ β†’ νšŒμ› μ—”ν‹°ν‹°λŠ” 이름, 근무 κΈ°κ°„, 집 μ£Όμ†Œλ₯Ό 가진닀.

μž„λ² λ””λ“œ νƒ€μž… μ‚¬μš©λ²•

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Embedded
    private Period workPeriod;
    @Embedded
    private Address homeAddress;
}
  • @Embeddable κ°’ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 곳에 ν‘œμ‹œ
  • @Embedded κ°’ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 곳에 ν‘œμ‹œ
  • κΈ°λ³Έ μƒμ„±μž ν•„μˆ˜

μž„λ² λ””λ“œ νƒ€μž…μ˜ μž₯점

  • μž¬μ‚¬μš©
  • 높은 응집도
  • Period.isWork() 처럼 ν•΄λ‹Ή κ°’ νƒ€μž…λ§Œ μ‚¬μš©ν•˜λŠ” 의미 μžˆλŠ” λ©”μ„œλ“œλ₯Ό λ§Œλ“€ 수 있음
  • μž„λ² λ””λ“œ νƒ€μž…μ„ ν¬ν•¨ν•œ λͺ¨λ“  κ°’ νƒ€μž…μ€, κ°’ νƒ€μž…μ„ μ†Œμœ ν•œ 엔티티에 생λͺ…μ£ΌκΈ°λ₯Ό μ˜μ‘΄ν•¨

μž„λ² λ””λ“œ νƒ€μž…κ³Ό ν…Œμ΄λΈ” 맀핑

μž„λ² λ””λ“œ νƒ€μž…μ€ μ—”ν‹°ν‹°μ˜ 값일 뿐이닀. 즉, μž„λ² λ””λ“œ νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ° μ „κ³Ό 후에 λ§€ν•‘ν•˜λŠ” ν…Œμ΄λΈ”μ€ κ°™λ‹€. μž„λ² λ””λ“œ νƒ€μž…μ„ 톡해 객체와 ν…Œμ΄λΈ”μ„ μ•„μ£Ό μ„Έλ°€ν•˜κ²Œ(fine-grained) λ§€ν•‘ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€. λ•Œλ¬Έμ—, 잘 μ„€κ³„ν•œ ORM μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ§€ν•‘ν•œ ν…Œμ΄λΈ”μ˜ μˆ˜λ³΄λ‹€ 클래슀의 μˆ˜κ°€ 더 λ§Žλ‹€.

μž„λ² λ””λ“œ νƒ€μž…κ³Ό 연관관계

@AttributeOverride: 속성 μž¬μ •μ˜

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Embedded
    private Period workPeriod;
    @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;
}

ν•œ μ—”ν‹°ν‹°μ—μ„œ 같은 κ°’ νƒ€μž…μ„ μ‚¬μš©ν•œλ‹€λ©΄? 컬럼 λͺ…이 μ€‘λ³΅λ˜κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. @AttributeOverrides @AttributeOverride λ₯Ό μ‚¬μš©ν•΄μ„œ 컬럼 λͺ… 속성을 μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜μž.

μž„λ² λ””λ“œ νƒ€μž…κ³Ό null

μž„λ² λ””λ“œ νƒ€μž…μ˜ 값이 null 이면 λ§€ν•‘ν•œ 컬럼 값은 λͺ¨λ‘ null 이 λ“€μ–΄κ°„λ‹€.

κ°’ νƒ€μž…κ³Ό λΆˆλ³€ 객체


κ°’ νƒ€μž… 곡유 μ°Έμ‘°

μž„λ² λ””λ“œ νƒ€μž… 같은 κ°’ νƒ€μž…μ„ μ—¬λŸ¬ μ—”ν‹°ν‹°μ—μ„œ κ³΅μœ ν•˜λ©΄ 같은 μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— 변경에 λͺ¨λ‘ 영ν–₯을 받을 수 μžˆλŠ” λΆ€μž‘μš©μ΄ λ°œμƒν•  수 μžˆμ–΄ μœ„ν—˜ν•˜λ‹€.

κ°’ νƒ€μž… 볡사

κ°’ νƒ€μž…μ˜ μ‹€μ œ μΈμŠ€ν„΄μŠ€μΈ 값을 κ³΅μœ ν•˜λŠ” 것은 μœ„ν—˜ν•¨ν•˜κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€λ₯Ό λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

객체 νƒ€μž…μ˜ ν•œκ³„

int a = 10;
int b = a;
b = 4;
// a = 10, b = 4
Address a = new Address("Old");
Address b = a;
b.setCity("New");
// a = New, b = New

항상 값을 λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•˜λ©΄ 곡유 참쑰둜 인해 λ°œμƒν•˜λŠ” λΆ€μž‘μš©μ„ ν”Όν•  수 μžˆλ‹€. λ¬Έμ œλŠ” μž„λ² λ””λ“œ νƒ€μž…μ²˜λŸΌ 직접 μ •μ˜ν•œ κ°’ νƒ€μž…μ€ μžλ°”μ˜ κΈ°λ³Έ νƒ€μž…μ΄ μ•„λ‹ˆλΌ 객체 νƒ€μž…μ΄λ‹€. μžλ°” κΈ°λ³Έ νƒ€μž…μ— 값을 λŒ€μž…ν•˜λ©΄ 값을 λ³΅μ‚¬ν•œλ‹€. 객체 νƒ€μž…μ€ μ°Έμ‘° 값을 직접 λŒ€μž…ν•˜λŠ” 것을 막을 방법이 μ—†λ‹€. 즉, 객체의 곡유 μ°Έμ‘°λŠ” ν”Όν•  수 μ—†λ‹€.

λΆˆλ³€ 객체

객체 νƒ€μž…μ„ μˆ˜μ •ν•  수 μ—†κ²Œ λ§Œλ“€λ©΄ λΆ€μž‘μš©μ„ μ›μ²œ 차단할 수 μžˆλ‹€. λ•Œλ¬Έμ— κ°’ νƒ€μž…μ€ λΆˆλ³€ 객체둜 μ„€κ³„ν•΄μ•Όν•œλ‹€. μ—¬κΈ°μ„œ λΆˆλ³€ κ°μ²΄λŠ” 생성 이후 μ ˆλŒ€ 값을 λ³€κ²½ν•  수 μ—†λŠ” 객체λ₯Ό μ˜λ―Έν•œλ‹€.

κ°’ νƒ€μž…μ˜ 비ꡐ


// a 와 b λŠ” κ°™μ•„μ•Ό ν•œλ‹€
int a = 10;
int b = 10;
Address a = new Address("μ„œμšΈμ‹œ");
Address b = new Address("μ„œμšΈμ‹œ");

κ°’ νƒ€μž…μ€ μΈμŠ€ν„΄μŠ€κ°€ 달라도 κ·Έ μ•ˆμ— 값이 κ°™μœΌλ©΄ 같은 κ²ƒμœΌλ‘œ 봐야 ν•œλ‹€.

동일성 비ꡐ와 동등성 비ꡐ

동일성 λΉ„κ΅λŠ” μΈμŠ€ν„΄μŠ€μ˜ μ°Έμ‘° 값을 λΉ„κ΅ν•œλ‹€. (== μ‚¬μš©) 동등성 λΉ„κ΅λŠ” μΈμŠ€ν„΄μŠ€μ˜ 값을 λΉ„κ΅ν•œλ‹€. (equals() μ‚¬μš©) κ°’ νƒ€μž…μ€ a.equals(b) λ₯Ό μ‚¬μš©ν•΄μ„œ 동등성 비ꡐλ₯Ό μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€. κ°’ νƒ€μž…μ€ equals() λ©”μ„œλ“œλ₯Ό μ μ ˆν•˜κ²Œ μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. (주둜 λͺ¨λ“  ν•„λ“œλ₯Ό μ‚¬μš©)

κ°’ νƒ€μž… μ»¬λ ‰μ…˜ (μ€‘μš”)


@Entity
public class Member {
    @ElementCollection
    @CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID"))
    private Set<String> favoriteFoods = new HashSet<>();
    @ElementCollection
    @CollectionTable(name = "ADDRESS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
    private List<Address> addressHistory = new ArrayList<>();
}
Hibernate: 
    create table ADDRESS (
       MEMBER_ID bigint not null,
        city varchar(255),
        street varchar(255),
        zipcode varchar(255)
    )
Hibernate: 
    create table FAVORITE_FOOD (
       MEMBER_ID bigint not null,
        favoriteFoods varchar(255)
    )
Hibernate: 
    create table Member (
       id bigint generated by default as identity,
        city varchar(255),
        street varchar(255),
        zipcode varchar(255),
        name varchar(255),
        WORK_CITY varchar(255),
        WORK_STREET varchar(255),
        WORK_ZIPCODE varchar(255),
        endDate timestamp,
        startDate timestamp,
        primary key (id)
    )
Hibernate: 
    alter table ADDRESS 
       add constraint FKsuulxb5rmrxvb83yr43ox86wn 
       foreign key (MEMBER_ID) 
       references Member
Hibernate: 
    alter table FAVORITE_FOOD 
       add constraint FKjchfnr69biisfgjdpoe82rpa4 
       foreign key (MEMBER_ID) 
       references Member

κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ€ κ°’ νƒ€μž…μ„ ν•˜λ‚˜ 이상 μ €μž₯ν•  λ•Œ μ‚¬μš©ν•˜λ©°, @ElementCollection 와 @CollectionTable 을 μ‚¬μš©ν•˜μ—¬ DB 에 μ €μž₯ν•œλ‹€. DB λŠ” μ»¬λ ‰μ…˜μ„ 같은 ν…Œμ΄λΈ”μ— μ €μž₯ν•  수 μ—†κΈ° λ•Œλ¬Έμ—, μ»¬λ ‰μ…˜μ„ μ €μž₯ν•˜κΈ° μœ„ν•œ λ³„λ„μ˜ ν…Œμ΄λΈ”μ΄ ν•„μš”ν•˜λ‹€.

κ°’ νƒ€μž… μ»¬λ ‰μ…˜ μ €μž₯

Set<String> favoriteFood = Set.of("μΉ˜ν‚¨", "쑱발", "ν”Όμž");
List<Address> addressHistory = List.of(new Address("city1", "street1", "1000"), new Address("city1", "street2", "2000"));
Member member = new Member(null, "member1", favoriteFood, addressHistory);
em.persist(member);

ν•΄λ‹Ή μ½”λ“œλ₯Ό 싀행해보면 μ•„λž˜μ™€ 같은 쿼리λ₯Ό λ³Ό 수 μžˆλ‹€.

Hibernate: 
    /* insert hellojpa.Member
        */ insert 
        into
            Member
            (id, name) 
        values
            (null, ?)
Hibernate: 
    /* insert collection
        row hellojpa.Member.addressHistory */ insert 
        into
            ADDRESS
            (MEMBER_ID, city, street, zipcode) 
        values
            (?, ?, ?, ?)
Hibernate: 
    /* insert collection
        row hellojpa.Member.addressHistory */ insert 
        into
            ADDRESS
            (MEMBER_ID, city, street, zipcode) 
        values
            (?, ?, ?, ?)
Hibernate: 
    /* insert collection
        row hellojpa.Member.favoriteFoods */ insert 
        into
            FAVORITE_FOOD
            (MEMBER_ID, favoriteFoods) 
        values
            (?, ?)
Hibernate: 
    /* insert collection
        row hellojpa.Member.favoriteFoods */ insert 
        into
            FAVORITE_FOOD
            (MEMBER_ID, favoriteFoods) 
        values
            (?, ?)
Hibernate: 
    /* insert collection
        row hellojpa.Member.favoriteFoods */ insert 
        into
            FAVORITE_FOOD
            (MEMBER_ID, favoriteFoods) 
        values
            (?, ?)

μ—¬κΈ°μ„œ μ•Œ 수 μžˆλŠ” 사싀은 Member μ—”ν‹°ν‹°λ§Œ persist() ν–ˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  λͺ¨λ“  κ°’ νƒ€μž… μ»¬λ ‰μ…˜λ“€μ΄ μ €μž₯λ˜λŠ” 것을 μ•Œ 수 μžˆλ‹€. μ΄λŠ” κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ΄ λ‹€λ₯Έ ν…Œμ΄λΈ”μ— μ €μž₯ λ˜λ”λΌλ„ κ·Έλƒ₯ κ°’ νƒ€μž…κ³Ό λ‹€λ₯Ό λ°”κ°€ μ—†λ‹€λŠ” 의미이며 생λͺ…μ£ΌκΈ°λ₯Ό Member 엔티티와 λ™μΌν•˜κ²Œ κ°–λŠ”λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. 즉, List<Address> 도 사싀 String κ³Ό λ‹€λ₯Ό λ°”κ°€ μ—†λ‹€λŠ” 것이닀. κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ€ μ˜μ†μ„± 전이(Cascade All) + κ³ μ•„ 객체 제거 κΈ°λŠ₯을 ν•„μˆ˜λ‘œ 가진닀고 λ³Ό 수 μžˆλ‹€.

κ°’ νƒ€μž… μ»¬λ ‰μ…˜ 쑰회

em.flush();
em.clear();
Member findMember = em.find(Member.class, member.getId());
Hibernate: 
    select
        member0_.id as id1_6_0_,
        member0_.name as name2_6_0_ 
    from
        Member member0_ 
    where
        member0_.id=?

Member μ—”ν‹°ν‹° 쑰회 μ‹œ μœ„μ™€ 같은 쿼리λ₯Ό λ³Ό 수 μžˆλ‹€. 이λ₯Ό 톡해 κ°’ νƒ€μž… μ»¬λ ‰μ…˜λ„ 지연 λ‘œλ”© μ „λž΅μ΄ μ‚¬μš©λ˜κ³  μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. μ΄λŠ” @ElementCollection 에 fetch 의 κΈ°λ³Έ 섀정이 LAZY 둜 μ„€μ •λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ΄λ‹€.

κ°’ νƒ€μž… μ»¬λ ‰μ…˜ μˆ˜μ •

Member findMember = em.find(Member.class, member.getId());
findMember.getFavoriteFoods().remove("μΉ˜ν‚¨");
findMember.getFavoriteFoods().add("ν•œμ‹");
findMember.getAddressHistory().remove(new Address("city1", "street1", "1000"));
findMember.getAddressHistory().add(new Address("new", "new", "1111"));

κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ„ μˆ˜μ •ν•˜λŠ” μž‘μ—…μ„ μœ„μ™€ 같이 μ‹€ν–‰ν•΄λ³΄μž. Address 같은 경우 동등성 비ꡐλ₯Ό μœ„ν•΄ equals hashcode λ₯Ό κΌ­ μž¬μ •μ˜ ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

Hibernate: 
    /* delete collection hellojpa.Member.addressHistory */ delete 
        from
            ADDRESS 
        where
            MEMBER_ID=?
Hibernate: 
    /* insert collection
        row hellojpa.Member.addressHistory */ insert 
        into
            ADDRESS
            (MEMBER_ID, city, street, zipcode) 
        values
            (?, ?, ?, ?)
Hibernate: 
    /* insert collection
        row hellojpa.Member.addressHistory */ insert 
        into
            ADDRESS
            (MEMBER_ID, city, street, zipcode) 
        values
            (?, ?, ?, ?)
Hibernate: 
    /* delete collection row hellojpa.Member.favoriteFoods */ delete 
        from
            FAVORITE_FOOD 
        where
            MEMBER_ID=? 
            and favoriteFoods=?
Hibernate: 
    /* insert collection
        row hellojpa.Member.favoriteFoods */ insert 
        into
            FAVORITE_FOOD
            (MEMBER_ID, favoriteFoods) 
        values
            (?, ?)

μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ³  λ‚˜λ©΄ 이런 쿼리가 λ‚ μ•„κ°€λŠ” 것을 확인할 수 μžˆλ‹€. Address 의 경우 μš”μ†Œ ν•˜λ‚˜λ₯Ό μ œκ±°ν•˜κ³  ν•˜λ‚˜λ₯Ό μΆ”κ°€ν•˜λŠ” 쿼리λ₯Ό κΈ°λŒ€ν–ˆμ§€λ§Œ, λͺ¨λ“  ν…Œμ΄λΈ”μ„ 밀어버리고 두 개의 INSERT 쿼리문이 λ‚ μ•„κ°€λŠ” 것을 확인할 수 μžˆλ‹€.

κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ˜ μ œμ•½μ‚¬ν•­

κ°’ νƒ€μž…μ€ 엔티티와 λ‹€λ₯΄κ²Œ μ‹λ³„μž κ°œλ…μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, 값은 λ³€κ²½ν•˜λ©΄ 좔적이 μ–΄λ ΅λ‹€. λ•Œλ¬Έμ—, κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ— 변경이 λ°œμƒν•˜λ©΄ 주인 엔티티와 μ—°κ΄€λœ λͺ¨λ“  데이터λ₯Ό μ‚­μ œν•˜κ³ , κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ— μžˆλŠ” ν˜„μž¬ 값을 λͺ¨λ‘ λ‹€μ‹œ μ €μž₯ν•œλ‹€. κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ„ λ§€ν•‘ν•˜λŠ” ν…Œμ΄λΈ”μ€ λͺ¨λ“  μ»¬λŸΌμ„ λ¬Άμ–΄μ„œ κΈ°λ³Έ ν‚€λ₯Ό ꡬ성해야 ν•œλ‹€.

κ°’ νƒ€μž… μ»¬λ ‰μ…˜ λŒ€μ•ˆ

μ‹€λ¬΄μ—μ„œλŠ” 상황에 따라 κ°’ νƒ€μž… μ»¬λ ‰μ…˜ λŒ€μ‹ μ— μΌλŒ€λ‹€ 관계λ₯Ό κ³ λ €ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. μΌλŒ€λ‹€ 관계λ₯Ό μœ„ν•œ μ—”ν‹°ν‹°λ₯Ό λ§Œλ“€κ³ , μ—¬κΈ°μ—μ„œ κ°’ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 방식이닀. μ˜μ†μ„± 전이와 κ³ μ•„ 객체 제거λ₯Ό 톡해 κ°’ νƒ€μž… μ»¬λ ‰μ…˜ 처럼 μ‚¬μš©ν•œλ‹€.

@Entity
@Table(name = "ADDRESS")
public class AddressEntity {
    @Id
    @GeneratedValue
    private Long id;
    private Address address;
}

정리

  • μ—”ν‹°ν‹° νƒ€μž…μ˜ νŠΉμ§•
    • μ‹λ³„μžκ°€ μžˆλ‹€
    • 생λͺ… μ£ΌκΈ° 관리
    • κ³΅μœ ν•  수 μžˆλ‹€
  • κ°’ νƒ€μž…μ˜ νŠΉμ§•
    • μ‹λ³„μžκ°€ μ—†λ‹€
    • 생λͺ… μ£ΌκΈ°λ₯Ό 엔티티에 의쑴
    • κ³΅μœ ν•˜μ§€ μ•ŠλŠ” 것이 μ•ˆμ „ (λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©)
    • 즉, λΆˆλ³€ 객체둜 λ§Œλ“œλŠ” 것이 μ•ˆμ „
  • κ°’ νƒ€μž…μ€ 정말 κ°’ νƒ€μž…μ΄λΌ νŒλ‹¨λ  λ•Œλ§Œ μ‚¬μš©
  • 엔티티와 κ°’ νƒ€μž…μ„ ν˜Όλ™ν•΄μ„œ μ—”ν‹°ν‹°λ₯Ό κ°’ νƒ€μž…μœΌλ‘œ λ§Œλ“€λ©΄ μ•ˆλ¨
  • μ‹λ³„μžκ°€ ν•„μš”ν•˜κ³ , μ§€μ†ν•΄μ„œ 값을 좔적, λ³€κ²½ν•΄μ•Ό ν•œλ‹€λ©΄ μ—”ν‹°ν‹°λ‘œ κ΅¬μ„±ν•˜μž

μ‹€μ „ 예제 6 - κ°’ νƒ€μž… 맀핑