Config Client 와 QueryDSL 충돌 문제

알파로그·2023년 6월 27일
0

Error

목록 보기
29/37
post-custom-banner

✏️ 발단

  • 기존 모놀리스 프로젝트를 MSA 방식으로 전환하기 위해 프로젝트 세팅을 하던중 QueryDSL 라이브러리를 추가했더니 Config Server 와 통신이 안되는 문제가 발생했다.
  • Config Server Dependency
// Spring Cloud Config client
implementation 'org.springframework.boot:spring-boot-starter-actuator' // Actuator
implementation 'org.springframework.cloud:spring-cloud-starter-config' // Config Client
  • Query DSL Dependency
// QueryDsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
  • 이 문제는 논리오류로 발생해 어떤 이유 때문에 Config Server 와 연결이 실패되는지 알 수 없었다.
    • 하나하나 주석처리를 해가며 확인을 해본 결과 com.querydsl:querydsl-apt 에서 문제가 발생하는것을 확인할 수 있었다.
      • 이 라이브러리는 Q타입 Class 를 자동 생성해주는 라이브러리라고 한다.

✏️ 문제 원인

📍 내 로컬환경에 문제가 있을 경우 — 아님

  • 구글링을 해봐도 정보가 전혀 없고, GPT 에 물어봐도 추측만 할 뿐이였다.
    • 너무 정보가 없어서 혹시 이 둘이 충돌하는 것이 아닌 내 로컬에 문제가 있을 수 있다고 생각했다.
    • 같이 프로젝트를 진행중인 우영님도 의존관계를 추가하니 똑같은 문제가 발생했다.

📍 내부 라이브러리에 같은 이름을 가진 Class 가 존재할 경우

  • 논리 오류기도 하고, 구글링에도 정보가 전혀 없어서 믿음직 스럽지는 못하지만 GPT 에 의존할 수 밖에 없었다.
    • GPT 도 추측일 뿐이지만 두 라이브러리에 같은 이름을 가진 Class 가 존재해 충돌하는 것 같다고 한다.

✏️ 문제 해결

  • GPT 가 알려준 문제를 해결하는 방법은 서로 다른 모듈로 분리해서 사용하거나 버전 정보를 변경해 충돌을 피하는 방법이 있다고 한다.
    • 기존 라이브러리를 변경해주니 정상적으로 Q타입 객체가 생성되고 Config Server 와 연결도 되었다.
// QueryDsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" // 버전 변경
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

📍해결 과정

  • 아래 명령어로 dependencies 의 status 를 확인해봤다.
./gradlew dependencies
  • 문제가 되는 부분을 찾아냈다
    • 성공한곳
      • implementation
    • 실패한 곳
      • compileClasspath
      • productionRuntimeClasspath
      • runtimeClasspath
      • testCompileClasspath
      • testRuntimeClasspath

  • 위와 같이 확인을 했고, Spring boot 3.x 버전부터 아래와 같은 javax 가 아닌 jakarta 로 되어야 하는데,
    apt 는 javax 로 되어있다는 것을 확인했다.

  • Spring boot 3.x 버전에 맞는 디펜던시로 수정해 문제를 해결했다.

⚠️ 그럼 이 전엔 왜 작동되었을까?

  • 이 부분이 환경변수로 되어있었는데,
    intellij 로 실행할 땐 플러그인이 되어있어 jakarta 로 나왔다.
  • 하지만 Spring Cloud 를 gadlew - docker 로 빌드해 EC2 에서 실행하고 있기 때문에 충돌이 난것 같다.
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
profile
잘못된 내용 PR 환영
post-custom-banner

0개의 댓글