๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“— JPA6

MapStruct! JPA Entity ๋งคํ•‘ ๊ฐ„ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž ์ตœ๊ทผ ๋น„์ƒ ๊ฒฐ์ œ ๋ชจ๋“œ๋ฅผ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌํ•˜๋ฉฐ, ์ฐธ์œผ๋กœ ์–ด์ด ์—†๋Š” ์ž‘์€ ์ฝ”๋”ฉ ๊ด€๋ จ ์ด์Šˆ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ์— ์ด์ƒ์ด ์žˆ์—ˆ๋‹ค. ๋ฐ”๋กœ, MapStruct ์–˜ ๋•Œ๋ฌธ์ธ๋ฐ.. ํ•œ๋ฒˆ ๋‚˜์—ดํ•ด๋ณด๊ฒ ๋‹ค. (ํ•ญ์ƒ ์ƒ๊ฐํ•˜๋Š” ๊ฑฐ์ง€๋งŒ, ์ฝ”๋“œ ๋‹จ ํ•œ์ค„์˜ ํŒŒ๊ธ‰ํšจ๊ณผ๊ฐ€ ์—„์ฒญ ๋‚˜๋‹ค.) MapStruct ๋ž€?Java Bean ์œ ํ˜• ๊ฐ„ ๋งคํ•‘ ๊ตฌํ˜„์„ ๋„์™€์ฃผ๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฝ”๋“œ ์ƒ์„ฑ ๋ฐ ๋Ÿฐํƒ€์ž„์—์„œ ์•ˆ์ •์„ฑ ๋ณด์žฅ์ˆœ์ˆ˜ Java code ๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋งคํ•‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. (Reflection ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ)Annotation Processor ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งคํ•‘ ๋ฐฉ์‹์— ํŽธ๋ฆฌํ•จ์„ ์ œ๊ณต ์‚ฌ์šฉ ์˜ˆ์‹œJAVA@Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.g.. 2024. 3. 24.
JPA ์ง‘๊ณ„ํ•จ์ˆ˜ sum ์€ long ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ตœ๊ทผ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋“ค์„ ์ง‘๊ณ„ํ•˜์—ฌ ์กฐํšŒํ•˜๋Š” API ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์—, Spring Data JPA ์™€ Querydsl ์„ ์ด์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์˜ค๋Š˜, sum ์ง‘๊ณ„ ํ•จ์ˆ˜ ๋•Œ๋ฌธ์—, java object ๋กœ ๋งคํ•‘์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ์™€ ํ•ด๊ฒฐ๊ณผ์ •์„ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค. ๊ธฐ์กด ์ฟผ๋ฆฌ @Query( """ select new service.dto.PaymentTotalSumDTO( sum(sub.totalAmount) as totalAmount, sum(sub.discount) as discount, sum(sub.usedPoint) as usedPoint ) from (select tpd.totalAmount as totalAmount, tpd.discount as discount, tpd.u.. 2023. 7. 26.
[Spring Data JPA] JPA Enum ํ•„๋“œ์— ๊ด€ํ•œ ๋ฌธ์ œ ์ฐธ๋‚˜. ์˜ค๋Š˜ 5์‹œ๊ฐ„ ๋‚ ๋ ธ๋‹ค. Pagination ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š” API์—์„œ ๊ณ„์† 500 ์—๋Ÿฌ๊ฐ€ ๋‚˜์„œ ๊ณ„์† ๋ถ™์žก๊ณ  ์žˆ์—ˆ๋‹ค. ๋นจ๋ž˜ ๋•œ์— ์ง‘์— ์™”์ง€๋งŒ ๋ถˆ๊ตด์˜ ์˜์ง€๋กœ ํ•ด๊ฒฐํ•ด๋ณด๋ฆฌ๋ผ ๋‹ค์งํ•˜๊ณ  1์‹œ๊ฐ„๋งŒ์— ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค ์ฆ๋ง. ๋ฌธ์ œ์  ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ์„œ๋ฒ„ DB์— ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€์„œ์˜€๋‹ค. ๋ฌธ์ œ๋Š” JPA Enum ํ•„๋“œ๊ฐ€ @Enumerated(EnumType.STRING) ใ…ฃ์ด ์•„๋‹ˆ๋ผ, Ordinal๋กœ ๋“ค์–ด๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋‹ค. ์ง€์ •ํ•œ Enum ์ƒ์ˆ˜๋Š” ์ด 4๊ฐœ ์ด๋ฉฐ, ordinal์˜ ๋ฒ”์œ„๋Š” 0~3 ์ด๋‹ค. 4 ์ด์ƒ์˜ ์ˆซ์ž๋Š” ์žˆ์–ด์„œ๋Š” ์•ˆ๋  ๋ฐ์ดํ„ฐ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณ„์† ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4 ์ฟผ๋ฆฌ.. 2023. 2. 21.
[Spring Data JPA] ํ•œ๋ฐฉ ์ฟผ๋ฆฌ์˜ ํšจ๋Šฅ (feat : JPQL) ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์˜ ๊ธฐ๋ณธ ์†Œ์–‘์ธ SQL์„ ์ž‘์„ฑํ•˜๋Š” ์‹ค๋ ฅ์€ ๋›ฐ์–ด๋‚  ์ˆ˜๋ก ๋”ํ•  ๋‚˜์œ„ ์—†๋‹ค. ์‹ค์ œ๋กœ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์„œ๋น„์Šค์—์„œ๋Š” ์ด ์„ฑ๋Šฅ์„ ๋งค์šฐ ์ค‘์š”์‹œ ํ•˜๋Š”๋ฐ, ์ผ๋ฐ˜์ ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” DB ์กฐํšŒ์  ์ธก๋ฉด์—์„œ ํฐ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์ด๋Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ฐœ์„  ๋ฐฉ์•ˆ์ด๋ผ๊ณ ๋“ค ํ•œ๋‹ค. SQL์„ ๊ณต๋ถ€ํ•˜๊ณ , JPA ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ํ•ญ์ƒ ๋น ์งˆ ์ˆ˜ ์—†๋Š” ์–˜๊ธฐ, ์„ฑ๋Šฅ ์ตœ์ ํ™”. ํ•ญ์ƒ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๊ฐœ์„ ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์ฃผ์–ด์กŒ๊ณ , ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‚ด ์ƒ๊ฐ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค. DB ERD Model opnions entity๋ฅผ paging ์ฒ˜๋ฆฌํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋ฝ‘์•„์•ผ ํ•˜๋Š” ์ƒํ™ฉ. ์ฃผ์–ด์ง„ ์ค‘์š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” user_id ๋ฟ์ด๋‹ค. 1. ๋ณดํ†ต ๊ฐ™์œผ๋ฉด Document Entity๋ฅผ ๋จผ์ € ์กฐํšŒํ•œ ํ›„, opinions ๋ฅผ ํŽ˜์ด์ง• .. 2023. 2. 1.
[Spring Data JPA] Transaction ์—†์ด ์ฝ๊ธฐ ํšŒ์‚ฌ์— ์ž…์‚ฌํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋˜ ์ค‘์— ๋ถ„๋ช…ํžˆ jpa entity ๊ฐ์ฒด์˜ ์ฝ๊ธฐ ๊ณผ์ • ์ค‘, ๋ถ„๋ช…ํžˆ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ณด์˜€๋‹ค. ์ด๋ฅผํ…Œ๋ฉด Spring Security ์ธ์ฆ์„ ๊ฑฐ์น˜๊ณ  Security Context Holder ์— ์ €์žฅ๋œ UserPrinciple ๊ฐ์ฒด @Target(AnnotationTarget.VALUE_PARAMETER) @Retention(AnnotationRetention.RUNTIME) @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : user") annotation class CurrentUser(val require: Boolean = true) ์ด๋Ÿฌํ•œ ์• ๋…ธํ…Œ์ด์…˜์„ ํ”ํžˆ๋“ค ์ „์—ญ์ ์œผ๋กœ Api ์—์„œ.. 2023. 1. 30.
JPA ๊ฐœ๋… ์ •๋ฆฌ JPA ์ฑ…์„ ์ด์ œ ๋ง‰ ๋‹ค ์ฝ์—ˆ๋‹ค. ORM์„ ์ฒ˜์Œ ๊ณต๋ถ€ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์— ๊ธด์žฅ์ด ๋งŽ์ด ๋์ง€๋งŒ, DB ๊ณต๋ถ€๋„ ํ•˜๊ณ , ๊ฐ์ฒด์ง€ํ–ฅ์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ์ถฉ๋ถ„ํžˆ ํ•œ ์ƒํƒœ์—ฌ์„œ ๊ทธ๋Ÿฐ์ง€ ์ƒ๊ฐ๋ณด๋‹ค ๊ธฐ์กด์— ์ฝ์—ˆ๋˜ real mysql, ํ† ๋น„์˜ ์Šคํ”„๋ง 3.1๋ณด๋‹ค ์ž˜ ์ฝํ˜”๋‹ค. ๊ธฐ์กด์— database layer๋Š” Mybatis ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ, ์ด๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. SQL ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์•ž์œผ๋กœ ํ•  ์ผ์ด ๋งŽ์ด ๋‚จ์•˜์œผ๋ฏ€๋กœ, JPA๋กœ์˜ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์Šฌ์Šฌ ์‹œ์ž‘ํ•ด๋ณด์ž. JPA Java Persistence API ์ž๋ฐ” ์ง„์˜์˜ ORM ํ‘œ์ค€ ๊ธฐ์ˆ  ORM Object Relational Mapping ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. Hibernate ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ORM ํ”„๋ ˆ์ž„์›Œํฌ JPA ์ธํ„ฐํŽ˜.. 2022. 7. 15.
๋ฐ˜์‘ํ˜•