๐Ÿ“˜ Web/Spring, JPA 13

[QueryDSL] @QueryProjection (SELECT์ ˆ ๋Œ€์ƒ ์ง€์ •)

ํ”„๋กœ์ ์…˜ (Projections) QueryDSL์„ ์ด์šฉํ•ด Entity ์ „์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์กฐํšŒ ๋Œ€์ƒ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠน์ • ์ปฌ๋Ÿผ๋งŒ์„ SELECT ํ•ด์˜ค๋Š” ์ปค์Šคํ…€ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ, Entity์—์„œ ์ „์ฒด ํ•„๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํŠน์ • ๋Œ€์ƒ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— (๋‚˜๊ฐ™์€ ๊ฒฝ์šฐ) ์ƒ์„ฑ์ž ๋ฐฉ์‹์ธ Projectsions.constructor์„ ์ด์šฉํ•˜์—ฌ DTO์— ์ •์˜ํ•œ ํ•„๋“œ๋งŒ์„ ํ˜ธ์ถœํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ DTO ์ค‘์—์„œ๋„ ํŠน์ • ํ•„๋“œ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด? @RequiredArgsConstructor public class TestRepoImpl implements TestRepoCustom { private final JPAQueryFactory jpaQueryFactory; @Override publi..

[Gradle] Execution failed for task ':compileJava'.> Failed to notify dependency resolution listener. > Could not find querydsl-apt-5.0.0-jpa.jar (com.querydsl:querydsl-apt:5.0.0).

์•„๋ฌด๋ฆฌ ๊ตฌ๊ธ€๋งํ•ด๋„ ์•ˆ๋‚˜์™€์„œ ๋‘์‹œ๊ฐ„ ๋‚ ๋ ค๋จน์€ .. Gradle๋กœ JPA queryDsl ์…‹ํŒ… ํ•œ ๋’ค, ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ํ‘ธ์‰ฌ๋ฅผ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํŒ€์› ํ•˜๋‚˜๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋นŒ๋“œ๊ฐ€ ์•ˆ๋œ๋‹ค๋ฉฐ ... ์•Œ๊ณ ๋ณด๋‹ˆ, ํŒ€์›์€ maven์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด ๋กœ์ปฌ ํ”„๋กœ์ ํŠธ๋ฅผ maven์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ (add As maven project) pom.xml์— ๋””ํŽœ๋˜์‹œ๋„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๊ฒƒ์ €๊ฒƒ ์ž‘์—…์„ ํ–ˆ๋‹ค. ์ •์ƒ์ž‘๋™ ํ•˜๋Š”๊ฑฐ ํ™•์ธํ•˜๊ณ  ํ‘ธ์‰ฌ ์™„ ๊ทผ๋ฐ ๋‹ค์‹œ ๋กœ์ปฌ ํ”„๋กœ์ ํŠธ๋ฅผ gradle๋กœ ๋นŒ๋“œ๋ฅผ ํ•˜๋ ค๋‹ˆ๊นŒ, ์ €๋ ‡๊ฒŒ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. ๊ตฌ๊ธ€๋ง์„ ํ•˜๋‹ˆ๊นŒ JDK ๋ฒ„์ „์ด ์•ˆ๋งž์•„์„œ ๊ทธ๋Ÿฌ๋Š”๊ฑฐ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, JDK๋Š” ๊ฑด๋“ค์ง€๋„ ์•Š์•˜์Œ build.gradle ํŒŒ์ผ๋„ ๋ฐ”๊ฟ”๋ณด๊ณ , JDK ๋ฒ„์ „๋„ ์˜ค๋ฅด๋ฝ ๋‚ด๋ฆฌ๋ฝ ๋ฐ”๊ฟ”๋ณด๊ณ  ... ์†Œ์šฉ 0 ๋‘์‹œ๊ฐ„ ๋‚‘๋‚‘๋Œ€๋‹ค๊ฐ€, ..

[JPA] SpringBoot(2.x version)์— QueryDsl JPA ์ ์šฉ (maven ์„ค์ •)

ํŒ€์—์„œ gradle๊ณผ maven์„ ํ˜ผ์šฉํ•ด์„œ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค ใ…œใ…œ 1. Pom.xml (dependency ์ถ”๊ฐ€) com.querydsl querydsl-apt ${querydsl.version} provided com.querydsl querydsl-jpa ${querydsl.version} 2. Pom.xml (plugin ์ถ”๊ฐ€) com.mysema.maven apt-maven-plugin 1.1.3 process target/generated-sources/java com.querydsl.apt.jpa.JPAAnnotationProcessor : maven ์„ค์ • ํ›„, gradle clean > gradle compile > gradle install ์ˆœ์œผ๋กœ ์‹คํ–‰ ๊ทธ๋Ÿผ generated ์— ์ •์˜ํ•œ ์œ„์น˜์— ..

[JPA] SpringBoot(2.x version)์— QueryDsl JPA ์ ์šฉ (gradle ์„ค์ •)

QueryDsl์€ SQL, JPQL ๋“ฑ์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” builder opensource framework ์ด๋‹ค. : ์‚ฌ๋žŒ์ด Query๋ฅผ ์งœ๋‹ค๋ณด๋ฉด ๋ณดํ†ต ์ˆ˜์ž‘์—…์œผ๋กœ ํ•˜๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธธ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š”๋ฐ (String์ด๋‹ค ๋ณด๋‹ˆ) ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. QueryDsl์€ Query ์ƒ์„ฑ์„ ์ž๋™ํ™” ํ•˜์—ฌ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฏ€๋กœ, ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋‚˜ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์— ์žˆ์–ด ํ•œ๊ณ„๊ฐ€ ์žˆ๋Š” ์ˆœ์ˆ˜ JPA๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉํ•œ๋‹ค. ์•„์ง ์‹ค๋ฌด์—์„œ ์“ฐ๊ณ ์žˆ์ง€๋Š” ์•Š์œผ๋‚˜, ์‹ค๋ฌด์— ๋งŽ์ด ์ ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ์–•๊ฒŒ๋‚˜๋งˆ ํŒŒ๋ณด์•˜๋‹ค. 1. build.gradle ์…‹ํŒ… dependencies { ... //querydsl implementation 'com.querydsl:q..

[SpringBoot] SpringBoot์— Swagger(SpringDoc) ์ ์šฉ

springdoc-openapi-ui ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด๋ณด์•˜๋‹ค. 1. build.gradle์— dependencies ์ถ”๊ฐ€ dependencies { ... implementation 'org.springdoc:springdoc-openapi-ui:1.6.14' } 2. application.properties์— ์ถ”๊ฐ€ # swaggerdoc springdoc.packages-to-scan=com.osstem.ow.online springdoc.swagger-ui.version=v1.0.0 springdoc.swagger-ui.path=/api-docs springdoc.swagger-ui.tags-sorter=alpha springdoc.swagger-ui.operations-sorter=alpha sp..

[JPA] error: Attempt to recreate a file for type ~ ...

๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— QueryDSL์„ ์ ์šฉํ•˜๋Š” ์ค‘ ๋ฐœ๊ฒฌํ•œ ์—๋Ÿฌ gradle clean๋„ ํ•ด๋ณด๊ณ (gradle clean ์‹œ, Q๊ฐ์ฒด๋ฅผ ์ง€์šฐ๋„๋ก ์„ค์ •ํ•ด๋‘ ), ๋‹ค์‹œ build๋„ ํ•ด๋ณด์•˜์œผ๋‚˜ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํ•˜๋‹ค. Q๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ํด๋” ์ž์ฒด๋ฅผ ์‚ญ์ œ ํ›„ (๊ฒฝ๋กœ๋Š” build.gradle ํŒŒ์ผ์— ์ •์˜ํ•œ querydslDir) gradle clean > gradle compileQuerydsl์„ ํ•˜๋‹ˆ๊นŒ ์ •์ƒ์ž‘๋™ํ•œ๋‹ค.

[JPA] JPA์—์„œ MySql์˜ Order by Field ์‚ฌ์šฉ๋ฒ• (์ •๋ ฌ ์ˆœ์„œ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•)

1. Entity์—์„œ sorting์šฉ ํ•„๋“œ ์ถ”๊ฐ€ ํ›„, @Formula ์–ด๋…ธํ…Œ์ด์…˜ ์ด์šฉ @Getter @Setter @Entity @Table(name="TABLE") public class Entity { ... @Formula("FIELD(STATUS_NAME, '์ง€์—ฐ', '๊ณ„ํš', '์™„๋ฃŒ')") private String sortingStatus; } 2. find ์‹œ, ์ •๋ ฌ ๊ฐ’ ์…‹ํŒ… List productInfo = testRepo.findAll(Sort.by(Sort.Direction.ASC, "sortingStatus"));

[JPA] @Embeddable๋ฅผ ์ด์šฉํ•œ ๋ณตํ•ฉํ‚ค ์„ค์ •

JPA์˜ ๋ณตํ•ฉํ‚ค ์„ค์ • ๋ฐฉ๋ฒ•์€ @Embeddable ๋˜๋Š” @IdClass๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” @Embeddable ์ด์šฉ year์™€ category๋ฅผ ๋ณตํ•ฉํ‚ค๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ 1. class๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค์— ๋ณตํ•ฉํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ปฌ๋Ÿผ๋“ค์„ ๋ช…์‹œํ•œ๋‹ค. @Data @Embeddable @NoArgsConstructor @AllArgsConstructor public class CategoryPK implements Serializable { @Column(name="YEAR") private String year; @Column(name="CATEGORY_NAME") private String categoryName; } 2. ์„ ์–ธํ•œ ๋ณตํ•ฉํ‚ค ํด๋ž˜์Šค..

[Spring] String Constant Pool

@DisplayName("String literal๋กœ ์ƒ์„ฑํ•œ ๋‘ ๊ฐ์ฒด๋Š” ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋™์ผํ•˜๋‹ค.") @Test void stringLiteral() { String str1 = "abc"; String str2 = "abc"; assertThat(str1).isSameAs(str2); } @DisplayName("new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑํ•œ ๋‘ ๊ฐ์ฒด๋Š” ๊ฐ’์ด ๊ฐ™์•„๋„ ๋™์ผํ•˜์ง€ ์•Š๋‹ค.") @Test void stringNew() { String str1 = new String("abc"); String str2 = new String("abc"); assertThat(str1).isNotSameAs(str2); } String literal๋กœ ์ƒ์„ฑํ•˜๋ฉด, JVM Heap ์˜์—ญ ๋‚ด String Constant Pool์—..

๋ฐ˜์‘ํ˜•