Dev-Kyuu
article thumbnail
Published 2022. 12. 8. 02:21
JPA | 연관관계 πŸ“ JPA

πŸŒ€ Entity 맀핑 / κΈ°λ³Έν‚€ 맀핑

객체와 ν…Œμ΄λΈ” 맀핑 μ–΄λ…Έν…Œμ΄μ…˜ μ’…λ₯˜ 

 

@Entity

: JPAλ₯Ό μ‚¬μš©ν•˜μ—¬ ν…Œμ΄λΈ”κ³Ό 맀핑할 ν΄λž˜μŠ€μ— μž‘μ„±ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜

@Entity(name="Blog")
  • name : JPAμ—μ„œ μ‚¬μš©ν•  μ—”ν‹°ν‹° 이름을 지정(κΈ°λ³Έκ°’ = 클래슀 이름)
  • μ£Όμ˜μ‚¬ν•­ : final, enum, interface, inner ν΄λž˜μŠ€μ—λŠ” μ‚¬μš© λΆˆκ°€λŠ₯ν•˜λ‹€.

 

@Table 

: 엔티티와 맀핑할 ν…Œμ΄λΈ”μ„ μ§€μ •ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜

 

*) 데이터 베이슀 μŠ€ν‚€λ§ˆ μžλ™ 생성 : JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” κΈ°λŠ₯을 μ§€μ›ν•œλ‹€.

#application.properties

spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.show-sql=true

@Id

: Id μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 κΈ°λ³Έ ν‚€ 맀핑 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

: κΈ°λ³Έν‚€ 쑰건 ( not null, unique, κ°€λ³€κ°’ x)

: IDENTITYλ₯Ό μ‚¬μš©ν•˜λ©΄ κΈ°λ³Έ ν‚€ 생성을 λ°μ΄ν„°λ² μ΄μŠ€μ— μœ„μž„ν•˜μ—¬ μžλ™μƒμ„± ν•  수 μžˆλ‹€.

 

πŸ–‡ 연관관계 맀핑

N:1 (λ‹€λŒ€μΌ 연관관계)

- Member(n) : Team(1)을 ν•„λ“œλ‘œ κ°€μ§€λŠ” μ—°κ΄€ 관계

 

단방ν–₯

@Entity
public class Member {

    @Id
    @Column(name = "MEMBER_ID")
    private String id;

    private String username;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;

    public void setTeam(Team team) {
        this.team = team;
    }

    ...
}
@Entity
@Getter
public class Team {

    @Id
    @Column(name = "TEAM_ID")
    private String id;

    private String name;

    ...
}

μœ„ μ½”λ“œλ₯Ό 보면 Memberμ—μ„œ @manyToOne μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 Teamκ³Ό 단방ν–₯으둜 μ—°κ²°ν•œκ²ƒμ„ 확인 ν•  수 μžˆλ‹€.

Member → Team λ‹¨λ°©ν–₯ μ—°κ΄€κ΄€κ³„λ‘œ Memberμ—μ„œ Team을 μ‘°νšŒν• μˆ˜λŠ” μžˆμ§€λ§Œ, Teamμ—μ„œ Memberλ₯Ό μ‘°νšŒν•  μˆ˜λŠ” μ—†λ‹€.

 

@ManyToOne

: λ‹€λŒ€μΌκ΄€κ³„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 맀핑 μ •λ³΄λ‘œ, 연관관계 λ§€ν•‘μ‹œ λ‚˜νƒ€λ‚΄λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ„ ν•„μˆ˜λ‘œ μ‚¬μš©ν•œλ‹€.

: μ„€μ • μ˜΅μ…˜

- fetch(κΈ€λ‘œλ²Œ 페치 μ „λž΅ μ„€μ •) : ManyToOne의 기본값은 FetchType.EAGER(μ¦‰μ‹œλ‘œλ”©)

- cascade : μ˜μ†μ„± 전이 κΈ°λŠ₯ μ„€μ • (@OneToMany 일 경우 μ‚¬μš© ν•„μš”)

 

@JoinColumn(name = "TEAM_ID")

: μ™Έλž˜ν‚€ 맀핑 μ‹œ μ‚¬μš©, name속성에 맀핑 ν•  μ™Έλž˜ν‚€ 이름을 지정함

: Team ν΄λž˜μŠ€μ— ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ TEAM_IDλ₯Ό FKλ‘œν•˜μ—¬ 연관관계λ₯Ό 맺음

 

μ–‘λ°©ν–₯

Team → Member 둜 μ ‘κ·Όν•˜λŠ” 단방ν–₯ 관계λ₯Ό μΆ”κ°€ν•˜μ—¬ μ–‘λ°©ν–₯으둜 κ΅¬μ„±ν•œλ‹€.

μœ„μ—μ„œ μ„€μ •ν•΄λ‘” μ™Έλž˜ν‚€ ν•˜λ‚˜λ‘œ μ–‘λ°©ν–₯ μ‘°νšŒκ°€ κ°€λŠ₯ν•˜λ―€λ‘œ DB λ³€ν™”λŠ” μ—†κ³ , 객체의 λ§€ν•‘λ§Œ μΆ”κ°€ν•˜λ©΄ λœλ‹€.

 

@Entity
@Getter
public class Team {

    @Id
    @Column(name = "TEAM_ID")
    private String id;

    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();

}

@OneToMany

: μΌλŒ€λ‹€μ˜ 관계λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ§€ν•‘μ •λ³΄λ‘œ, μ–‘λ°©ν–₯ 일 λ•Œ mappedBy 속성을 μ§€μ •ν•˜μ—¬ μ—°κ²°ν•΄μ£Όμ–΄μ•Όν•œλ‹€.

 

 

⭐️ mappedByκ°€ 뭔데 μ–΄λ–¨λ•Œ μ“°λŠ”κ±΄λ°

: μ–‘λ°©ν–₯ 연관관계 맀핑 μ‹œ μ§€μΌœμ•Όν•  κ·œμΉ™ 쀑 두 ν…Œμ΄λΈ” 쀑 ν•˜λ‚˜λ₯Ό μ—°κ΄€κ΄€κ³„μ˜ λŒ€μž₯으둜 μ •ν•΄μ•Όν•œλ‹€.

: λŒ€μž₯은 μ™Έλž˜ν‚€λ₯Ό 관리 ν•˜λŠ” 주체(등둝, μˆ˜μ •, μ‚­μ œ)이고, λŒ€μž₯이 μ•„λ‹κ²½μš° 읽기만 ν•  수 μžˆλ‹€.

: μœ„μ—μ„œλŠ” νšŒμ› ν…Œμ΄λΈ”μ΄ μ™Έλž˜ν‚€λ₯Ό 가지고 μžˆμœΌλ―€λ‘œ, Teamμ—μ„œ mappedBy="team"속성을 μ‚¬μš©ν•˜μ—¬ λŒ€μž₯이 μ•„λ‹˜μ„ μ„€μ •ν•΄μ•Όν•œλ‹€.

 

 

 

πŸ”” CASCADE(μ˜μ†μ„± 전이)

: λΆ€λͺ¨ μ—”ν‹°ν‹°κ°€ μ˜μ†ν™” 될 λ•Œ, μžμ‹ 엔티티도 같이 μ˜μ†ν™” 되고 λΆ€λͺ¨ μ—”ν‹°ν‹°κ°€ μ‚­μ œλ  λ•Œ μžμ‹ 엔티티도 μ‚­μ œλ˜λŠ” λ“± 

: νŠΉμ • μ—”ν‹°ν‹°λ₯Ό μ˜μ† μƒνƒœλ‘œ λ§Œλ“€ λ•Œ μ—°κ΄€λœ 엔티티도 ν•¨κ»˜ μ˜μ† μƒνƒœλ‘œ μ „μ΄λ˜λŠ” 것을 μ˜λ―Έν•¨.

 

CascadeType.ALL: λͺ¨λ“  Cascadeλ₯Ό 적용
CascadeType.PERSIST: μ—”ν‹°ν‹°λ₯Ό μ˜μ†ν™”ν•  λ•Œ, μ—°κ΄€λœ 엔티티도 ν•¨κ»˜ μœ μ§€
CascadeType.MERGE: μ—”ν‹°ν‹° μƒνƒœλ₯Ό 병합(Merge)ν•  λ•Œ, μ—°κ΄€λœ 엔티티도 λͺ¨λ‘ 병합
CascadeType.REMOVE: μ—”ν‹°ν‹°λ₯Ό μ œκ±°ν•  λ•Œ, μ—°κ΄€λœ 엔티티도 λͺ¨λ‘ 제거
CascadeType.DETACH: λΆ€λͺ¨ μ—”ν‹°ν‹°λ₯Ό detach() μˆ˜ν–‰ν•˜λ©΄, μ—°κ΄€ 엔티티도 detach()μƒνƒœκ°€ λ˜μ–΄ λ³€κ²½ 반영 X CascadeType.REFRESH: μƒμœ„ μ—”ν‹°ν‹°λ₯Ό μƒˆλ‘œκ³ μΉ¨(Refresh)ν•  λ•Œ, μ—°κ΄€λœ 엔티티도 λͺ¨λ‘ μƒˆλ‘œκ³ μΉ¨

 

profile

Dev-Kyuu

@kyuu_ng

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!