๐Ÿ๏ธ Spring

@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 ..
์Šคํ”„๋ง์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํŠธ๋žœ์žญ์…˜๊ณผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์†์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์ด๋Ÿฌํ•œ JPA์˜ ๋‚ด๋ถ€ ๋™์ž‘์›๋ฆฌ๋ฅผ ๋ชจ๋ฅด๊ณ  ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์„ ํ†ตํ•ด JPA๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋‚ด๋ถ€ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ์ „๋žต์€ 'ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ' ์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ง์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ „๋žต์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ง€์›ํ•  ๋•Œ, ๊ธฐ๋ณธ ์ „๋žต์œผ๋กœ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜..
JPA์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์ง€์—ฐ๋กœ๋”ฉ ๋ชจ๋“  ์—ฐ๊ด€๊ด€๊ณ„๋Š” FetchType.LAZY๋ฅผ ํ†ตํ•œ ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•ด ์ฃผ์‹œ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ตœ์ ํ™”๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. XToOne ๊ด€๊ณ„ ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ToOne ๊ด€๊ณ„๋ฅผ ๋ชจ๋‘ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•œ ์ดํ›„, ์กฐํšŒํ•˜๋Š” ์‹œ์ ์— ํŽ˜์น˜ ์กฐ์ธ์„ ํ†ตํ•ด ์กฐํšŒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ToOne ๊ด€๊ณ„๋Š” ์กฐํšŒ ์‹œ row์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ ์—†์ด ํŽ˜์ด์ง•๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์—๋Š” ์—”ํ‹ฐํ‹ฐ๋กœ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, DTO๋กœ ๋ฐ”๋กœ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์„ ๊ทนํ•œ์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋ ค๋Š” ๊ฒƒ์ด ..
๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•ด์•ผํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ @PostContructor๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ง€๊ธˆ๋ถ€ํ„ฐ ๊ทธ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. @Component @RequiredArgsConstructor public class InitDb { private final InitService initService; @PostConstruct public void init() { initService.doInit(); } @Component @Transactional @RequiredArgsConstructor static class InitService { private final EntityManager em; public void doInit(){ Member member = new Member()..
๋ณ‘ํ•ฉ๊ณผ ๋ณ€๊ฒฝ๊ฐ์ง€ JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค ํ•˜๋‚˜๋Š” ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ณ‘ํ•ฉ (merge())๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ(merge)์˜ ๋™์ž‘์›๋ฆฌ ๋ณ‘ํ•ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์šฐ์„  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ์˜ ์‹๋ณ„์ž ๊ฐ’์œผ๋กœ 1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ 1์ฐจ์บ์‹œ์— ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•œ ํ›„ 1์ฐจ ์บ์‹œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์กฐํšŒํ•œ ์˜์† ์—”ํ‹ฐํ‹ฐ์— merge(์ƒˆ๋กœ์šด์—”ํ‹ฐํ‹ฐ) ์—์„œ ๋„ฃ์–ด์ค€ '์ƒˆ๋กœ์šด์—”ํ‹ฐํ‹ฐ'์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ์ด๋•Œ ๋นˆ ๊ฐ’์€ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ null๋กœ ์ฑ„์›Œ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ merge()์— ๋“ค์–ด๊ฐ„ ๊ฐ’๋“ค ์ค‘ null ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์ด ๋ฌด์‹œ๋˜๊ณ  ..
์Šคํ”„๋ง๋ถ€ํŠธ ์‚ฌ์šฉ ์‹œ EntityManagerFactory๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ• @PersistenceUnit ๋˜๋Š” ๊ทธ๋ƒฅ @Autowired๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ @PersistenceUnit private EntityManagerFactory emf; Reference ์‹ค์ „! ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA ํ™œ์šฉ1 - ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜ ์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด ์˜ˆ์ œ๋กœ, ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA๋ฅผ ํ™œ์šฉํ•ด์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ JPA๋ฅผ ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ์Šคํ”„ www.inflearn.com
๋ง ๋ž‘
'๐Ÿ๏ธ Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (16 Page)