์ „์ฒด ๊ธ€

๐Ÿ’พ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 ๋ช…๋ น์œผ๋กœ..

๐Ÿ‘จ‍๐Ÿ’ปํ”„๋กœ์ ํŠธ:Project

TAB(Take a Bus)

Take A Bus (TAB) ์‚ผ์„ฑ์ฒญ๋…„SW์•„์นด๋ฐ๋ฏธ(SSAFY) ๊ฐœ๋ฐœ๊ธฐ๊ฐ„: 2023.07.04 ~ 2023.8.18 ๋ฐฐํฌ ์ฃผ์†Œ ํ”„๋ก ํŠธ ์„œ๋ฒ„ : https://i9d111.p.ssafy.io ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ : https://i9d111.p.ssafy.io/tab ์‹ค์‹œ๊ฐ„ ํ‚ค์˜ค์Šคํฌ : https://i9d111.p.ssafy.io/kiosk/auth ๊ฐœ๋ฐœํŒ€ ์†Œ๊ฐœ ์‹ ์ง€ํ›ˆ ์„ฑ์—ฐ์„ ์†ก๋ฏผ์ฒ  @wlgns1718 @abcd9351 @thdalscjf05 BackEnd BackEnd BackEnd ์‹ ์ œํ˜• ์ด์ •ํ›ˆ @tlswpgud22 @wjdgns0631 FrontEnd FrontEnd ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ TAB์€ ์Šน์ฐจ๋ฒจ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ฒ„์Šค์ •๋ฅ˜์žฅ ํ‚ค์˜ค์Šคํฌ์™€, ๋‹ค์–‘ํ•œ ์›น ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํƒ‘์Šน๊ฐ์€ ์Šน์ฐจ๋ฒจ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํƒ‘์Šน์˜์‚ฌ๋ฅผ ํ‘œํ˜„..

โญDocker

Docker

docker run docker์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋จ docker run node 'node' ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด ์‹คํ–‰ํ•œ๋‹ค. ( ์ด๋ฏธ์ง€๊ฐ€ ๋กœ์ปฌ์— ์—†์œผ๋ฉด DockerHub์—์„œ ์ฐพ์œผ๋ ค ์‹œ๋„) ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ฏธ์ง€์˜ code์™€ environment๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š์Œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋ฏธ์ง€์— ์ €์žฅ๋œ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ ์œ„์— ๋ถ€๊ฐ€์ ์ธ ๋ ˆ์ด์–ด(๋ฆฌ์†Œ์Šค, ๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ์ถ”๊ฐ€ํ•จ. docker start (์ปจํ…Œ์ด๋„ˆ ID ๋˜๋Š” ์ด๋ฆ„) ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ ์‹คํ–‰ํ•˜๋ฉด docker run๊ณผ ๊ฐ™์ด ํ„ฐ๋ฏธ๋„์„ ์ฐจ๋‹จํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์‹คํ–‰ ์ค‘(๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ ์ค‘) docker run docker start default๊ฐ€ attached ๋ชจ๋“œ(ํฌ์–ด๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰) d..

๐Ÿ’พ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์— ๋ฐ์ด..

mc.thd
mincheolsong