๐Ÿ“˜ Web/Spring, JPA

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

a n u e 2023. 7. 19. 11:44

 

ํŒ€์—์„œ gradle๊ณผ maven์„ ํ˜ผ์šฉํ•ด์„œ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค ใ…œใ…œ


1. Pom.xml (dependency ์ถ”๊ฐ€)

 

<!-- querydsl -->
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>${querydsl.version}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${querydsl.version}</version>
    </dependency>

 

 

2. Pom.xml (plugin ์ถ”๊ฐ€)

<!-- querydsl -->
    <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <version>1.1.3</version>
        <executions>
            <execution>
                <goals>
                    <goal>process</goal>
                </goals>
                <configuration>
                    <outputDirectory>target/generated-sources/java</outputDirectory>
                    <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                </configuration>
            </execution>
        </executions>
    </plugin>

 

  : maven ์„ค์ • ํ›„, gradle clean > gradle compile > gradle install ์ˆœ์œผ๋กœ ์‹คํ–‰

 ๊ทธ๋Ÿผ generated ์— ์ •์˜ํ•œ ์œ„์น˜์— ์ƒˆ๋กœ์šด ๋””๋ ‰ํ† ๋ฆฌ์™€ ํ•จ๊ป˜ Qclass ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

Qclass๋Š” Entity๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ

JPAAnnotationProcessor๊ฐ€ ์ปดํŒŒ์ผ ์‹œ์ ์— @Entity ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ฐพ์•„ ๋ถ„์„ํ•ด ๋งŒ๋“ ๋‹ค.

(์—”ํ‹ฐํ‹ฐ์™€ ๋™์ผํ•œ ํŒŒ์ผ ๋ช… ์•ž์— Q๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค.)

QueryDsl์€ ์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ, ์ด๋Ÿฌํ•œ Qclass๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Query๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

 

 


2.  Config ์„ค์ •

@Configuration
public class QueryDslConfig {
	@PersistenceContext
    private EntityManager entityManager;
    @Bean
    public JPAQueryFactory jpaQueryFactory() { return new JPAQueryFactory(entityManager); }
}

  : JPAQueryFactory๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•ด ํ”„๋กœ์ ํŠธ ์ „์—ญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

โ— JPAQueryFactory ๊ฐ์ฒด๊ฐ€ import ๋˜์ง€ ์•Š์•„์„œ ๊ณ ์ƒ์„ ๋งŽ์ด ํ–ˆ๋Š”๋ฐ intellij ์บ์‹œ ์‚ญ์ œ ํ•˜๋‹ˆ๊นŒ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐ๋๋‹ค ;;;;

๋‚ด์‹œ๊ฐ„ ๋Œ๋ ค์ค˜์š” ;;; ๋™์ผ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ,  File > invalidate Caches ๋ฅผ ๋ˆŒ๋Ÿฌ ์บ์‹œ ์‚ญ์ œํ•˜๊ธฐ

 

 


 

3.  .gitignore ์„ค์ • (๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ $buildDir/generated/querydsl์ธ ๊ฒฝ์šฐ ํŒจ์Šค)

  :  build.gradle ํŒŒ์ผ์—์„œ "$buildDir/generated/querydsl" ๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์ฃผ์—ˆ์œผ๋ฉด ์ƒ๊ด€์—†์œผ๋‚˜

 (build ๋ฃจํŠธ๋Š” ์• ์ดˆ์— .gitignore์— ์„ค์ •๋˜์–ด ์žˆ์Œ)

๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” build ๋ฃจํŠธ๋กœ ๋งŒ๋“ค๋ฉด Qclass๊ฐ€ ์ œ๋Œ€๋กœ import๋˜์ง€ ์•Š์•„์„œ, src ์•„๋ž˜์— ํด๋”๋ฅผ ๋งŒ๋“ค๋„๋ก ํ–ˆ๋‹ค.

 

.gitignore์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฒ„์ „๊ด€๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

/src/main/generated/

 


 

๊ทธ๋Ÿผ ์ด์ œ ๊ธฐ๋ณธ์ ์ธ ์…‹ํŒ…์€ ๋๋‚ฌ์œผ๋‹ˆ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž !

 

 SELECT * FROM TEST WHERE FIELD_1 IN ('ํ…Œ์ŠคํŠธ1', 'ํ…Œ์ŠคํŠธ2');


0. Entity

@Entity
@Getter
@Setter
@Table(name = "testTable")
public class Test {
	@Id
	@column(name = "field_1")
    private String field1;
}

 

 1. Controller์— ํ…Œ์ŠคํŠธ์šฉ ์กฐํšŒ API ์ถ”๊ฐ€

@PostMapping("/Test")
public ResponseEntity select(@RequestBody String[] arr) {
	return new ResponseEntity(service.select(arr), HttpStatus.OK);
}

 

 

2. Service

public List<Test> select(String[] arr) {
	List<Test> rslt = testRepo.findByField1(arr);
	return rslt;
}

 

 

3. Repository

@Repository
public interface TestRepo extends JpaRepository<Test>, TestRepoCustom {
}

 

 

4. RepositoryCustom

public interface TestRepoCustom {
	List<Test> findByField1(String[] arr);
}

 

5. RepositoryImpl

@RequiredArgsConstructor
public class TestRepoImpl implements TestRepoCustom {
	private final JPAQueryFactory jpaQueryFactory;
    
    @Override
    public List<Test> findByField1(String[] arr) {
    	return jpaQueryFactory
        .selectFrom(test)
        .where(test.field1.in(arr))
        .fetch();
    }
}