현재 프로젝트를 진행하면서 한 프로젝트에 JPA(RDB:mysql), Mongo(Mongo)를 같이 쓰고 있는 중입니다.
다름이 아니라 Mongo도 QueryDSL이 있는 것을 파악하고 pom.xml에 build될 때 @Document가 있는 클래스도 Q클래스가 생성될 수 있도록 하려고 합니다.
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-mongodb</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>javassist</artifactId>
<groupId>org.javassist</groupId>
</exclusion>
</exclusions>
</dependency>
<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>
<processors>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
<processor>org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor</processor>
</processors>
</configuration>
</execution>
</executions>
</plugin>
이렇게 하니 maven clean & compile을 수행하니,
error: Attempt to recreate a file for type 들이 쭉 뜨고,
error: cannot find symbol Q클래스들을 찾을 수 없다고 쭉 뜹니다.
그리고서 Q클래스가 제대로 생성되지 않은채로 빌드가 끝납니다.
혹시 Jpa QueryDSL, Mongo QueryDSL을 함께 쓰시는 법을 아시나요?
안녕하세요. 래셔널님
제가 Querydsl Mongo를 사용해보지 않아서 이 부분은 저도 잘 모르겠습니다.
혹시 아시는 분 있으면 답변 부탁드립니다.
감사합니다.
답글
보완질문..
https://taekwang.tistory.com/25
위 블로그를 보고 mysql querydsl 이 이미 설정된 프로젝트에 적용해 봤는데
질문자 처럼 문제가 발생합니다.
maven generate-source를 해주면 다시 동적클래스가 생성되긴 하는데,
소스 수정할때 마다 다시 빌드되면서 mysql 쪽 Q 클래스가 삭제되고 mongodb의 Q클래스가 생성됩니다.
mavne 에서 mysql querydsl plugin execution과 mongodb의 querydsl plugin execution 이
시간차를 두고 간섭이 있는것 같은데,
관련 설정이나 대응방법을 못찾겠네요. ㅠ.ㅠ
도와주실 분 없을까요...
답글
Jeck Joy
2022.09.14(임시방편)
mysql과 mongodb 두가지의 querydsl 설정과정에서
[pom.xml 설정]
maven build plugin의 execution 설정으로
generated-sources/java 경로에 동적클래스를 생성하도록 적용하면
[결과]
소스 수정 등의 빌드를 실행할 때, 두번째 execution 을 수행하며
앞서 생성한 동적클래스를 삭제하는듯 합니다.
다시 프로젝트의 Run As 에서 maven generate-sources 를 실행하면 다시 동적쿼리를 생성하지만, 비정상적인 동작으로 보여지고, 매번 불필요한 작업을 반복할 수 없다고 생각했습니다.
[꼼수 - ecipse]
프로젝트의 properties 속성에서
> Builders > Maven Project Builder 체크해제
소스 수정시 build 과정에서 java, boot 빌드만 진행하여 maven의 generate-sources 미실행
- 동적클래스 삭제하지 않음
* 주의점 : entity, documnet 등의 동적클래스 생성과 관련된 작업을 하실 경우
- Run As > maven generate-sources 를 실행하시면 현행화된 동적 클래스를 사용할 수 있습니다.
[정리]
mwserice properties builder 설정변경
- mswservice > properties > Builders 화면
> Maven Project Builder 체크해제
mwserice maven clean
- mwservice > Run As > 6 Maven clean
mwserice maven generated-source
- mwservice > Run As > 7 Maven generate-source 수동 실행
mwserice maven install
- mwservice > Run As > 8 Maven install
어떻게든 pom.xml 이나 소스로 동적클래스 삭제현상을 극복해보려 했으나,
식견이 부족하여 꼼수로 대체하고 있습니다.
관련해서 좀 더 세련된 대응법을 아시면 부디 공유 부탁드립니다.