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 있다면 위 링크를 보고 참조해서 구현하면 됩니다.


+ Recent posts