문제
@Test
public void 게시글저장_불러오기(){
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("thdud3410@gmail.com")
.build());
List<Posts> postsList = postsRepository.findAll();
Posts post = postsList.get(0);
assertThat(post.getTitle()).isEqualTo(title);
assertThat(post.getContent()).isEqualTo(content);
}
Post 도메인에 Lombok을 사용해서 Builder 어노테이션을 적용해줬기 때문에 자동으로 builder가 생성될 것이라 기대했다
package fintech_service.fintech_service_backend.domain.posts;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
@Entity
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
@Builder
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
}
하지만 테스트를 진행하면 Lombok을 통해 생성한 builder를 찾을 수 없다는 에러가 발생했다. 🥹
error: cannot find symbol
postsRepository.save(Posts.builder()
^
symbol: method builder()
location: class Posts
해결 방법1
IntelliJ > Settings >.. > Annotation Processors
위의 경로에서 "Enable annotation processiong"을 처리해준다.
Settings > Build,Execution,Deployment > Build Tools > Gradle
위의 경로에서 Build and Run이 Gradle로 되어 있다면 IntelliJ IDEA로 변경해준다.
해결 방법2
Settings > Build,Execution,Deployment > Build Tools > Gradle
위의 경로에서 Build and Run이 Gradle로 되어 있는 상태이다.
build.gradle 파일의 dependency에 아래 코드를 추가해준다
dependencies {
....
annotationProcessor 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
문제 원인
Lombok의 동작원리와 빌드에 대한 원리를 파악하면 된다.
Lombok은 컴파일 시점에 코드를 생성하는 Java 어노테이션 프로세서이다. 실제 런타임 의존성이 아니라 컴파일 시점에만 필요한 의존성이다. 따라서, 프로젝트에 올바르게 적용하기 위해서는 어노테이션 프로세서를 통해 Lombok의 기능을 활성화해야 한다.
- annotationProcessor: 메인 소스 코드에 대한 어노테이션 프로세서를 활성화
- testAnnotationProcessor: 테스트 소스 코드에 대한 어노테이션 프로세서를 활성화
해결방법 1은 IntelliJ을 통해 빌드가 된다. Annotation Processor 활성화 버튼을 누른다면 IntelliJ 내에서 이 기능이 활성화되고 빌드를 할 때 내부적으로 Annotation Processor를 처리할 수 있다.
해결방법 2는 Gradle을 통해 빌드가 된다. IDEA에서 Annotation Processor 활성화 버튼을 눌러도 IntelliJ 내에서만 적용이 된다. Lombok은 컴파일 시점에 코드를 생성하는 Annotation Processor이기 때문에, 코드를 작성할 때 자동완성이나 코드 인식에 적용된다는 뜻이다. 실제 빌드 시스템과는 관련이 없다. Gradle을 통해서 정상적인 빌드를 해주려면 'build.gradle'에 Annotation Processor를 추가해줘야한다.
참고한 글
https://kdevkr.github.io/lombok-annotation-processor/
'Project > SpringBoot를 사용해서 웹 서비스를 만들어보자' 카테고리의 다른 글
템플릿 엔진이란 (0) | 2023.08.22 |
---|---|
Spring 웹 계층 (0) | 2023.08.18 |
자주 사용하는 Lombok 어노테이션 정리 (0) | 2023.08.17 |
JPA Auditing (0) | 2023.08.17 |
mustache 한글 깨짐 오류 (0) | 2023.06.07 |