lombok : http://www.projectlombok.org/
출처 : http://gitblog.ihoney.pe.kr/blog/2013/01/23/use-lombok-annotation-in-java-project/
Lombok을 사용해봅시다.
자바에서 DTO, VO, Domain Object 만들다보면, 멤버필드에 대한 Getter/Setter 메소드,
Equals, hashCode, ToString과 멤버필드에 주입하는 생성자를 만드는 코드 등으로 불필요하게 코드가 길어지는
경우를 볼 수가 있다. 불필요하지만 생성해야 하는 코드들을 줄일 수 있는 방법이 있다면, 얼마나 좋을까?
Project Lombok 소개
적용사례
Lombok annotation을 적용하지 않은 현재 스터디에서 사용하는 User domain 코드
package net.slipp.domain.user;
public class User {
private String userId;
private String password;
private String name;
private String email;
public User(String userId, String password, String name, String email) {
this.userId = userId;
this.password = password;
this.name = name;
this.email = email;
}
public String getUserId() {
return userId;
}
public String getPassword() {
return password;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public boolean matchPassword(String loginPassword) {
if (loginPassword == null) {
return false;
}
return loginPassword.equals(password);
}
public void update(User user) {
this.userId = user.getUserId();
this.password = user.getPassword();
this.name = user.getName();
this.email = user.getEmail();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((password == null) ? 0 : password.hashCode());
result = prime * result + ((userId == null) ? 0 : userId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (userId == null) {
if (other.userId != null)
return false;
} else if (!userId.equals(other.userId))
return false;
return true;
}
@Override
public String toString() {
return "User [userId=" + userId + ", password=" + password + ", name=" + name + ", email=" + email + "]";
}
}
|
Lombok Annotation 적용코드
package net.slipp.domain.user;
import lombok.*;
@AllArgsConstructor
@EqualsAndHashCode
@ToString
public class User {
@Getter
private String userId;
@Getter
private String password;
@Getter
private String name;
@Getter
private String email;
public boolean matchPassword(String loginPassword) {
if (loginPassword == null) {
return false;
}
return loginPassword.equals(password);
}
public void update(User user) {
this.userId = user.getUserId();
this.password = user.getPassword();
this.name = user.getName();
this.email = user.getEmail();
}
}
|
90라인이 넘는 코드를 30여줄로 1/3 줄일 수가 있다.
설치방법
1. lombok.jar 다운로드
a.lombok.jar 직접 다운로드
- http://projectlombok.org/download.html
b. pom.xml dependency 추가
<dependencies>
...
<!-- Project lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>0.11.6</version>
</dependency>
...
</dependencies>
|
2. lombok 설치하기
a. lombok.jar 직접 다운로드의 경우 :
- 방법1. 다운로드 경로 이동 후 lombok.jar 더블클릭으로 실행
- 방법2. cmd 창에서 다운로드 경로 이동 후 java -jar lombok.jar 실행
b. Maven pom.xml에 추가한 경우 :
- 설치 경로 이동 : cd ~/.m2/repository/org/projectlombok/lombok/
- 위(a) 방법1 또는 방법2로 실행
c. IDE 설치 위치[Specify locaion…]를 검색해서 경로에 추가한다.
d. eclipse.ini or sts.ini 파일 변경되고 동일한 경로에 lombok.jar 추가됨
e. 별도로 프로젝트 내에 라이브러리를 추가해서 사용할 수도 있겠다.
소스코드에서 Lombok Annotation을 추가해보자
lombok features : http://www.projectlombok.org/features/index.html
- @Data
- @Getter/@Setter
- 접근제어 : AccessLevel[PUBLIC, PROTECTED, PACKAGE, PRIVATE]을 통해서 접근레벨을 제한할 수 있다.
- 예 : @Getter(AccessLevel.PACKAGE), @Setter(AccessLevel.PRIVATE)
- getter/setter 관례에 따라서 get필드명, set필드명 메소드가 생성됨
- Getter
- Setter
- @EqualsAndHashCode
- 코드에서 객체의 비교 등의 용도로 사용되는 equals(), hashCode() 메소드의 코드를 절감할 수가 있다.
- @EqualsAndHashCode(exclude={“field1”, “field2”}) 처럼 필요에 따라서 특정 필드를 제외할 수가 있다.
- @ToString
- 로그Log에서 객체의 내용을 확인하는 등의 용도로 쓰이는 toString() 메소드를 대신할 수 있다.
- @ToString(exclude=”field1”) 처럼 필요에 따라서 특정 필드를 제외할 수 있다.
- @Log
- 최근에 알게된 기선님의 글() 녀석인데, Logger와 관련된 코드들을 줄일 수 있다.
- 추가하면 자동으로 필드에 private static final Logger log 가 추가된다. 이후 로그를 찍으려는
곳에서는 log.error(), log.warn(), log.debug(), log.info() 형태로 사용하면 된다.
============================================================================================================
※ lombok이 이클립스에 설치가 안되는 경우
방법1.
1. lombok.jar를 eclipse 폴더에 복사한다.
2. eclipse.ini 맨 아래에 아래 붉은 코드를 넣는다.
-javaagent:C:\dev\eclipses\eclipse-jee-2018-09-win32-x86_64\lombok.jar |
방법. 이클립스 이전 버전
1. lombok.jar를 eclipse 폴더에 복사한다.
2. eclipse.ini 맨 아래에 아래 붉은 코드를 넣는다.
-vmargs -Dfile.encoding=UTF-8 -Dosgi.requiredJavaVersion=1.6 -Xms2048m -Xmx2048m -javaagent:lombok.jar -Xbootclasspath/a:lombok.jar
|
============================================================================================================
Gradle 로 build 시
build.gradle
// plugins 선언은 build.gradle 최상단에 해야 한다. (apply 보다도 먼저) plugins { id 'net.ltgt.apt' version '0.19' }
dependencies { // compileOnly 만 있으면 gradle build 시 문제가 없다. compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.2'
apt group: 'org.projectlombok', name: 'lombok', version: '1.18.2' }
|
============================================================================================================
Lombok 사용시 컴파일 경고 없애는 방법
Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.
import lombok.EqualsAndHashCode;
@Data /* 아래 코드 추가 */
@EqualsAndHashCode(callSuper=false)
public class Program extends CommonModel {
private String id;
}
좀더 자세한 사용법은 아래 링크에 코드를 참조
http://projectlombok.org/features/EqualsAndHashCode.html간단히 이야기 하면 별도로 구현하는 Value Object 가 없다면 위에 callSuper=false 있다면 위 링크를 보고 참조해서 구현하면 됩니다.