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 에러가 발생하지 않는다.
오늘도 문제해결!!
'자바 > Spring Boot' 카테고리의 다른 글
| [EventListener] @TransactionalEventListener 사용하기 (0) | 2023.04.27 |
|---|---|
| [Jackson ObjectMapper] ObjectMapper 빈으로 설정 시 UnrecognizedPropertyException 발생할 때 해결 (0) | 2023.04.19 |