๐ 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. ์ด์ 1 ๋ค์ ๋ฐ์ํ