개발 공부 기록
728x90

Builder를 이용하여 코드를 짜고 빌드를 하면 cannot find symbol 에러가 발생했다.

 

아래는 해당 예시이다.

예시

DTO User class 코드

@Builder
@Getter
public static class User {

    private String name;
    private Integer age;
}

Builder를 이용하는 UserService class 코드

import example.dto.User;
import example.dto.UserBuilder;

@Service
public class UserService {

    UserBuilder user = User.builder().name("만두");

    //다른 로직

    user.age(100).build();
}

User user = User.builder().name("만두").age(100).build();

형식으로 해도 됐지만 중복 코드를 줄이기 위해 부득이하게 UserBuilder 를 사용해야 했다.

 

이런 코드로 compileQuerydsl 을 하자

error: cannot find symbol
import example.dto.UserBuilder;

라는 오류가 발생했다.

이미 클래스 자체에 어노테이션으로 빌더패턴임을 명시했는데 왜 빌더를 못찾는걸까, 열심히 구글링을 하니 원인과 해결 방법을 알 수 있었다.

 

원인

Lombok과 QueryDsl의 충돌

구글링 했을 때 많이 나오는 인텔리제이 어노테이션 설정 등은 Q클래스에 대한 내용이기 때문에 Q클래스를 못찾는 것이 아니라 도움이 되지 않았다. 그러다 찾은 블로그!

https://husheart.tistory.com/160

 

QueryDsl with Lombok

QueryDsl 과 Lombok 같이 사용시 cannot find symbol 에러를 만났다 Lombok이 코드를 만들기 전에 QueryDsl 이 먼저 컴파일을 작업하여 롬복이 만들어낼 코드를 찾을수 없다고 에러를 띄운다. 아래와 같이 build.

husheart.tistory.com

@Builder 어노테이션은 lombok 라이브러리에 속해있다.

따라서 롬복이 먼저 실행되지 않으면 QueryDsl을 실행시켰을 때 롬복으로 인해 생성되는 클래스를 못찾는 것이었다. 비단 Q클래스만 생성되지 않는다고 해서 나는 오류는 아니었다.. (UserBuilder 쓴 부분은 QueryDsl 관련 코드 전혀아니었음)

 

해결

gradle 설정

결국 블로그에 나오는 것처럼 build.gradle 에 해당 내용을 추가해주었다.

project.afterEvaluate {
	project.tasks.compileQuerydsl.options.compilerArgs = [
			"-proc:only",
			"-processor", project.querydsl.processors() +
					',lombok.launch.AnnotationProcessorHider$AnnotationProcessor'
	]
}

compileQuerydsl 을 하기 전 lombok의 AnnotationProcessor를 먼저 실행시켜 빌더클래스를 만드는 것이다.

이렇게 하면 cannot find symbol 에러가 발생하지 않는다.

 

오늘도 문제해결!!

728x90
profile

개발 공부 기록

@찐만두

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!