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

[JPA] ๋ณตํ•ฉํ‚ค, ์™ธ๋ž˜ํ‚ค Entity ์„ค์ •ํ•˜๊ธฐ(@IdClass๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹๋ณ„๊ด€๊ณ„ ๋งคํ•‘)

by ynzu๐Ÿค 2021. 12. 23.
๋ฐ˜์‘ํ˜•

์˜ฌํ•ด ์ดˆ ๋ณตํ•ฉํ‚ค, ์™ธ๋ž˜ํ‚ค ์‚ฌ์šฉ์ด ๋งŽ์€ ํ…Œ์ด๋ธ”์„ JPA Entity๋กœ ๊ตฌํ˜„ํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ, JPA ์‚ฌ์šฉ์ด ์ฒ˜์Œ์ด์˜€์–ด์„œ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ๋ณต์žกํ•˜๊ฒŒ ๋Š๊ปด์กŒ์—ˆ๋‹ค. ๋‚˜๊ฐ™์€ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ •๋ฆฌํ•ด ๋ณธ๋‹ค!

๋ณตํ•ฉํ‚ค๋ฅผ pk๋กœ ์‚ฌ์šฉํ•œ ํ…Œ์ด๋ธ”์˜ pk๋ฅผ ์™ธ๋ž˜ํ‚ค๋กœ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ๋ณตํ•ฉํ‚ค ๋ชจ๋‘ ์ฐธ์กฐํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

 

Entity์— ๋ณตํ•ฉํ‚ค๋ฅผ ํ†ตํ•œ ์‹๋ณ„๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ @IdClass, @EmbededId ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๋ณธ์ธ์€ @IdClass๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

@EmbededId๋Š” @IdClass ๋ฐฉ์‹ ๋ณด๋‹ค ์ข€๋” ๊ฐ์ฒด์ง€ํ–ฅ ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ํŠน์ • ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ๊นŠ๊ฒŒ ํƒ์ƒ‰ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ณ , ๊นŠ์ด ๊ฐ์ถฐ์ ธ ์žˆ์–ด์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๊ณ ..

์˜ˆ๋ฅผ ๋“ค์–ด grandChild Entity์—์„œ parent_id๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„  ์•„๋ž˜์™€ ๊ฐ™์ด ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค.

grandChild.getGId().getCId().getPId().getParentId();

IdClass๋“ค์ด ์ค‘์ฒฉ๊ตฌ์กฐ๋กœ ๊ฒน๊ฒน์ด ์Œ“์—ฌ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

@IdClass ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

grandChid.getChild().getParent().getParentId();

 

@IdClass ๋ฐฉ์‹๊ณผ @EmbededId ๋ฐฉ์‹์€ depth๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์ฐจ์ด๋‚˜์ง€ ์•Š์ง€๋งŒ @IdClass ๋ฐฉ์‹์€ IdClass๊ฐ€ ์ค‘์ฒฉ๊ตฌ์กฐ๋กœ ์Œ“์—ฌ์ง€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ Entity๊ฐ€ ์ค‘์ฒฉ๊ตฌ์กฐ๋กœ ์Œ“์—ฌ์ ธ์„œ ๋ช…์‹œ์ ์ธ ๋ฉด์—์„œ ๋” ๋‚˜์•„๋ณด์ด๋Š” ๋“ฏ?!

(๋‹จ์ˆœํ•œ ํ•˜๋‚˜์˜ ๋ณตํ•ฉํ‚ค๋งŒ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•˜๋ฉด @EmbededId ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ณตํ•ฉํ‚ค๋ฅผ ํ†ตํ•œ ์‹๋ณ„๊ด€๊ณ„ ๋งคํ•‘์ด ์—ฌ๊ธฐ์ €๊ธฐ ์กด์žฌํ•œ๋‹ค๋ฉด @IdClass๋ฅผ ์ด์šฉํ•˜๋ผ๊ณ  ๊ถŒํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ)

 

 

์•„๋ž˜๋Š” @IdClass๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Entity๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ ์ž ํ–ˆ๋‹ค.

 

Parent

  • Parent Entity
@ToString
@Entity
@Table(name = "PARENT")
public class Parent {

    @Id
    @Column(name = "PARENT_ID", columnDefinition ="VARCHAR(36)", nullable = false)
    private String parentId;

    @Column(name = "PARENT_NAME", columnDefinition ="VARCHAR(32)", nullable = false)
    private String parentName;

}

parent๋Š” ํŠน๋ณ„ํžˆ ์ถ”๊ฐ€๋กœ ์„ธํŒ…ํ•ด์ฃผ๋Š”๊ฒƒ์ด ์—†๋‹ค

 

Child

  • Child Entity
@ToString
@Entity
@IdClass(ChildId.class)
@Table(name = "CHILD")
public class Child {
	
	@Id
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name="PARENT_ID", columnDefinition ="VARCHAR(36)", nullable = false)
    public Parent parent;
	
    @Id
    @Column(name = "CHILD_ID", columnDefinition ="VARCHAR(36)", nullable = false)
    private String childId;
	

    @Column(name = "CHILD_NAME", columnDefinition ="VARCHAR(64)", nullable = false)
    private String childName;

}

 

  • ChildId.class
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Getter
@Setter
public class ChildId implements Serializable {

    private String parent;
    private String childId;

}

 

GrandChild

  • GrandChild Entity
@Entity
@ToString
@Table(name = "GRANDCHILD")
@IdClass(GrandChildId.class)
public class GrandChild {

    @Id
    @Column(name = "GRAND_CHILD_ID", columnDefinition ="VARCHAR(36)")
    private String grandChildId;

  
    @Id
    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "PARENT_ID", columnDefinition ="VARCHAR(36)", referencedColumnName = "PARENT_ID"),
            @JoinColumn(name = "CHILD_ID", columnDefinition ="VARCHAR(36)", referencedColumnName = "CHILD_ID")
    })
    private Child child;

    @Column(name = "GRAND_CHILD_NAME", columnDefinition ="VARCHAR(64)", nullable = false)
    private String grandChildName;
    
 }

 

  • GrandChildId.class
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Getter
@Setter
public class GrandChildId implements Serializable {

    private ChildId child;
    private String grandChildId;
}

 

 

์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ

 

Legacy DB์˜ JPA Entity Mapping (๋ณตํ•ฉํ‚ค ๋งคํ•‘ ํŽธ) | ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ

{{item.name}} ์•ˆ๋…•ํ•˜์„ธ์š”. ์šฐ์•„ํ•œํ˜•์ œ๋“ค์—์„œ ๋ฐฐ๋‹ฌ์˜๋ฏผ์กฑ ์„œ๋น„์Šค์˜ ๊ด‘๊ณ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์„ ์ ์ง„์ ์œผ๋กœ Spring Boot / JPA ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๊ด€ํ•˜๋ฉด์„œ ๊ฒฝํ—˜ํ–ˆ๋˜ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

techblog.woowahan.com

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€