Lombok(롬복)은 Java 라이브러리로, 반복되는 getter, setter, toString 등의 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리입니다. 보통 Model 클래스나 Entity 같은 도메인 클래스 등에는 수많은 멤버 변수가 있고, 이에 대응되는 getter와 setter, 그리고 toString() 메서드와 멤버 변수에 따른 여러 생성자를 만들어야 합니다. 대부분의 경우, 이클립스 같은 IDE의 도움을 받아 생성한다고 하지만, 이 역시도 번거로운 작업이 될 수 있습니다. 뿐만 아니라, 코드 자체가 반복되는 메서드로 인해 매우 복잡해질 수 있습니다.
Lombok은 여러 가지 어노테이션을 제공하고, 이를 기반으로 코드를 컴파일 과정에서 생성해 주는 방식으로 동작하는 라이브러리입니다. 즉, 코딩 과정에서는 롬복과 관련된 어노테이션만 보이고, getter와 setter 메서드 등은 보이지 않지만, 실제로 컴파일된 결과물(.class)에는 코드가 생성되어 있다는 뜻입니다.
Lombok 사용 시의 장점과 주의사항
장점
롬복은 복잡하고 반복되는 코드가 줄어들면서 코드의 가독성을 높일 수 있고, 코딩 생산성 또한 높일 수 있습니다. 이는 개발자가 핵심 비즈니스 로직에 더 집중할 수 있게 도와줍니다.
주의사항
롬복은 개발자마다 호불호가 나뉘는 라이브러리입니다. 특정 개발자들은 코드가 직접 눈에 보임으로써 직관성을 유지하는 것이 좋다고 보는 반면, 다른 개발자들은 롬복의 간편함을 선호합니다. 따라서 자신의 프로젝트나 프로젝트 리더의 성향에 따라 사용하는 것이 좋습니다.
또한, 편리성을 제공하는 라이브러리일수록 주의할 사항이 있습니다. API 설명과 내부 동작을 어느 정도 숙지하고 사용해야 합니다. 예를 들어, Lombok의 @Data 어노테이션이나 @ToString 어노테이션으로 자동 생성되는 toString() 메서드는 순환 참조 또는 무한 재귀 호출 문제로 인해 StackOverflowError가 발생할 수도 있습니다. 물론, 이 문제를 인지한 Lombok에서 해결할 수 있는 속성들을 제공하지만, 롬복이 편리하다는 이유만으로 무분별하게 사용하면 여러 가지 문제가 발생할 수 있습니다.
Lombok과 일반 Java 코드의 차이
일반 Java 코드
예를 들어, Category라는 모델 클래스가 있다고 가정해 보겠습니다. 보통 우리는 다음과 같은 코드를 작성하게 됩니다.
public class CategoryModel {
private String id;
private String parentId;
private String name;
private Long depthLevel;
private Long seq;
private String userYn;
public CategoryModel() {}
public CategoryModel(String id, String parentId, String name, Long depthLevel, Long seq, String userYn) {
super();
this.id = id;
this.parentId = parentId;
this.name = name;
this.depthLevel = depthLevel;
this.seq = seq;
this.userYn = userYn;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getDepthLevel() {
return depthLevel;
}
public void setDepthLevel(Long depthLevel) {
this.depthLevel = depthLevel;
}
public Long getSeq() {
return seq;
}
public void setSeq(Long seq) {
this.seq = seq;
}
public String getUserYn() {
return userYn;
}
public void setUserYn(String userYn) {
this.userYn = userYn;
}
@Override
public String toString() {
return "CategoryModel[id=" + id + ", parentId=" + parentId + ", name=" + name + ", depthLevel=" + depthLevel
+ ", seq=" + seq + ", userYn=" + userYn + "]";
}
}
그러나 위의 코드를 Lombok을 이용하면 아래와 같이 바뀔 수 있습니다. 클래스에 @Getter, @ToString 등의 어노테이션을 붙여주기만 하면 됩니다.
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class CategoryModel {
private String id;
private String parentId;
private String name;
private Long depthLevel;
private Long seq;
private String userYn;
}
만약 위의 5가지 어노테이션을 붙이는 것조차 부담스럽다면, @Data 어노테이션 하나만 붙여 사용할 수도 있습니다.
@Data
public class CategoryModel {
private String id;
private String parentId;
private String name;
private Long depthLevel;
private Long seq;
private String userYn;
}
광고
Lombok을 사용한 로그 작성
보통의 프로젝트에서 Log4j나 Slf4j 같은 로깅 프레임워크를 사용하는데, 항상 다음과 같이 비즈니스 로직과는 별개로 불필요한 코드가 작성되게 됩니다.
public class CategoryServiceImpl {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(CategoryServiceImpl.class);
// 생략
}
그러나 롬복에서는 다음과 같이 사용이 가능합니다. 아래와 같이 @Slf4j 같은 Logger 어노테이션을 붙여주면 log라는 변수로 로깅을 사용할 수 있습니다.
@Slf4j
public class CategoryServiceImpl {
// 생략
}
Lombok 적용 방법
본격적으로 프로젝트에 롬복 적용 방법을 알아보도록 하겠습니다. 이번 글에서는 Eclipse 기반의 프로젝트에서 적용하는 방법을 알아보고, 이후 IntelliJ에서 적용하는 방법을 포스팅하도록 하겠습니다.
롬복 라이브러리 추가
롬복은 @Getter, @Setter 등 어노테이션을 사용하는데, 이러한 API를 사용하기 위해 롬복 라이브러리(.jar) 파일을 추가해 주어야 합니다. .jar 파일을 직접 내려받아 class path 상에 추가해도 되지만, 메이븐 프로젝트의 경우 pom.xml에 아래와 같이 의존성을 추가해 주면 됩니다.
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
그레이들의 경우 build.gradle에 다음과 같이 사용할 수 있습니다.
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.12'
annotationProcessor 'org.projectlombok:lombok:1.18.12'
testCompileOnly 'org.projectlombok:lombok:1.18.12'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.12'
}
자세한 내용은 Lombok 공식 사이트를 참조하십시오.
만약 직접 lombok.jar를 내려받아 프로젝트에 추가하려는 경우 Lombok 다운로드 페이지에 접근하여 다운로드할 수 있습니다.
롬복 설정
프로젝트에 롬복 라이브러리 의존성을 추가했다면, 이제 @Getter나 @Setter 등의 API를 사용할 수 있게 되었습니다. 다만, 이 상태로는 API를 사용할 수 있게 된 것일 뿐, 실제로 코드가 생성되지는 않습니다. 이클립스나 IntelliJ 같은 IDE의 경우, 우리가 개발 시에 코드를 수정할 때마다 실시간으로 컴파일을 진행하는데, 롬복을 인식하고 코드를 자동으로 생성해주지 않기 때문입니다. 따라서 추가적인 작업이 필요합니다.
예를 들어, 메이븐을 이용했다면 라이브러리는 다음과 같은 경로에 존재할 것입니다.
C:\Users\[자신의 win 사용자 계정]\.m2\repository\org\projectlombok\lombok\1.18.12
만약 디렉터리를 찾아가는 것이 귀찮다면, 위의 라이브러리 다운로드 URL에 접근하여 내려받으십시오.
이제 명령행(cmd)를 열고 롬복 라이브러리가 있는 경로로 이동한 후에 java -jar 명령어를 실행하여 롬복 라이브러리를 실행합니다. 롬복 라이브러리는 프로젝트에 사용되는 라이브러리이기도 하지만, 동시에 이클립스의 컴파일러 기능에 롬복의 기능을 추가해주는 역할도 합니다.
> cd C:\Users\[자신의 win 사용자 계정]\.m2\repository\org\projectlombok\lombok\1.18.12
> java -jar lombok-1.18.12.jar
정상적으로 실행되면 설치 화면이 나타납니다. 여기서 Specify location...을 클릭합니다. 만약 이클립스 경로를 자동으로 인식한다면, 이 과정을 건너뛰셔도 좋습니다.
롬복의 컴파일 기능을 추가하고 싶은 Eclipse의 eclipse.exe 실행 파일을 선택하고 Select를 클릭합니다. 사용하는 이클립스나 STS, eGov 등 여러 개의 경로를 선택할 수 있습니다.
Install / Update를 클릭합니다.
설치가 성공적으로 완료되면, 이클립스를 재시작합니다. 만약 제대로 적용되지 않았다면, 이클립스를 종료한 상태로 과정을 다시 실행해 보십시오.
Lombok 적용 후 테스트
이클립스 프로젝트 생성 후, 앞서 언급한 것처럼 롬복 라이브러리를 메이븐(pom.xml) 등을 이용하거나 프로젝트 설정의 Class Path 설정 등을 통해 추가합니다. 이후, 클래스를 하나 작성합니다.
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class CategoryModel {
private String id;
private String parentId;
private String name;
private Long depthLevel;
private Long seq;
private String userYn;
}
위 코드에서는 멤버 변수만 존재하고 두 가지 어노테이션만 추가했을 뿐인데, 실제 내부적으로는 getter와 setter가 추가된 것을 볼 수 있습니다. 이는 이클립스가 실제 컴파일된 결과물에 메서드를 생성하고 이를 인식했기 때문입니다.
실제로 코드를 작성할 때 코드 힌트 목록에도 여러 set* 메서드들이 생성된 것을 알 수 있습니다.
결론
롬복은 Java 개발자들에게 많은 편리함을 제공합니다. 복잡하고 반복되는 코드를 줄여주고, 코드의 가독성을 높이며, 생산성을 크게 향상시킵니다. 그러나, 롬복을 사용할 때는 반드시 그 내부 동작을 이해하고, 주의사항을 숙지해야 합니다. 올바르게 사용하면 큰 도움이 되지만, 무분별하게 사용할 경우 예상치 못한 문제가 발생할 수 있습니다. 따라서 프로젝트의 성격과 팀의 성향에 맞춰 적절하게 사용하는 것이 중요합니다.
'IT > 자바' 카테고리의 다른 글
[자바] File 클래스 renameTo() 사용 예제 (0) | 2024.01.15 |
---|---|
자바에서 티로사용중 발생한 "JDBC-90609: Invalid column index" 오류 해결방법 (2) | 2024.01.12 |
[Java] 랜덤함수 math.random Random 비교 (java vs jsp) (0) | 2023.11.01 |
[JAVA] 문자 to Double 형 변환 (0) | 2023.10.18 |
[JAVA] MultiData for문 사용시 데이터 추출 방법 (0) | 2023.10.18 |