
Lombok으로 코드 다이어트 하기
롬복은 Java기반에서 VO, DTO, Entity클래스를 생성할 때 반복적으로 작성하는 getter, setter, toString과 같은 작업들을 어노테이션을 사용하여 보다 더 간편하게 개발할 수 있게 도와주는 라이브러리이다.
Lombok을 사용하면
1. 반복되는 코드를 줄여줌으로 코드의 가독성이 좋아진다.
2. 반복되는 코드를 줌여줌으로 생산성이 증가한다.
3. JPA를 사용하고 있는 경우 JPA환경과 일관화됨으로 가독성이 좋은 코드를 작성할 수 있다.
단점도 몇가지 있다.
1. 모든 협업 인원이 lombok을 설치해야한다.
2. @Data @ToString어노테이션으로 자동 생성되는 toString()메서드의 순환참조, 재귀호출 문제로 스택오버플로우가 발생할 수 있다. (자세한 내용은 권남님의 블로그 참고)
설치방법
다양한 IDE를 지원하지만 가장 많이 사용하는 이클립스와 인텔리제이 두 IDE의 설치방법에 대해 알아보겠다. (사실 내가 이 두가지 IDE를 사용한다.)
다른 IDE의 설치방법을 알고싶다면 공식홈페이지의 [Install] 탭에 자세하게 설명되어있다.
이클립스
롬복 공식사이트에서 파일을 다운받고 실행시키면 아래와 같은 화면이 나오고 내 PC에 설치되있는 IDE를 선택하고 "install/Update"버튼을 눌러 설치를 하면 된다.
(이클립스를 실행한 상태에서 설치를 했다면 재시작을 해야한다.)

인텔리제이
인텔리제이의 롬복 설치방법은 비교적 간단하다.
Preferences > Plugins > Browse repositories.. > Lombok 검색 > Install > restart

빌드
설치를 마친 후에 프로젝트에 적용되어 있는 빌드 방식에 따라 lombok을 추가해준다.
Maven
|
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
|
cs |
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'
}
|
cs |
사용방법
VO, DTO클래스를 생성할 때 보통 아래와 같이 생성자, getter, setter, toString이 포함되어있는 코드를 작성하게 된다. IDE에서 Generate해주는 편리한 기능이 있지만 인자가 많아질 수록 코드의 양은 늘어나고 가독성 또한 떨어진다.
Lombok을 적용하지 않은 Class
|
public class TestVO {
private long id;
private String name;
private String nickName;
private double weight;
private double height;
public TestVO() {}
public TestVO(long id, String name, String nickName, double weight, double height) {
this.id = id;
this.name = name;
this.nickName = nickName;
this.weight = weight;
this.height = height;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public String toString() {
return "TestVO{" +
"id=" + id +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
", weight=" + weight +
", height=" + height +
'}';
}
}
|
cs |
Lombok을 적용한 코드
@Getter @Setter @ToString @NoArgsConstructor @AllArgsConstructor 다섯가지 어노테이션을 사용함으로 코드의 양을 줄일 수 있을 뿐만 아니라 가독성 또한 좋아진다.
|
import lombok.*;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class TestVO {
private long id;
private String name;
private String nickName;
private double weight;
private double height;
}
|
cs |
위 다섯가지의 어노테이션을 모두 사용할 경우에는 @Data 어노테이션 하나면 더 깔끔하게 적용할 수 있다.
하지만 @Data어노테이션은 가급적 지양하도록 한다.(lombok 사용 시 주의해야 할 점)
|
import lombok.*;
@Data
public class TestVO {
private long id;
private String name;
private String nickName;
private double weight;
private double height;
}
|
cs |
이렇게 롬복을 적용하게 되면 작업성과 코드의 가독성 두 가지 이점을 얻을 수 있다.
자주 사용되는 어노테이션
lombok에서 자주 사용되는 어노테이션을 정리해본다.
접근자 / 설정자 자동 생성 관련 어노테이션
@Getter와 @Setter
@Getter는 모든 필드에 대해서 getter메서드를 생성해주며, @Setter는 모든 non-final 필드의 setter메서드를 생성해준다.
(@Setter사용시 유의해야 할 점 : 무분별한 @Setter어노테이션의 사용은 지양한다. Setter는 객체를 언제든지 변경할 수 있는 상태가 되어서 변경되지 않아야할 필드에 @Setter를 적용하는 경우에는 객체의 안전성이 보장받을 수 없다. )
|
import lombok.*;
@Getter
@Setter
public class TestVO {
private long id;
private String name;
private String nickName;
private double weight;
private double height;
}
|
cs |
toString을 자동으로 생성해 주는 어노테이션
@toString
toString() 메서드를 생성해주는 어노테이션이다. 특정 필드값을 제외처리 하고자 할 때는 exclude를 사용하여 제외 대상 필드를 지정하면 된다.
|
import lombok.*;
@ToString(callSuper = true, exclude = "nickName")
public class TestVO {
private long id;
private String name;
private String nickName;
private double weight;
private double height;
}
|
cs |
생성자 관련 어노테이션
@NoArgsConstructor
파라미터가 없는 생성자를 만들어주는 어노테이션이다.
@AllArgsConstructor
모든 필드값을 파라미터로 받는 생성자를 만들어주는 어노테이션이다.
@RequiredArgsConstructor
접근제어자 final이나 notNull인 필드값만 받아 생성자를 만들어 주는 어노테이션이다.
|
import lombok.*;
import javax.validation.constraints.NotNull;
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class TestVO {
@NotNull
private long id;
private String name;
private String nickName;
private double weight;
private double height;
}
|
cs |
@NotNull
@Notnull어노테이션은 Class위에서는 사용이 되지 않는다. Class내 필드값에 직접 사용한다. (위 코드 참고)
@Builder
클래의 다수의 필드값이 있는 경우 생성자를 만들 때 필드값이 많고 순서 또한 맞춰서 파라미터값을 입력해야 하기 때문에 코딩할 때 불편한 경우가 있다.
@Builder어노테이션을 사용하게 되면 자동으로 빌더패턴을 생성해줌으로 작업하는데 많은 도움을 준다.
|
import lombok.*;
import javax.validation.constraints.NotNull;
@Builder
public class TestVO {
@NotNull
private long id;
@NotNull
private String name;
private String nickName;
private double weight;
private double height;
// @Builder 적용 예시
public class BuilderExClass {
TestVO testVO = TestVO.builder()
.id(1L)
.nickName("nickName")
.name("green")
.height(80)
.height(180)
.build();
}
}
|
cs |
롬복을 사용하면서 자주 사용되는 어노테이션이 있으면 추가로 작성할 예정이다.
이렇게 lombok어노테이션을 잘 활용하면 작업성과 가독성의 두 마리 토끼를 잡을 수 있게 된다. 하지만 사용할 때 JPA와 같은 ORM등과 같이 사용할 때 발생할 수 있는 오류들에 대해 염두해두고 사용해야한다.
공식 문서도 잘 설명되어 있는 편이라서 참고해보면 좋다.
'Java' 카테고리의 다른 글
| [Java] 휴대폰 번호 마스킹 처리 (0) | 2018.02.22 |
|---|---|
| [Java]java.lang.UnsupportedClassVersionError... Unsupported major.minor version 52.0 (0) | 2018.02.09 |
| [Java]이름 마스킹 처리 (0) | 2018.02.08 |