๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JPA

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ] 6์žฅ ๋‹ค์–‘ํ•œ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘

by joaa 2023. 6. 18.

๐ŸŽˆ 6.1 ๋‹ค๋Œ€์ผ

 

6.1.1 ๋‹ค๋Œ€์ผ ๋‹จ๋ฐฉํ–ฅ
ํšŒ์›์€ Member.team์œผ๋กœ ํŒ€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํŒ€์—๋Š” ํšŒ์›์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์—†๋Š” ๋‹ค๋Œ€์ผ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„.

6.1.2 ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ
- ์–‘๋ฐฉํ–ฅ์€ ์™ธ๋ž˜ํ‚ค๊ฐ€ ์žˆ๋Š” ์ชฝ์ด ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ
- ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋Š” ํ•ญ์ƒ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•จ
- ํ•ญ์ƒ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์—ฐ๊ด€๊ด€๊ณ„ ํŽธ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ.



๐ŸŽˆ 6.2 ์ผ๋Œ€๋‹ค
6.2.1 ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ
ํ•˜๋‚˜์˜ ํŒ€์ด ์—ฌ๋Ÿฌ ํšŒ์›์„ ์ฐธ์กฐํ•˜๋Š”๋ฐ ํŒ€์€ ํšŒ์›์„ ์ฐธ์กฐํ•˜์ง€๋งŒ ํšŒ์›์€ ํŒ€์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ด€๊ณ„๊ฐ€ ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„.
์™ธ๋ž˜ ํ‚ค๋Š” ํ•ญ์ƒ ๋‹ค์ชฝ ํ…Œ์ด๋ธ”์— ์žˆ์œผ๋ฏ€๋กœ ๋ฐ˜๋Œ€ํŽธ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํŠน์ดํ•œ ๋ชจ์Šต์„ ๋‚˜ํƒ€๋ƒ„.
@Joincolomn์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด JPA๋Š” ์กฐ์ธ ํ…Œ์ด๋ธ” ์ „๋žต์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•จ.

๋‹จ์ ์€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ์–ด ์—”ํ‹ฐํ‹ฐ ์ €์žฅ๊ณผ ์—ฐ๊ด€๊ด€๊ณ„ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด UPDATE SQL์„ ์ถ”๊ฐ€๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•จ.

6.2.2 ์ผ๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ
์ผ๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘ ๋ฐ˜๋Œ€ํŽธ์— ๊ฐ™์€ ์™ธ๋ž˜ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋‚œ ๋‹ค๋Œ€์ผ ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๊ธด ํ•จ.



๐ŸŽˆ 6.3 ์ผ๋Œ€์ผ [1:1]
6.3.1 ์ฃผ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค
์ฃผ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š”๊ฒŒ JPA๊ฐ€ ๋” ํŽธํ•˜๊ฒŒ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Œ.

@Entity
public class Member{
    
    @Id@GeneratedValue
    @Column(name = โ€œMEMBER_IDโ€)
    private Long id;
    
    private String username;
    
    @OneToOne
    @JoinColumn(name = โ€œLOCKER_IDโ€)
    private Locker locker;
    
    โ€ฆ
}

@Entity
public class Locker {
    @Id @GeneratedValue
    @Column(name = โ€œLOCKER_IDโ€)
    private Long id;
    
    private String name;
    
    @OneToOne(mappedBy = โ€œlockerโ€)
    private Member member;
    โ€ฆ
}





6.3.2 ๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค
์ผ๋Œ€์ผ ๊ด€๊ณ„์—์„œ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š” ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘์€ ์€ jpa์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Œ. (๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์—†์Œ.)

@Entity
public class Member{
    
    @Id@GeneratedValue
    @Column(name = โ€œMEMBER_IDโ€)
    private Long id;
    
    private String username;
    
    @OneToOne(mappedBy = โ€œmemberโ€)
    private Locker locker;
    
    โ€ฆ
}

@Entity
public class Locker {
    @Id @GeneratedValue
    @Column(name = โ€œLOCKER_IDโ€)
    private Long id;
    
    private String name;
    
    @OneToOne
    @JoinColumn(name = โ€œMEMBER_IDโ€)
    private Member member;
    โ€ฆ
}





๐ŸŽˆ 6.4 ๋‹ค๋Œ€๋‹ค [N:N]
๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์€ ์ •๊ทœํ™”๋œ ํ…Œ์ด๋ธ” ๋‘ ๊ฐœ๋กœ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์–ด ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ์ผ๋Œ€๋‹ค, ๋‹ค๋Œ€์ผ ๊ด€๊ณ„๋กœ ํ’€์–ด๋‚ด๋Š” ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•จ.
์˜ˆ๋ฅผ ๋“ค์–ด ํšŒ์›๋“ค์€ ์ƒํ’ˆ๋“ค์„ ์ฃผ๋ฌธํ•˜๊ณ  ์ƒํ’ˆ๋“ค์€ ํšŒ์›๋“ค์— ์˜ํ•ด ๊ตฌ๋งค๋˜๋Š” ๊ด€๊ณ„.
๊ทธ๋Ÿฐ๋ฐ ๊ฐ์ฒด๋Š” ํ…Œ์ด๋ธ”๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ์ฒด 2๊ฐœ๋กœ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.
@ManyToMany ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Œ.


6.4.1 ๋‹ค๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ
@ManyToMany์™€ @JoinTable์„ ์‚ฌ์šฉํ•ด์„œ ํšŒ์›_์ƒํ’ˆ ์—”ํ‹ฐํ‹ฐ ์—†์ด ๋ฐ”๋กœ ๋งคํ•‘ํ•จ.


6.4.2 ๋‹ค๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ
๋‹ค๋Œ€๋‹ค ๋งคํ•‘์ด๋ฏ€๋กœ ์—ญ๋ฐฉํ–ฅ๋„ @ManyToMany๋ฅผ ์ด์šฉํ•˜๊ณ , ์–‘์ชฝ ์ค‘ ์›ํ•˜๋Š” ๊ณณ์— mappedBy๋กœ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ง€์ •ํ•จ.


6.4.3 ๋‹ค๋Œ€๋‹ค: ๋งคํ•‘์˜ ํ•œ๊ณ„์™€ ๊ทน๋ณต, ์—ฐ๊ฒฐ ์—”ํ‹ฐํ‹ฐ ์‚ฌ์šฉ
@ManyToMany๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Œ. ์ถ”๊ฐ€ํ•œ ์ปฌ๋Ÿผ๋“ค์„ ๋งคํ•‘ํ•˜๋ ค๋ฉด ์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ ๊ด€๊ณ„๋„ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„์ฒ˜๋Ÿผ ๋‹ค๋Œ€๋‹ค์—์„œ ์ผ๋Œ€๋‹ค, ๋‹ค๋Œ€์ผ ๊ด€๊ณ„๋กœ ํ’€์–ด์•ผํ•จ.
- ๋ณตํ•ฉ ๊ธฐ๋ณธ ํ‚ค: ํšŒ์›์ƒํ’ˆ ์—”ํ‹ฐํ‹ฐ๋Š” ๊ธฐ๋ณธ ํ‚ค๊ฐ€ MEMBER_ID์™€ PRODUCT_ID๋กœ ์ด๋ฃจ์–ด์ง„ ๋ณตํ•ฉ ๊ธฐ๋ณธ ํ‚ค์ด๋‹ค.
- ์‹๋ณ„ ๊ด€๊ณ„: ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋ฐ›์•„์„œ ์ž์‹ ์˜ ๊ธฐ๋ณธ ํ‚ค + ์™ธ๋ž˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐ๋ฒ  ์šฉ์–ด๋กœ ์‹๋ณ„ ๊ด€๊ณ„๋ผ๊ณ  ํ•œ๋‹ค.


6.4.4 ๋‹ค๋Œ€๋‹ค: ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ํ‚ค ์‚ฌ์šฉ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ธฐ๋ณธ ํ‚ค๋ฅผ Long ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ. ์‹๋ณ„ ๊ด€๊ณ„์— ๋ณตํ•ฉ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋งคํ•‘์ด ๋‹จ์ˆœํ•˜๊ณ  ์‰ฌ์›€.


6.4.5 ๋‹ค๋Œ€๋‹ค ์—ฐ๊ด€๊ด€๊ณ„ ์ •๋ฆฌ
์‹๋ณ„ ๊ด€๊ณ„: ๋ฐ›์•„์˜จ ์‹๋ณ„์ž๋ฅผ ๊ธฐ๋ณธ ํ‚ค + ์™ธ๋ž˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•จ
๋น„์‹๋ณ„ ๊ด€๊ณ„: ๋ฐ›์•„์˜จ ์‹๋ณ„์ž๋Š” ์™ธ๋ž˜ ํ‚ค๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์ƒˆ๋กœ์šด ์‹๋ณ„์ž๋ฅผ ์ถ”๊ฐ€ํ•จ.
๊ฐ์ฒด ์ž…์žฅ์—์„œ ๋‹ค ๋‹จ์ˆœํ•˜๊ณ  ํŽธ๋ฆฌํ•œ ๋น„์‹๋ณ„ ๊ด€๊ณ„๋ฅผ ์ถ”์ฒœํ•จ.