스프링을 사용하면서, 클래스를 생성할 때마다 매번 getter와 setter 메서드를 추가하는 것이 귀찮았는데, 알고 보니까 Lombok 라이브러리를 추가하면 @Getter, @Setter만으로 끝낼 수 있었다.
그렇다면 라이브러리를 추가해줘야 하는데, 이 라이브러리는 어떻게 추가해야 할까?
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
먼저 build.gradle에 위와 같이 lombok 라이브러리를 추가해줘야 한다. (아래 두 줄)
그렇다면, lombok을 추가하기 위해 'org.projectlombok:lombok' 이걸 추가하면 된다는 것을 어떻게 알까?
[Maven Repository] https://mvnrepository.com/
해당 사이트를 들어가서 원하는 라이브러리를 검색한다.
'lombok'을 검색해서 들어가면
위와 같은 창이 나오는데, 원하는 버전을 클릭한다.
그리고 원하는 빌드 도구를 클릭해서 나온 텍스트를 추가하면 된다.
나는 'Gradle (Short)'를 선택했다.
(참고로 Gradle (Short)는 Gradle을 짧게 표현한 것이다.)
여기에서 버전 명시를 안하면, gradle이 현재 내 스프링 버전에 적합한 버전으로 알아서 설치해준다고 한다.
(참고로 나는 버전 명시를 안해서 1.18.32 버전으로 설치되었다.)
어쨌든 저렇게 build.gradle에 dependency를 추가하면
이렇게 External Libraries에 lombok이 추가된다.
그런데 여기에서 잠깐, CompileOnly는 뭐지?
CompileOnly는 Gradle Dependency의 키워드 중 하나이다.
키워드에는 대표적으로 다음과 같은 것들이 있다.
implementation: 프로젝트의 컴파일 시간과 실행 시간 모두에 의존성 추가
compileOnly: 컴파일 시간에만 필요한 의존성 추가, 실행시간에는 포함되지 않음
runtimeOnly: 실행시간에만 필요한 의존성 추가, 컴파일 시간에는 포함되지 않음
testImplementation: 테스트 컴파일 시간과 실행 시간에만 필요한 의존성 추가, 주로 단위 테스트나 통합테스트를 위한 라이브러리
AnnotationProcessor: 컴파일 단계에서 Annotation에 정의된 일렬의 프로세스를 동작하게 함
그런데 이때 lombok은 compileOnly이다.
왜지?
그 이유를 찾기 위해 out 폴더에 들어있는 .class를 살펴보았다.
먼저, Accommodation.java 코드는 다음과 같다.
// Accommodation.java // lombok 추가 전
public class Accommodation {
private String name;
private int minPrice;
}
그리고 컴파일 하고 나서 생성된 Accommodation.class의 코드를 살펴보면 다음과 같다.
// Accommodation.class // lombok 추가 전
public class Accommodation {
private String name;
private int minPrice;
public Accommodation() {
}
}
이제 build.gradle에 lombok을 추가하고 다음과 같이 lombok의 @Getter와 @Setter를 코드에 추가하였다.
참고로 lombok은 compileOnly 외에도 annotationProcessor도 추가해줘야 하며, 'settings > compile'에서 Enable annotation processing
에 체크해줘야 한다.
그리고 이렇게 dependency를 추가해줘도 lombok이라는 플러그인을 설치해야 한다.
// Accommodation.java // lombok 추가 후
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Accommodation {
private String name;
private int minPrice;
}
@Getter와 @Setter을 추가하고 나서, 다시 컴파일 하고 Accommodation.class 파일을 확인하면,
// Accommodation.class // lombok 추가 후
public class Accommodation {
private String name;
private int minPrice;
public Accommodation() {
}
public String getName() {
return name;
}
public int getMinPrice() {
return minPrice;
}
public void setName(String name) {
this.name = name;
}
public void setMinPrice(int minPrice) {
this.minPrice = minPrice;
}
}
위와 같이 getter와 setter가 추가된 것을 볼 수 있다.
물론 Accommodation.java에는 해당 메서드들이 추가되지 않았다.
즉, @Getter와 @Setter는 컴파일 시간에 getter와 setter 메서드들을 생성하는 것으로 역할이 끝난 것이고, 런타임 시간에는 생성된 getter와 setter를 이용하여 실행을 한다.
따라서 @Getter와 @Setter는 컴파일 시간에만 필요하기 때문에 compileOnly로 lombok 의존성을 추가한 것이다.
필요 없는 런타임 시간에도 의존이 되도록 해버리면 효율성이 너무 떨어지기 때문에...!
컴파일 과정을 거치면 out 폴더에 있는 Accommodation.class 파일에 getter와 setter 메서드가 추가된다.
그리고 이후 런타임 과정에서는 Accommodation.class 파일만 필요하므로 더 이상 @Getter와 @Setter는 필요가 없다.
따라서 lombok은 컴파일 과정에서만 필요하므로 compileOnly 키워드를 사용하는 것이 효과적이다. 물론, 빌드 과정에서는 Accommodation.class 파일을 사용하므로 결과물에는 포함된다.