๐ŸŒป JAVA/์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ

8-3) ํ”„๋ก์‹œ์™€ ์—ฐ๊ด€๊ด€๊ณ„ ๊ด€๋ฆฌ - ์˜์†์„ฑ ์ „์ด(CASCADE), orphanremoval(๊ณ ์•„)

iseunghan 2020. 11. 23. 12:28
๋ฐ˜์‘ํ˜•

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

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

JPA๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ฑฐ๋‚˜, ์‹ค๋ฌด์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ€์กฑํ•˜์‹  ๋ถ„๋“ค์ด JPA์˜ ๊ธฐ๋ณธ ์ด๋ก ์„ ํƒ„ํƒ„ํ•˜๊ฒŒ ํ•™์Šตํ•ด์„œ ์ดˆ๋ณด์ž๋„ ์‹ค๋ฌด์—์„œ ์ž์‹ ์žˆ๊ฒŒ JPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธ‰ ์›น ๊ฐœ๋ฐœ ํ”„๋กœ๊ทธ๏ฟฝ

www.inflearn.com

 


 

์˜์†์„ฑ ์ „์ด : CASCADE

  • ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“ค ๋•Œ, ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ
    : ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์ €์žฅ.
  • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ, ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์˜์†ํ™”ํ•˜๋Š” ํŽธ๋ฆฌํ•จ์„ ์ œ๊ณตํ•จ
  • CASCADE ์˜ ์ข…๋ฅ˜
    • - ALL : ๋ชจ๋‘ ์ ์šฉ (๋ถ€๋ชจ lifeCycle์— ๋งž์ถฐ์•ผ ํ•  ๋•Œ)
      • ALL์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด 2๊ฐ€์ง€
        • parent์™€ child์˜ lifeCycle์ด ์œ ์‚ฌํ•  ๋•Œ! ( ๋“ฑ๋ก, ์ˆ˜์ • ์‚ญ์ œ ์‹œ์ ์ด ๊ฐ™์„ ๊ฒฝ์šฐ)
        • ๋‹จ์ผ ์†Œ์œ ์ž ์ผ๋•Œ! (parent๋งŒ child๋ฅผ ์†Œ์œ ํ•  ๋•Œ)
    • - PERSIST  : ์˜์† (์ €์žฅํ•  ๋•Œ๋งŒ ๋งž์ถฐ์•ผ ํ•  ๋•Œ)
    • - REMOVE : ์‚ญ์ œ

Parent(1) : Child(N)

 

CASCADE : PERSIST

@OneToMany(mappedBy = "parent" , cascade = CascadeType.PERSIST)
private List<Child> childList = new ArrayList<>();

์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด parent๋ฅผ persist๋ฅผ ํ•  ๊ฒฝ์šฐ์—, parent์— ์žˆ๋Š” child๊นŒ์ง€ persist๊ฐ€ ์ „์ด๊ฐ€ ๋œ๋‹ค.

Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

em.persist(parent); // -> CASCADE์˜ต์…˜ ๋•์— em.persist(child1) + em.persist(child2) ๊นŒ์ง€ ๋œ ์…ˆ์ด๋‹ค.

 

 

 

๊ณ ์•„ ๊ฐ์ฒด(orphanRemoval)

  • ๊ณ ์•„ ๊ฐ์ฒด ์ œ๊ฑฐ : ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ๋Š์–ด์ง„ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œ
  • @OneToOne , @OneToMany๋งŒ ๊ฐ€๋Šฅ
  • ๋ถ€๋ชจ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ์ž์‹๋„ ํ•จ๊ป˜ ์ œ๊ฑฐ! ( CascadeType.REMOVE ์™€ ์œ ์‚ฌํ•˜๋‹ค.)
  • ์ฐธ์กฐํ•˜๋Š” ๊ณณ์ด ํ•˜๋‚˜์ผ ๋•Œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ!
  • ํŠน์ • ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ฐœ์ธ ์†Œ์œ ํ•  ๋•Œ ์‚ฌ์šฉ

 

@Entity
public class Parent {
	
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanremoval = true)
    private List<Child> childList = new ArrayList<>();
    
    ...
    
    // ํŽธ์˜ ๋ฉ”์†Œ๋“œ ์ •์˜
    public void addChild(Child child) {
    	childList.add(child);
        child.setParent(this);
    }
}

 

public static void main(String[] args) {

	// ์•ž ๋ถ€๋ถ„ ์ƒ๋žต...
    
	Child child = new Child();

    Parent parent = new Parent();
    parent.addChild(child);

    em.persist(parent); // cascade๋กœ ์ธํ•ด childํ•จ๊ป˜ persist.

    em.flush();
    em.close();

    Parent findParent = em.find(Parent.class , parent.getId());
    findParent.getChildList().remove(0); // ์›๋ž˜๋Š” ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด ์•„๋‹Œ parent์—์„œ child๋ฅผ ์‚ญ์ œ ์‹œํ‚ค๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ cascade ์˜ต์…˜๊ณผ, orphanremoval๋กœ ์ธํ•ด ์ฃผ์ธ์ด ์•„๋‹Œ parent์—์„œ๋„ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.
//  em.remove(findParent); ์ด๋ ‡๊ฒŒ parent ์ž์ฒด๋ฅผ ์‚ญ์ œ์‹œ์ผœ๋„ orphanRemoval๊ฐ€ ์ž‘๋™ํ•œ๋‹ค!
}

 

 

์˜์†์„ฑ ์ „์ด + ๊ณ ์•„ ๊ฐ์ฒด, ์ƒ๋ช… ์ฃผ๊ธฐ

cascade = CascadeType.ALL + orphanRemoval = true

  • ๋‘ ์˜ต์…˜์„ ๋ชจ๋‘ ํ™œ์„ฑํ™” ํ•˜๋ฉด -> ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ†ตํ•ด์„œ ์ž์‹์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์Šค์Šค๋กœ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋Š” em.persist()๋กœ ์˜์†ํ™”, em.remove()๋กœ ์ œ๊ฑฐ

์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด ์•„๋‹Œ Parent์—์„œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ(Child)์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

  • CascadeType.ALL 
    • em.persist(parent) -> ์ž์‹ ์—”ํ‹ฐํ‹ฐ ํ•จ๊ป˜ ์ €์žฅ : em.persist(child) 
    • em.remove(parent) -> ์ž์‹ ์—”ํ‹ฐํ‹ฐ ํ•จ๊ป˜ ์‚ญ์ œ : em.remove(child)
  • orphanRemoval = true
    • findParent.getChileList().remove(0) -> ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ์ด ์•„๋‹ˆ๋”๋ผ๋„, ์ž์‹ ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ ๊ฐ€๋Šฅ
๋ฐ˜์‘ํ˜•