Spring/Spring JPA ๊ธฐ๋ณธ

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 11. ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… / ๊ฐ’ ํƒ€์ž…

hello_u 2023. 3. 3. 20:23

 

์ž„๋ฒ ๋””๋“œ ํƒ€์ž…

 

 

 

ํšŒ์› ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋‹ค. 

 

 

( ๊ทผ๋ฌด ์‹œ์ž‘์ผ๊ณผ ๊ทผ๋ฌด ์ข…๋ฃŒ์ผ )

private LocalDateTime startDate;
private LocalDateTime endDate;

 

( ๋„์‹œ , ๋ฒˆ์ง€ , ์šฐํŽธ๋ฒˆํ˜ธ ) 

private String city;
private String street;
private String zipcode;

 

์ด ์ •๋ณด๋“ค์€ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ?

 

๊ณตํ†ต์œผ๋กœ ํด๋ž˜์Šค ํƒ€์ž…์„ ๋งŒ๋“ค์–ด์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

 

 

 

 

๊ณตํ†ต์œผ๋กœ ๋ฌถ์–ด์„œ , ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์„œ ์ด์šฉ

 

 

 

์ž„๋ฒ ๋””๋“œ ํƒ€์ž… ์‚ฌ์šฉ๋ฒ•

 

(๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์ˆ˜)

 

@Embeddable
public class Period {
@Embeddable
public class Address {

 

@Embeddable : ๊ฐ’ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๊ณณ์— ํ‘œ์‹œํ•œ๋‹ค. 

 

 

@Entity
public class Member {

    @Embedded
    private Period workPeriod;

    @Embedded
    private Address homeAddress;

 

@Embedded : ๊ฐ’ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์— ํ‘œ์‹œํ•œ๋‹ค.

 

 

 

์ž„๋ฒ ๋””๋“œ ํƒ€์ž…๊ณผ ํ…Œ์ด๋ธ” ๋งคํ•‘

 

์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์ผ ๋ฟ์ด๋‹ค. 

 

์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „๊ณผ ํ›„์— ๋งคํ•‘ํ•˜๋Š” ํ…Œ์ด๋ธ”์€ ๊ฐ™๋‹ค.

 

 

์ •๋ฆฌ

 

์ƒˆ๋กœ์šด ๊ฐ’ ํƒ€์ž…์„ ์ง์ ‘ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์‹œ์Šคํ…œ์—์„œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ๊ฐ’ ํƒ€์ž…์ด๋‹ค. 

 

์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์„ ํฌํ•จํ•œ ๋ชจ๋“  ๊ฐ’ ํƒ€์ž…์€ , ๊ฐ’ ํƒ€์ž…์„ ์†Œ์œ ํ•œ ์—”ํ‹ฐํ‹ฐ์— ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์˜์กดํ•œ๋‹ค. 

 

๊ฐ’ ํƒ€์ž…์€ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ๋  ๋•Œ ๊ฐ’์ด ๋“ค์–ด์˜ค๊ณ  ์ฃฝ์„ ๋•Œ ์ฃฝ๋Š”๋‹ค . 

 

 

 

@AttributeOverride

@Embedded
private Address homeAddress;

@Embedded
private Address workAddress;

 

ํ•œ ์—”ํ‹ฐํ‹ฐ์—์„œ ๊ฐ™์€ ๊ฐ’ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๋ณต ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค . 

 

 

 

@AttributeOverrides, @AttributeOverride๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ปฌ๋Ÿฌ ๋ช… ์†์„ฑ์„ ์žฌ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

 

๊ฐ’ ํƒ€์ž… ๊ณต์œ  ์ฐธ์กฐ

Address address = new Address("city", "street", "10000");

Member member = new Member();
member.setName("member1");
member.setHomeAddress(address);
em.persist(member);

Member member2 = new Member();
member2.setName("member2");
member2.setHomeAddress(address);
em.persist(member2);

 

member1 ๊ณผ member2 ๋Š” ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์ธ address ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค. 

 

 

member2.getHomeAddress().setCity("newCity");

 

member2 ์˜ ์ฃผ์†Œ city ๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค .

 

 

๊ฐ’ ํƒ€์ž…์˜ ์‹ค์ œ ์ธ์Šคํ„ด์Šค์ธ ๊ฐ’์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ์–ด์„œ member1 ๊ณผ member2  ๋ชจ๋‘ city ๊ฐ’์ด ๋ฐ”๋€๋‹ค. 

 

 

 

 

์ž๋ฐ” ๊ธฐ๋ณธ ํƒ€์ž…์—์„œ๋Š” ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋ฉด ๊ฐ’์„ ๋ณต์‚ฌํ•œ๋‹ค . 

 

 

 

ํ•˜์ง€๋งŒ ๊ฐ์ฒด ํƒ€์ž…์—์„œ๋Š” ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. 

 

b.setCity("New") : a ์™€ b ๋‘˜๋‹ค  ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค . 

 

b ์—์„œ ๋ฐ”๊ฟ”๋ฒ„๋ฆฌ๋ฉด ๋‘˜๋‹ค ๊ฒฐ๋ก ์ ์œผ๋กœ ๋ฐ”๋€๋‹ค. 

 

 

 

๋ถˆ๋ณ€ ๊ฐ์ฒด

 

๊ฐ์ฒด ํƒ€์ž…์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค์–ด์„œ ๋ถ€์ž‘์šฉ์„ ์›์ฒœ ์ฐจ๋‹จํ•ด์•ผ ํ•œ๋‹ค. 

 

๊ฐ’ ํƒ€์ž…์€ ๋ถˆ๋ณ€ ๊ฐ์ฒด(immutable object)๋กœ ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค.

 

๋ถˆ๋ณ€ ๊ฐ์ฒด : ์ƒ์„ฑ ์‹œ์  ์ดํ›„ ์ ˆ๋Œ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด์ด๋‹ค.

 

์ƒ์„ฑ์ž๋กœ๋งŒ ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ์ˆ˜์ •์ž(Setter)๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉด ๋œ๋‹ค. 

 

 

 

 

๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜

 

๊ฐ’ ํƒ€์ž…์„ ํ•˜๋‚˜ ์ด์ƒ ์ €์žฅํ•  ๋•Œ ๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ปฌ๋ ‰์…˜์„ ๊ฐ™์€ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. 

 

์ปฌ๋ ‰์…˜์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•˜๋‹ค. 

 

 

@ElementCollection
@CollectionTable(name = "ADDRESS")
private List<Address> addressHistory = new ArrayList<>();

 

@ElementCollection

 

๊ฐ’ ํƒ€์ž… ์ปฌ๋ ˆ์…˜์„ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 

 

RDB์—๋Š” ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ปด๋Ÿผ์— ์ €์žฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—,

 

๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์—ฌ ์ปฌ๋ ‰์…˜์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋•Œ ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ž„์„ JPA์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜

 

 

 

@CollectionTable

 

@ElementCollection ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค. 

 

@CollectionTable์€ ๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜์„ ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ง€์ •ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜์˜ ์ œ์•ฝ์‚ฌํ•ญ

 

๊ฐ’ ํƒ€์ž…์€ ์—”ํ‹ฐํ‹ฐ์™€ ๋‹ค๋ฅด๊ฒŒ ์‹๋ณ„์ž ๊ฐœ๋…์ด ์—†๋‹ค. 

 

๊ทธ๋ž˜์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ถ”์ ์ด ์–ด๋ ต๋‹ค. 

 

๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋ฉด, ์ฃผ์ธ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ณ 

 

๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜์— ์žˆ๋Š” ํ˜„์žฌ ๊ฐ’์„ ๋ชจ๋‘ ๋‹ค์‹œ ์ €์žฅํ•œ๋‹ค.

 

๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜์„ ๋งคํ•‘ํ•˜๋Š” ํ…Œ์ด๋ธ”์€ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ๋ฌถ์–ด์„œ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค. 

 

 

 

 ์ •๋ฆฌ

 

์—”ํ‹ฐํ‹ฐ ํƒ€์ž…์˜ ํŠน์ง•

  1. ์‹๋ณ„์ž O
  2. ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ 
  3. ๊ณต์œ  

 

๊ฐ’ ํƒ€์ž…์˜ ํŠน์ง•

  1. ์‹๋ณ„์ž X
  2. ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์—”ํ‹ฐํ‹ฐ์— ์˜์กดํ•œ๋‹ค. 
  3. ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค ( ์–ด์ฉ” ์ˆ˜ ์—†์ด ๊ณต์œ ํ•œ๋‹ค๋ฉด ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉ)
  4. ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๋งŒ๋“œ๋Š”๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

 

 

๊ฐ’ ํƒ€์ž…์€ ์ •๋ง ๊ฐ’ ํƒ€์ž…์ด๋ผ ํŒ๋‹จ๋  ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.


์—”ํ‹ฐํ‹ฐ์™€ ๊ฐ’ ํƒ€์ž…์„ ํ˜ผ๋™ํ•ด์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ’ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๋ฉด ์•ˆ๋œ๋‹ค.

 

์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•˜๊ณ , ์ง€์†ํ•ด์„œ ๊ฐ’์„ ์ถ”์ , ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ ์€ ๊ฐ’ ํƒ€์ž…์ด ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ์ด๋‹ค. 

 

 

 

 

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

 

 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

JPA๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ฑฐ๋‚˜, ์‹ค๋ฌด์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ€์กฑํ•˜์‹  ๋ถ„๋“ค์ด JPA์˜ ๊ธฐ๋ณธ ์ด๋ก ์„ ํƒ„ํƒ„ํ•˜๊ฒŒ ํ•™์Šตํ•ด์„œ ์ดˆ๋ณด์ž๋„ ์‹ค๋ฌด์—์„œ ์ž์‹ ์žˆ๊ฒŒ JPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ

www.inflearn.com