๐Ÿ๏ธ Spring

์—ฐ๊ด€๊ด€๊ณ„ ํŽธ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ๊ณผ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ 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, ์˜ค๋ผํด ์‹œํ€€์Šค ๋“ฑ) ๊ถŒ์žฅํ•˜๋Š” ์‹๋ณ„์ž ์„ ํƒ ์ „๋žต ์ž์—ฐ ํ‚ค๋ณด๋‹ค๋Š” ๋Œ€๋ฆฌ ํ‚ค๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋ฏผ๋“ฑ๋ก ๋ฒˆํ˜ธ๊ฐ™์ด ๊ธฐ๋ณธ ํ‚ค์˜ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ์ž์—ฐ ํ‚ค๋ฅผ ๊ธฐ๋ณธ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ถฉ๋™์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ‘์ž๊ธฐ ์ •์ฑ…์˜ ๋ณ€๊ฒฝ์œผ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰์•„๋ฒ„๋ฆฐ๋‹ค๋ฉด ๋‹ต์ด ์—†์–ด์ง‘๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ํ™˜..
๐Ÿง @Id ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค(PK)์™€ ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ๋งคํ•‘์‹œ์ผœ์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. ์ ์šฉ ๊ฐ€๋Šฅ ํƒ€์ž… ์ž๋ฐ” ๊ธฐ๋ณธํ˜• (int, long, ...) ์ž๋ฐ” ๋ž˜ํผํ˜• (Integer, Long, ...) String Date (java.util) Date (java.sql) BigDecimal BigInteger @Id๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ง์ ‘ ํ• ๋‹นํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ง์ ‘ ํ• ๋‹นํ•˜๋Š” ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด @GeneratedValue๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๐Ÿง @GeneratedValue ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ž๋™ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. ์†์„ฑ์œผ๋กœ๋Š” strategy๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ํ†ตํ•ด ์ž๋™ ์ƒ์„ฑ ์ „๋žต์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ์ „๋žต๋“ค์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค...
SEQUENCE ์ „๋žต, TABLE ์ „๋žต SEQUENCE ์ „๋žต์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œํ€€์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ํ• ๋‹นํ•ด์ฃผ๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ๊ธ€์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” [JPA] ๊ธฐ๋ณธ ํ‚ค(Primary Key)๋งคํ•‘ - @Id, @GeneratedValue @Id ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค์™€ ๋งคํ•‘์‹œ์ผœ์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์ ์šฉ ๊ฐ€๋Šฅ ํƒ€์ž… ์ž๋ฐ” ๊ธฐ๋ณธํ˜• (int, long, ...) ์ž๋ฐ” ๋ž˜ํผํ˜• (Integer, Long, ...) String Date (java.util) Date (java.sql) BigDecimal BigIn.. ttl-blog.tistory.com SEQUENCE ์ „๋žต์˜ ์ตœ์ ํ™”. - allocationSize SequenceGenerator์˜ allocationSize์˜ ๊ธฐ๋ณธ๊ฐ’์€ 50์ž…๋‹ˆ..
๐Ÿง ๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜ ๊ฐ’ ํƒ€์ž…์„ ์ปฌ๋ ‰์…˜์— ๋‹ด์•„์„œ ์‚ฌ์šฉํ•  ๋•Œ, ํ•ด๋‹น ์ปฌ๋ ‰์…˜์„ ๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค. (@OneToMany ์ฒ˜๋Ÿผ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ปฌ๋ ‰์…˜์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, Integer, String, ์ž„๋ฒ ๋””๋“œ ํƒ€์ž… ๊ฐ™์€ ๊ฐ’ ํƒ€์ž…์„ ์ปฌ๋ ‰์…˜์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ปฌ๋ ‰์…˜์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์„œ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜์€ ๊ฐœ๋…์ ์œผ๋กœ ๋ณด๋ฉด 1๋Œ€ N ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๊ฐ’ ํƒ€์ž…์„ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์€ ๊ฐ’ ํƒ€์ž…์„ ์†Œ์œ ํ•œ ์—”ํ‹ฐํ‹ฐ์˜ ๊ธฐ๋ณธ ํ‚ค์™€ ๋ชจ๋“  ๊ฐ’ ํƒ€์ž… ํ•„๋“œ๋ฅผ ๋ฌถ์–ด์„œ PK๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ์—”ํ‹ฐํ‹ฐ์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ PK๊ฒธ FK๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.) ๐Ÿง @ElementCollection ๊ฐ’ ํƒ€์ž… ์ปฌ๋ ‰์…˜์„ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. RD..
@Access JPA๊ฐ€ ์—”ํ‹ฐํ‹ฐ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ ์ ‘๊ทผ : AccessType.FILED ํ•„๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ์ ‘๊ทผ ๊ถŒํ•œ์ด private์ด์–ด๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ : AccessType.PROPERTY ์ ‘๊ทผ์ž(getter)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ์‚ฌ์šฉ @Entity @Access(AccessType.FIELD) public class Member { @Id private String id; } @Access๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ @Access๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด @Id์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค. @Id๊ฐ€ ํ•„๋“œ์— ๋‹ฌ๋ ค์žˆ์œผ๋ฉด ํ•„๋“œ ์ ‘๊ทผ, Getter์— ๋‹ฌ๋ ค์žˆ์œผ๋ฉด ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค...