๐Ÿ’พORM:JPA

๐Ÿ’พORM:JPA

[spring-data-jpa] ๋ฐ˜ํ™˜ํƒ€์ž…

์ปฌ๋ ‰์…˜ ํƒ€์ž… ๊ฒฐ๊ณผ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ๋นˆ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. (null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ!) ๋”ฐ๋ผ์„œ !=null ๊ณผ ๊ฐ™์€ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋‹จ๊ฑด ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค (์ˆœ์ˆ˜ํ•œ jpa์˜ ๊ฒฝ์šฐ javax.persistence.NoResultException ์˜ˆ์™ธ ๋ฐœ์ƒ) ๊ฒฐ๊ณผ๊ฐ€ 2๊ฑด ์ด์ƒ์ธ ๊ฒฝ์šฐ javax.persistence.NonUniqueResultException ์˜ˆ์™ธ ๋ฐœ์ƒ

๐Ÿ’พORM:JPA

fetch join, ์ปฌ๋ ‰์…˜, ํŽ˜์ด์ง•์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

ToOne ๊ด€๊ณ„๋Š” ๋ชจ๋‘ fetch joinํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ( ํŽ˜์ด์ง• ์ฟผ๋ฆฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์„œ ) ์ปฌ๋ ‰์…˜์€ fetch join ํ•˜์ง€ ์•Š๊ณ  ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์กฐํšŒ ์ปฌ๋ ‰์…˜์˜ ์ง€์—ฐ๋กœ๋”ฉ ์„ฑ๋Šฅ ์ตœ์ ํ™” + ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด hibernate.default_batch_fetch_size ํ˜น์€ @BatchSize๋ฅผ ์‚ฌ์šฉ hibetnate.default_batch_fetch_size, @BatchSize ์ปฌ๋ ‰์…˜์ด๋‚˜, ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์„ค์ •ํ•œ size๋งŒํผ IN ์ฟผ๋ฆฌ๋กœ ์กฐํšŒํ•œ๋‹ค.

๐Ÿ’พORM:JPA

์ปฌ๋ ‰์…˜ fetch join์— ๋Œ€ํ•ด

์ปฌ๋ ‰์…˜(์ผ๋Œ€๋‹ค) ์—์„œ fetch join์€ 1๊ฐœ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค! ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ€์ •ํ™•ํ•˜๊ฒŒ ์กฐํšŒ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ fetch join์„ ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ - Order ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ผ๋Œ€๋‹ค ๊ด€๊ณ„์— ๋Œ€ํ•œ ํ•„๋“œ๊ฐ€ 2๊ฐœ์ธ ๊ฒฝ์šฐ - Order ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ผ๋Œ€๋‹ค ๊ด€๊ณ„์— ๋Œ€ํ•œ ํ•„๋“œ๊ฐ€ 1๊ฐœ๊ณ , ๊ทธ ํ•„๋“œ์˜ ๊ฐ์ฒด ๋‚ด๋ถ€์— ์ผ๋Œ€๋‹ค ๊ด€๊ณ„์— ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ปฌ๋ ‰์…˜(์ผ๋Œ€๋‹ค) fetch join์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง•์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค Hibernate๊ฐ€ ๊ฒฝ๊ณ  ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋ฉด์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ db์—์„œ ์ฝ์–ด์˜จ ๋’ค, ๋ฉ”๋ชจ๋ฆฌ(=์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ)์—์„œ ํŽ˜์ด์ง•์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.(out of memory๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ) distinct๋กœ ์ค‘๋ณต๋ฐ์ดํ„ฐ ์ œ๊ฑฐ ์ปฌ๋ ‰์…˜(์ผ๋Œ€๋‹ค) fetch join์€ ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, distinct ๋ช…๋ น์œผ๋กœ..

๐Ÿ’พORM:JPA

DTO์— getter๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๋ฅผ ํ†ตํ•ด json ๋ฐ์ดํ„ฐ๋“ค์„ ์ง๋ ฌํ™” / ์—ญ์ง๋ ฌํ™” ์ž‘์—…์„ ์ง„ํ–‰ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•ด getter๋ฅผ ์ž‘์„ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค

๐Ÿ’พORM:JPA

์ฟผ๋ฆฌ ๋ฐฉ์‹ ์„ ํƒ ์ˆœ์„œ

์ฟผ๋ฆฌ ๋ฐฉ์‹ ์„ ํƒ ์ˆœ์„œ 1. ์šฐ์„  ์—”ํ‹ฐํ‹ฐ๋ฅผ DTO๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒ /** * V2. ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์„œ DTO๋กœ ๋ณ€ํ™˜(fetch join ์‚ฌ์šฉX) * - ๋‹จ์ : ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์ฟผ๋ฆฌ N๋ฒˆ ํ˜ธ์ถœ */ @GetMapping("/api/v2/simple-orders") public List ordersV2() { List orders = orderRepository.findAll(); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(toList()); return result; } 2. ํ•„์š”์‹œ fetch join์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™” /** * V3. ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์„œ DTO๋กœ ๋ณ€ํ™˜(fetch join ์‚ฌ์šฉO) * - fetch joi..

๐Ÿ’พORM:JPA

[spring-data-jpa] ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ

1. Page๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ณ , Pageable์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ 2-1. Pageable์— ๋„˜๊ฒจ์ค„ PageRequest๋ฅผ ์ƒ์„ฑ 2-2. getContent() ๋ฉ”์†Œ๋“œ๋กœ ํŽ˜์ด์ง• ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ด 2-3. getTotalElements() ๋ฉ”์†Œ๋“œ๋กœ ์ „์ฒด ๊ฒฐ๊ณผ ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ด ํŽ˜์ด์ง€ ํ•จ์ˆ˜ page.getNumber() : ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ด page.getTotalPages() : ์ „์ฒด ํŽ˜์ด์ง€ ๊ฐฏ์ˆ˜ page.isFirst() : ์ฒซ ๋ฒˆ์งธ ํŽ˜์ด์ง€์ธ์ง€ ์ฐธ/๊ฑฐ์ง“ page.hasNext() : ๋‹ค์Œ ํŽ˜์ด์ง€ ์žˆ๋Š”์ง€ ์ฐธ/๊ฑฐ์ง“ Page๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ํ•ด๋„ ๋œ๋‹ค(json์œผ๋กœ ๋ฐ˜ํ™˜ ๋จ) entity๋Š” dto๋กœ ๋ฐ”๊ฟ”์„œ ๋ฐ˜ํ™˜ํ•˜์ž entity๋ฅผ dto๋กœ ์‰ฝ๊ฒŒ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

๐Ÿ’พORM:JPA

[spring-data-jpa] ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ 3๊ฐ€์ง€

์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ 3๊ฐ€์ง€ 1. ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์œผ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ 2. JPA Named Query 3. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ •์˜(@Query ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ) 1๋ฒˆ์€ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด ๊ธธ์–ด์ง€๋ฉด ๋ฌธ์ œ๊ฐ€ ๋จ 2๋ฒˆ์€ ์‹ค๋ฌด์—์„œ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ 3๋ฒˆ์„ ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์‚ฌ์šฉ 3. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ •์˜(@Query ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉ) ์žฅ์  : JPA Named ์ฟผ๋ฆฌ์ฒ˜๋Ÿผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ ์— ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Œ DTO ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ• dto์ชฝ์— ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•จ new + ๋ชจ๋“  ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ + ์ƒ์„ฑ์ž ๋ฐฉ์‹์œผ๋กœ select ํ•ด์•ผ ํ•จ ์ปฌ๋ ‰์…˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค null์ด ์•„๋‹Œ result =[ ] ์ด๋‹ค. ๋‹จ, Member ํด๋ž˜์Šค ํ•˜๋‚˜์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค db์— ๋ฐ์ด..

๐Ÿ’พORM:JPA

๋ณ€๊ฒฝ ๊ฐ์ง€์™€ ๋ณ‘ํ•ฉ

์ค€์˜์† ์—”ํ‹ฐํ‹ฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋”๋Š” ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์—”ํ‹ฐํ‹ฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–˜ ์ˆ˜ ์—†๋‹ค ๊ธฐ์กด ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž„์˜๋กœ ๋งŒ๋“ค์–ด๋‚ธ ์—”ํ‹ฐํ‹ฐ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋งŒ๋“œ๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• em.detach(entity) : ํŠน์ • ์—”ํ‹ฐํ‹ฐ๋งŒ ์ค€์˜์† ์ƒํƒœ๋กœ ์ „ํ™˜ em.clear() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™” em.close() : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ข…๋ฃŒ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝ ๊ฐ์ง€ ๊ธฐ๋Šฅ (์„ ํ˜ธ) em.find๋กœ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ • ๋ณ‘ํ•ฉ(merge) ์‚ฌ์šฉ em.merge๋ฅผ ์‹คํ–‰ ์˜์† ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์„ ์ค€์˜์† ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์œผ๋กœ ๋ชจ๋‘ ๊ต์ฒดํ•จ (๋ณ‘ํ•ฉ์‹œ ๊ฐ’์ด ์—†์œผ๋ฉด null๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์œ„ํ—˜๋„ ์žˆ์Œ) ์ƒˆ๋กœ์šด ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•จ ( ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์—”ํ‹ฐํ‹ฐ๋Š” ..

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