๐Ÿ’พORM:JPA

๐Ÿ’พORM:JPA

@Transactional

@Transactional JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ญ์ƒ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ @Transactional(readOnly=true) ์กฐํšŒํ•˜๋Š” ๊ณณ(์ฝ๊ธฐ ๋™์ž‘)์— ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์Œ ์“ฐ๊ธฐ์—์„œ๋Š” X ํด๋ž˜์Šค ์ตœ์ƒ๋‹จ์— @Transactional(readOnly=true) ๋ฅผ ์ ์–ด์ฃผ๊ณ , ์“ฐ๊ธฐํ•˜๋Š” ๊ณณ์—๋Š” @Transactional์„ ์ ์–ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ํ–ˆ์Œ

๐Ÿ’พORM:JPA

@JoinColumn

๋‹ค๋Œ€์ผ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ @JoinColumn(name) ์ปฌ๋Ÿผ ์ด๋ฆ„ ๋งคํ•‘์— ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์—ฐ๊ด€๊ด€๊ณ„์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์ด ์—†๋‹ค ์กฐ์ธ ๋Œ€์ƒ ์ปฌ๋Ÿผ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด @JoinColumn(referencedColumnName)์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค! ๋”ฐ๋ผ์„œ ๋ฌด์กฐ๊ฑด @JoinColumn์„ ์ƒ๋žตํ•ด์„  ์•ˆ๋œ๋‹ค ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ @JoinColumn @JoinColumn ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ผญ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•จ ์ผ๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ @JoinColumn ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ผ(1)์—๊ฒŒ ์ฃผ๋ ค ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค(N)์ชฝ์— @JoinColumn(insertable=false, updateable=false)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ๊ฐ•์ œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ  : https://hyeon9..

๐Ÿ’พORM:JPA

JPA ์ฟผ๋ฆฌ ( JPQL )

JPA๋Š” ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•œ๋‹ค JPQL (๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ JPQL๋กœ ํ•ด๊ฒฐ) QueryDSL ๋„ค์ดํ‹ฐ๋ธŒ SQL JDBC API ์ง์ ‘ ์‚ฌ์šฉ, MyBatis, SpringJdbcTemplate ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ JPQL์ด๋ž€? : ๊ฐ์ฒด์ง€ํ–ฅ SQL JPA๋Š” SQL์„ ์ถ”์ƒํ™”ํ•œ JPQL์ด๋ผ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด(ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ƒ‰)๋ฅผ ์ œ๊ณต SQL๊ณผ ๋ฌธ๋ฒ• ์œ ์‚ฌ, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN ์ง€์› SQL์„ ์ถ”์ƒํ™”ํ•ด์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL์— ์˜์กดX JPQL์€ ๊ฒฐ๊ตญ SQL๋กœ ๋ณ€ํ™˜๋œ๋‹ค ํ”„๋กœ์ ์…˜(SELECT) SELECT m FROM Member m : ์—”ํ‹ฐํ‹ฐ ํ”„๋กœ์ ์…˜ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ „๋ถ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๊ฐ€ ๋œ๋‹ค ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด up..

๐Ÿ’พORM:JPA

๊ฐ’ ํƒ€์ž…, ๊ฐ’ ํƒ€์ž… ์ปฌ๋ž™์…˜

๊ฐ’ ํƒ€์ž… ์ˆ˜์ • ๊ฐ’ ํƒ€์ž…์€ immutable ํ•ด์•ผ ํ•จ ๊ฐ’ ํƒ€์ž…์˜ setter๋กœ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ๋จ update๋ฌธ์ด ๋‚˜๊ฐ€์ง€๋งŒ side effect๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Œ Member findMember = em.find(Member.class,member.getId()); // ๊ฐ’ํƒ€์ž… Address์˜ homeCity ๋ฅผ newCity๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์Œ findMember.getHomeAddress().setCity("newCity"); // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ๋จ ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒˆ๋กœ์šด Address๋กœ ๊ฐˆ์•„๋ผ์›Œ์•ผ ํ•œ๋‹ค // ๊ฐ’ํƒ€์ž… Address์˜ homeCity ๋ฅผ newCity๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์Œ Address a = findMember.getHomeAddress(); findMember.setHomeAddress(new Addres..

๐Ÿ’พORM:JPA

์ฆ‰์‹œ ๋กœ๋”ฉ๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ

์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•˜๋‚˜๋ฉด ์ฆ‰์‹œ ๋กœ๋”ฉ ์ปฌ๋ ‰์…˜์ด๋ฉด ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉ ์–ด๋…ธํ…Œ์ด์…˜ default @ManyToOne, @OneToOne ์ฆ‰์‹œ ๋กœ๋”ฉ(FetchType.EAGER) @OneToMany, @ManyToMany ์ง€์—ฐ ๋กœ๋”ฉ(FetchType.LAZY) ManyToMany๋Š” ์“ฐ์ง€ ๋ง์ž ์‹ค๋ฌด์—์„  ์ง€์—ฐ ๋กœ๋”ฉ๋งŒ ์‚ฌ์šฉํ•˜์ž ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ SQL์ด ๋ฐœ์ƒ ์ฆ‰์‹œ ๋กœ๋”ฉ์€ JPQL์—์„œ N+1 ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ๋‹ค. @ManyToOne, @OneToOne์€ ๊ธฐ๋ณธ์ด ์ฆ‰์‹œ ๋กœ๋”ฉ ๐Ÿ‘‰ LAZY๋กœ ์„ค์ • ๋ชจ๋“  ์—ฐ๊ด€๊ด€๊ณ„์— ์ง€์—ฐ ๋กœ๋”ฉ์„ ์„ค์ •ํ•œ ๋’ค JPQL fetch์กฐ์ธ์ด๋‚˜, ์—”ํ‹ฐํ‹ฐ ๊ทธ๋ž˜ํ”„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ž ์ฆ‰์‹œ๋กœ๋”ฉ์€ ์ƒ์ƒํ•˜์ง€ ๋ชปํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜๊ฐ„๋‹ค

mc.thd
'๐Ÿ’พORM:JPA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (2 Page)