๐Ÿ๏ธ Spring/JPA

์ด๋ฒˆ์— Exception์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€๋ฅผ ์ข€ ํ•˜๋‹ค๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋ฅด๊ณ  ์ญ‰ ์‚ฌ์šฉํ–ˆ์—ˆ๋˜ ์ค‘์š”ํ•œ ์‚ฌ์‹ค์„ ์•Œ์•„๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. (์ด๊ฒƒ๋„ ๋ชจ๋ฅด๊ณ  ๋ฌด์ง€์„ฑ์œผ๋กœ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค๋‹ˆ..ใ… ใ…  ์ฐธ.. ์ด๋Ÿฌ๋ฉด์„œ ์„ฑ์žฅํ•˜๋Š” ๊ฑฐ๊ฒ ์ฃ ..) ์šฐ์„  ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ Checked Exception๊ณผ Unchecked Exception์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Checked Exception์€ Exception์˜ ํ•˜์œ„ ์˜ˆ์™ธ๋“ค ์ค‘ RuntimeException์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์˜ˆ์™ธ๋“ค์„ Checked Exception์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค. Checked Exception์€ ์ปดํŒŒ์ผ ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•„์ˆ˜๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฉฐ, ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด์™€๋Š” ๋Œ€์กฐ์ ์œผ๋กœ Unchecked Exception์€ RuntimeException๊ณผ ์ด๋ฅผ ์ƒ์†๋ฐ›์€ ..
JPA ๊ตฌํ˜„์ฒด๋กœ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋ฅผ ์“ฐ์‹ ๋‹ค๋ฉด ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ƒํ™ฉ์„ ๊ฐ„๋žตํ•œ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; public void set..
์˜ˆ์ „๋ถ€ํ„ฐ @Transaction์ด ์ค‘์ฒฉ๋˜์„œ ์‚ฌ์šฉ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ..?? ๋ผ๊ณ  ๋ช‡๋ฒˆ ์ƒ๊ฐํ•ด ๋ณด์•˜๊ณ , ๊ทธ๋•Œ ๋Œ€์ถฉ ์‚ดํŽด๋ณด๊ณ  ๋ง์•˜์—ˆ๋Š”๋ฐ, ์˜ค๋Š˜ ์–ด์ฉŒ๋‹ค๊ฐ€ ์ด๊ฒƒ ๊ด€๋ จํ•ด์„œ ์กฐ๊ธˆ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ด ์ƒ๊ฒจ์„œ (์‚ฌ์‹ค์€ ์ข…ํ˜„๋‹˜์ด ์–ธ๊ธ‰ํ•ด์ฃผ์‹  ๊ฑฐ๊ธด ํ•˜์ง€๋งŒ) ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค. ์‚ฌ์‹ค ์ด ๊ธ€์€ ์ดํ›„ ๋‹ค๋ฃฐ (์ค‘์ฒฉ๋œ) ํŠธ๋žœ์žญ์…˜์—์„œ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๊ธ€์„ ์„œ์ˆ ํ•  ๋•Œ ์•Œ๊ณ ์žˆ์–ด์•ผ ํ•  ๋‚ด์šฉ์ด๊ธฐ์— ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ๋‹ค๋ฃจ๊ณ  ๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” @Transactional์˜ propagation ์†์„ฑ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. Propagation(์ „ํŒŒ) ์†์„ฑ ์Šคํ”„๋ง์˜ Propagation์˜ ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), SUPPORTS(TransactionDefi..
JPA ํ‘œ์ค€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ JPA์˜ ํ‘œ์ค€ ์˜ˆ์™ธ๋“ค์€ javax.persistence.PersistenceException์˜ ์ž์‹ ํด๋ž˜์Šค๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์˜ˆ์™ธ ํด๋ž˜์Šค๋Š” RuntimeException์˜ ์ž์‹์ด๋‹ค. JPA ํ‘œ์ค€ ์˜ˆ์™ธ๋Š” ํฌ๊ฒŒ ๋ณด๋ฉด 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ์„ ํ‘œ์‹œํ•˜๋Š” ์˜ˆ์™ธ ํŠธ๋žœ์žญ์…˜ ์˜ˆ์™ธ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ์˜ˆ์™ธ ํŠธ๋ž™์žญ์…˜ ๋กค๋ฐฑ์„ ํ‘œ์‹œํ•˜๋Š” ์˜ˆ์™ธ๋Š” ์‹ฌ๊ฐํ•œ ์˜ˆ์™ธ์ด๋ฏ€๋กœ ๋ณต๊ตฌํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ๊ฐ•์ œ๋กœ ์ปค๋ฐ‹ํ•ด๋„ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜์ง€ ์•Š๊ณ  ๋Œ€์‹ ์— javax.persistence.RollbackException ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ฐ˜๋ฉด์— ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ์„ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ์˜ˆ์™ธ๋Š” ์‹ฌ๊ฐํ•œ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ• ์ง€ ๋กค๋ฐฑํ• ์ง€๋ฅผ ํŒ๋‹จํ•œ๋‹ค. ์•„๋ž˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ถ„๋ฅ˜์˜ ์˜ˆ์™ธ๋ฅผ ํ‘œ..
๋ฆฌ์Šค๋„ˆ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์–ธ์ œ ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ์‚ญ์ œ๋ฅผ ์š”์ฒญํ–ˆ๋Š”์ง€ ๋ชจ๋‘ ๋กœ๊ทธ๋กœ ๋‚จ๊ฒจ์•ผ ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ญ์ œ ๋กœ์ง์„ ํ•˜๋‚˜ ํ•˜๋‚˜ ์ฐพ์•„๊ฐ€๋ฉฐ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด๋Ÿด ๋•Œ JPA์˜ ๋ฆฌ์Šค๋„ˆ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์—”ํ‹ฐํ‹ฐ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋”ฐ๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜ ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜์™€ ๋ฐœ์ƒ ์‹œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. PostLoad : ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์กฐํšŒ๋œ ์งํ›„, ๋˜๋Š” refresh๋ฅผ ํ˜ธ์ถœํ•œ ํ›„(2์ฐจ ์บ์‹œ์— ์ €์žฅ๋˜์–ด ์žˆ์–ด๋„ ํ˜ธ์ถœ๋œ๋‹ค.) PrePersist : persist() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๊ด€๋ฆฌํ•˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋œ๋‹ค. ์‹๋ณ„์ž ์ƒ์„ฑ ์ „๋žต์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ์—๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ์‹๋ณ„์ž๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ์ด๋‹ค. ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ mer..
@Converter ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํšŒ์›์˜ VIP์—ฌ๋ถ€๋ฅผ ์ž๋ฐ”์˜ boolean ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž. JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ”์˜ boolean ํƒ€์ž…์€ ๋ฐฉ์–ธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋  ๋•Œ 0 ๋˜๋Š” 1๋กœ ์ €์žฅ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ˆซ์ž ๋Œ€์‹  Y ๋˜๋Š” N์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ๊ทธ๋Ÿด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ปจ๋ฒ„ํ„ฐ๋‹ค. ์‚ฌ์šฉ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; ..
์ปฌ๋ ‰์…˜ JPA์—์„œ๋Š” ์ž๋ฐ”์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” Collection, List, Set, Map ์ปฌ๋ ‰์…˜์„ ์ง€์›ํ•˜๊ณ  ๋‹ค์Œ ๊ฒฝ์šฐ์— ์ด ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. @OneToMany, @ManyToMany ๋ฅผ ์‚ฌ์šฉํ•ด์„œ '์ผ๋Œ€๋‹ค' ํ˜น์€ '๋‹ค๋Œ€๋‹ค' ์—”ํ‹ฐํ‹ฐ ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•  ๋•Œ. @ElementCollection์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’ ํƒ€์ž…์„ ํ•˜๋‚˜ ์ด์ƒ ๋ณด๊ด€ํ•  ๋•Œ ์šฐ์„  ์ž๋ฐ” ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ง•์„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๊ณ  ๊ฐ€์ž. ์ž๋ฐ” ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ง• Collection : ์ž๋ฐ”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ตœ์ƒ์œ„ ์ปฌ๋ ‰์…˜์ด๋‹ค. List : ์ˆœ์„œ๊ฐ€ ์žˆ๊ณ , ์ค‘๋ณต์„ ํ—ˆ์šฉํ•œ๋‹ค. Set : ์ˆœ์„œ๊ฐ€ ์—†๊ณ , ์ค‘๋ณต์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค Map : Key, Value๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ ํ‚ค๋Š” ์ค‘๋ณต์„ ๋ถˆํ—ˆํ•œ๋‹ค. JPA์™€ ์ปฌ๋ ‰์…˜ JPA ๋ช…์„ธ์—๋Š” ์ž๋ฐ” ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€..
@OrderBy @OrderColumn์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ˆœ์„œ์šฉ ์ปฌ๋Ÿผ์„ ๋งคํ•‘ํ•ด์„œ ๊ด€๋ฆฌํ–ˆ๋‹ค๋ฉด, @OrderBy๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ORDER BY ์ ˆ์„ ์‚ฌ์šฉํ•ด์„œ ์ปฌ๋ ‰์…˜์„ ์ •๋ ฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆœ์„œ์šฉ ์ปฌ๋Ÿผ์„ ๋งคํ•‘ํ•  ํ•„์š”๋„ ์—†๊ณ , ๋˜ํ•œ @OrderBy๋Š” ๋ชจ๋“  ์ปฌ๋ ‰์…˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @OneToMany(mappedBy = "member") @OrderBy("id asc, completedDate desc") private ..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring/JPA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (4 Page)