๐Ÿ๏ธ Spring/JPA

์ž„๋ฒ ๋””๋“œ ํƒ€์ž…(๋ณตํ•ฉ ๊ฐ’ ํƒ€์ž…) ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ฐ’ ํƒ€์ž…์„ ์ง์ ‘ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 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์—๋Š” ๋ฐฉํ–ฅ์˜ ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ, ์ฐธ์กฐ์šฉ ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋งŒ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฉํ–ฅ์˜ ๊ฐœ๋…์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ๊ด€๊ณ„์—์„œ ํ•œ ์ชฝ๋งŒ ๋ฐ˜..
์—ฐ๊ด€๊ด€๊ณ„ ํŽธ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ๊ณผ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ public class Member { private Team team; public void setTeam(Team team){ this.team = team; team.getMembers().add(this); } } ์œ„์˜ setTeam() ๋ฉ”์„œ๋“œ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, setTeam(teamA) ์ดํ›„ setTeam(teamB)๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด teamA์™€์˜ ๊ด€๊ณ„๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ์ฒด ๋‚จ์•„์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ˆ˜์ • public class Member { private Team team; public void setTeam(Team team){ if(this.t..
@JoinColumn ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. name ์†์„ฑ์—๋Š” ๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค ์ปฌ๋Ÿผ๋ช…(์ด๋ฆ„)์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์†์„ฑ ๊ธฐ๋Šฅ ๊ธฐ๋ณธ๊ฐ’ name ๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค ์ปฌ๋Ÿผ๋ช… ํ•„๋“œ๋ช…_[์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค ์ปฌ๋Ÿผ๋ช…] referencedColumnName ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช… ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค ์ปฌ๋Ÿผ๋ช… foreignKey (DDL) ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ์กฐ๊ฑด์„ ์ง์ ‘ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. unique nullable insertable updatable columnDefinition table @Column์˜ ์†์„ฑ๊ณผ ๋™์ผํ•˜๋‹ค. name๊ณผ referencedColumnName์„ ์ฐฉ๊ฐํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์ž name์€ ๋‹จ์ง€ ๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค์˜ ์ด๋ฆ„, ์ฆ‰ ๋‹จ์ˆœํžˆ ์ปฌ๋Ÿผ๋ช…์„ ..
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. @SequenceGenerator( name = "BOARD_SEQ_GENERATOR", allocationSize = 50 ) public class Member { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOARD_SEQ_GENERATOR") @Column(name = "MEMBER_ID") private Long id; } ์ดํ›„ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Member member = new Member(); em.persist(member); Member member2 = new Member(); em.persist(member2); ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œํ€€์Šค ํ˜ธ์ถœ์ด 2๋ฒˆ ์ด๋ฃจ์–ด์ง„๋‹ค..
DB ๊ธฐ๋ณธ ํ‚ค(Primary Key) ์กฐ๊ฑด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ๋ณธ ํ‚ค(Primary Key)๋Š” ๋‹ค์Œ 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. null ๊ฐ’์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ๋ณ€ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ‚ค ์„ ํƒ ์ „๋žต ์ž์—ฐ ํ‚ค ๋น„์ฆˆ๋‹ˆ์Šค์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ํ‚ค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: ์ฃผ๋ฏผ๋ฒˆํ˜ธ, ์ „ํ™”๋ฒˆํ˜ธ ๋“ฑ) ๋Œ€๋ฆฌ ํ‚ค ๋น„์ฆˆ๋‹ˆ์Šค์™€ ๊ด€๋ จ ์—†๋Š” ์ž„์˜๋กœ ๋งŒ๋“ค์–ด์ง„ ํ‚ค. (์˜ˆ : AUTO_INCREMENT, ์˜ค๋ผํด ์‹œํ€€์Šค ๋“ฑ) ๊ถŒ์žฅํ•˜๋Š” ์‹๋ณ„์ž ์„ ํƒ ์ „๋žต ์ž์—ฐ ํ‚ค๋ณด๋‹ค๋Š” ๋Œ€๋ฆฌ ํ‚ค๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋ฏผ๋“ฑ๋ก ๋ฒˆํ˜ธ๊ฐ™์ด ๊ธฐ๋ณธ ํ‚ค์˜ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ์ž์—ฐ ํ‚ค๋ฅผ ๊ธฐ๋ณธ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ถฉ๋™์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ‘์ž๊ธฐ ์ •์ฑ…์˜ ๋ณ€๊ฒฝ์œผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰์•„๋ฒ„๋ฆฐ๋‹ค๋ฉด ๋‹ต์ด ์—†์–ด์ง‘๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ํ™˜..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring/JPA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (7 Page)