๐Ÿ๏ธ Spring

๐Ÿง ์˜์†์„ฑ ์ „์ด(CASCADE) ์–ด๋– ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†ํ™”(persist) ํ•  ๋•Œ, ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ์™€ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์˜์†ํ™”ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JPA๋Š” CASCADE ์˜ต์…˜์œผ๋กœ ์˜์†์„ฑ ์ „์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์˜์†์„ฑ์„ ์ „์ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ค๋ช…์„ ๋•๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. @Setter @Getter @Entity public class Parent { @Id @GeneratedValue @Column(name = "PARENT_ID") private Long id; @OneToMany(mappedBy = "parent") private List childList = new ArrayList(); } @Getter @Setter @Entity pu..
์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฆ‰์‹œ ๋กœ๋”ฉ JPA์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ์˜ ์กฐํšŒ ์‹œ์ ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰์‹œ ๋กœ๋”ฉ (EAGER LOADING) @XToX(fetch = FetchType.EAGER) ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ ๋กœ๋”ฉ (LAZY LOADING) @XToX(fetch = FetchType.LAZY) ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. (์‚ฌ์šฉ ์ „๊นŒ์ง€๋Š” ํ”„๋ก์‹œ๋กœ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.) ์ฆ‰์‹œ ๋กœ๋”ฉ์‹œ ์™ธ๋ถ€ ์กฐ์ธ(Left Outer Join)์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ  ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•  ๋•Œ, ์‹คํ–‰๋˜๋Š” SQL์ด ๋‚ด๋ถ€ ์กฐ์ธ(Inner Join)์ด ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ณ , ์™ธ๋ถ€ ์กฐ์ธ(Left Outer Join)์ด ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š”..
์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒ ์‹œ, ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋กœ ํ•จ๊ป˜ ์กฐํšŒํ•ด์™€์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•œ๋ฒˆ์— ๊ฐ™์ด ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊ฒƒ์ด๊ณ , ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์ผ์ด ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์กฐํšŒํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด ์„ฑ๋Šฅ์ƒ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. JPA์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ๋“ค์— ๋Œ€๋น„ํ•˜์—ฌ, ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ์ง€์—ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์ง€์—ฐ ๋กœ๋”ฉ(lazy loading)์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. EntityManager์˜ ๋‘๊ฐ€์ง€ ๋ฉ”์„œ๋“œ ํ”„๋ก์‹œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์ „์— EntityManger์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. find : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ์‹ค์ œ..
@AssocicationOverride @MappedSuperclass๋ฅผ ํ†ตํ•ด ์ƒ์† ๋ฐ›์€ ๊ฒฝ์šฐ๋‚˜ @Embedded๋ฅผ ํ†ตํ•ด ์ƒ์†๋ฐ›์€ ํ•„๋“œ ์ค‘, ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. @AssocicationOverride ํ˜น์€ @AssocicationOverrides๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. @AssociationOverride(name="๋ถ€๋ชจ ํ•„๋“œ๋ช…", joinColumns=@JoinColumn(name="์žฌ์ •์˜ํ•  FK ์ปฌ๋Ÿผ๋ช…")) @MappedSuperclass public class Employee { ... @ManyToOne protected Address address; ... } @Entity @AssociationOverride(name="addr..
์ž„๋ฒ ๋””๋“œ ํƒ€์ž…(๋ณตํ•ฉ ๊ฐ’ ํƒ€์ž…) ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ฐ’ ํƒ€์ž…์„ ์ง์ ‘ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. public Class Address { private String city; private String street; private String zipcode; } city์™€ street, zipcode๋ฅผ ๊ฐ€์ง€๋Š” Address๋ž€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์—”ํ‹ฐํ‹ฐ๋กœ ์‚ฌ์šฉํ•  ๋ชฉ์ ์ด ์•„๋‹Œ ๊ฐ’ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ JPA์—์„œ๋Š” ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…๋„ int, String๊ณผ ๊ฐ™์€ ๊ฐ’ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. @Embedded & @Embeddable ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์„ ํ•„๋“œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„๋“œ ์œ„์— @Embedded๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ’ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ..
@MappedSuperclass @MappedSuperclass๋Š” ์ƒ์†๊ด€๊ณ„ ๋งคํ•‘๊ณผ๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ๋Š” DB์˜ ์ƒ์†๊ด€๊ณ„ ๋งคํ•‘๊ณผ๋Š” ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ๋ณด๋Š” ๊ฒƒ์ด ์ข€ ๋” ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ ์‹œ๊ฐ„(createdDate)๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํด๋ž˜์Šค๋งˆ๋‹ค ์ง์ ‘ createdDate๋ผ๋Š” ํ•„๋“œ๋ฅผ ๋ถ™์—ฌ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ, createdDate๋ผ๋Š” ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ์ถ”์ƒ ํด๋ž˜์Šค(ํ˜น์€ ์ผ๋ฐ˜ ํด๋ž˜์Šค)๋ฅผ ๋งŒ๋“ค์–ด ์ด๋ฅผ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์ด ์ƒ์†๋ฐ›๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰ ์ด๋Š” ๊ณตํ†ต๋œ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์†์„ ๋ฐ›์€ ๊ฒƒ์ด์ง€, ๋ถ€๋ชจ์™€ ์ž์‹์˜ ๊ด€๊ณ„ ํ˜น์€ is-a ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†์„ ๋ฐ›์€ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. DB์ƒ์—์„œ๋Š” ๋ชจ๋“  ํ…Œ์ด๋ธ”์— createdDate๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ตฌ..
๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ๊ฐ์ฒด์ฒ˜๋Ÿผ ์ƒ์†์ด๋ผ๋Š” ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋‚˜๋งˆ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ๋Š” ์Šˆํผํƒ€์ž… ์„œ๋ธŒํƒ€์ž… ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. JPA์—์„œ๋Š” ๊ฐ์ฒด์˜ ์ƒ์† ๊ตฌ์กฐ๋ฅผ DB์˜ ์Šˆํผํƒ€์ž… - ์„œ๋ธŒํƒ€์ž… ๊ด€๊ณ„์— ๋งคํ•‘์‹œํ‚ต๋‹ˆ๋‹ค. ์Šˆํผํƒ€์ž… ์„œ๋ธŒํƒ€์ž… ๋ชจ๋ธ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 1. ๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ : ์กฐ์ธ ํ…Œ์ด๋ธ” ๋ถ€๋ชจ ํƒ€์ž…๊ณผ ์ž์‹ ํƒ€์ž…์„ ๋ชจ๋‘ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ดํ›„ ์ž์‹ ํƒ€์ž… ์กฐํšŒ ์‹œ ์กฐ์ธ์„ ํ†ตํ•ด ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” JPA์—์„œ ์กฐ์ธ ํ…Œ์ด๋ธ” ์ „๋žต์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 2. ํ†ตํ•ฉ ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ : ์‹ฑ๊ธ€ ํ…Œ์ด๋ธ” ํ…Œ์ด๋ธ”์„ ๋‹จ ํ•˜๋‚˜๋งŒ ๋งŒ๋“  ํ›„, ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ๋ถ€๋ชจ์˜ ์†์„ฑ๊ณผ ์ž์‹์˜ ์†์„ฑ์„ ๋ชจ๋‘ ํฌํ•จ์‹œ์ผœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” JPA์—์„œ๋Š” ๋‹จ์ผ ํ…Œ์ด๋ธ” ํ˜น์€ ์‹ฑ๊ธ€ ํ…Œ์ด๋ธ” ์ „๋žต์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 3. ์„œ๋ธŒํƒ€์ž… ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ : ๊ตฌํ˜„ ํด๋ž˜์Šค๋งˆ๋‹ค ํ…Œ์ด๋ธ”..
์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•  ๋•Œ๋Š” ๋‹ค์Œ์˜ 3๊ฐ€์ง€๋ฅผ ๊ณ ๋ คํ•ด์„œ ๋งคํ•‘ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ค‘์„ฑ (์ผ๋Œ€ ๋‹ค, ๋‹ค๋Œ€ ์ผ, ๋‹ค๋Œ€ ๋‹ค, ์ผ๋Œ€ ์ผ) ๋ฐฉํ–ฅ (์–‘๋ฐฉํ–ฅ, ๋‹จ๋ฐฉํ–ฅ) ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ ๐Ÿง ๋‹ค์ค‘์„ฑ ์—ฐ๊ด€๊ด€๊ณ„์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์ค‘์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋Œ€์ผ(N : 1)[ManyToOne] ์ผ๋Œ€๋‹ค(1 : N)[OneToMany] ์ผ๋Œ€์ผ(1 : 1)[OneToOne] ๋‹ค๋Œ€๋‹ค(N : N)[ManyToMany] ๐Ÿง ๋ฐฉํ–ฅ ๋ฐฉํ–ฅ์—๋Š” ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. DB ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ ํ‚ค(Foreign key)ํ•˜๋‚˜๋กœ ์กฐ์ธ(Join)์„ ์‚ฌ์šฉํ•ด์„œ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DB์—๋Š” ๋ฐฉํ–ฅ์˜ ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ, ์ฐธ์กฐ์šฉ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋งŒ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฉํ–ฅ์˜ ๊ฐœ๋…์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ๊ด€๊ณ„์—์„œ ํ•œ ์ชฝ๋งŒ ๋ฐ˜..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (18 Page)