2014년 10월 2일 목요일

Project Lombok 코드 작성 줄이기

Project Lombok은 Java 코드에서 자주 사용하는 상용구(boilerplate)를 Annotation으로 처리하는 라이브러리이다.
여기서 상용구라 함은 Java 코드를 작성하면서 관례적으로 자주 작성하게 되는 코드를 말하며, Getter/Setter, 매개변수를 갖는 생성자 등이 이에 해당한다.
예를 들어, 데이터베이스의 값을 저장하는 JavaBeans 객체들은 많은 Getter/Setter 메쏘드들을 가지고 있을 것이며, 때에 따라서는 equals()/hashCode()/toString() 메쏘드들을 overriding 할 것이다.
Eclipse나 IntelliJ같은 IDE 들은 이러한 상용구를 쉽게 작성해주는 도구들을 이미 포함하고 있기는 하지만, 우리와 같이 게으른(?) 개발자들에게는 Annotation 한 줄로 처리해주는 Lombok이 훌륭한 도구가 될 것이다
참고로 Lombok은 인도네시아의 한 섬이름이기도 하고 매운 고추 품종이기도 하다.

먼저 Project Lombok 사이트에서 최신 jar 를 다운로드 한다.
lombok.jar를 더블 클릭하면 아래와 같은 화면이 표시된다. IDE를 찾을 수 없다는 경고창이 표시되는데 "확인"을 누르고 "Sepecify location..." 버튼을 눌러서 Eclipse의 설치 디렉토리를 찾아 선택한다.



설치가 완료되면, Eclipse의 설치 디렉토리에 lombok.jar가 복사가 되고, eclipse.ini 파일 끝에 다음과 같은 옵션이 추가가 된다.

-javaagent:lombok.jar

-Xbootclasspath/a:lombok.jar

이렇게 되면, 이제부터 Eclipse에서 Lombok의 Annotation을 이해할 수 있게 된다.

다음의 Lombok 사이트에서 예제로 사용하는 코드를 보자

package lomboktest;

import lombok.Data;

public @Data class Mountain {
 private final String name;
 private final double latitude, longitude;
 
 private String country;

}

class 키워드 앞에 @Data annotation을 추가하였다.
대충 짐작하겠지만, 이렇게만 하면 Lombok이 Getter/Setter 메쏘드들을 자동으로 만들어 준다.
그런데 Lombok은 소스코드로 만들어 주는 것이 아니라 바이트코드를 변경해서 만들어 준다. 때문에 아래 그림과 같이 Eclipse의 Outline을 보게 되면


Getter/Setter 뿐만 아니라, equasl(), hashCode(), toString() 그리고 모든 멤버 변수를 매개 변수로하는 생성자가 추가되어 있다.
@Data annotation은 이와 같이 Getter/Setter, equals(), hashCode(), toString(), 멤버 변수를 매개 변수로하는 생성자를 작성해 준다.


@Data
All together now: A shortcut for @ToString@EqualsAndHashCode@Getter on all fields, and @Setter on all non-final fields, and @RequiredArgsConstructor!

이것을 javap로 확인해 보면 다음과 같다
> javap Mountain

public class lomboktest.Mountain {
  public java.lang.String getName();
  public double getLatitude();
  public double getLongitude();
  public java.lang.String getCountry();
  public void setCountry(java.lang.String);
  public boolean equals(java.lang.Object);
  protected boolean canEqual(java.lang.Object);
  public int hashCode();
  public java.lang.String toString();
  public lomboktest.Mountain(java.lang.String, double, double);

}

아래의 annotation 이름들만 보면 무엇을 하는 것인지 직관적으로 알 수 있다. 현재 많은 오픈 소스 프로젝트에서 Lombok을 사용하고 있다. Groovy 같은 경우는 언어적으로 비슷한 기능을 제공한다. 멤버 변수만 작성하면 Getter/Setter는 자동으로 만들어진다.
Lombok을 효과적으로 사용한다면, 코드 생산성을 높이는데 큰 도움을 줄 것이다

참고 사이트 http://jnb.ociweb.com/jnb/jnbJan2010.html




val
Finally! Hassle-free final local variables.
@NonNull
or: How I learned to stop worrying and love the NullPointerException.
@Cleanup
Automatic resource management: Call your close() methods safely with no hassle.
@Getter / @Setter
Never write public int getFoo() {return foo;} again.
@ToString
No need to start a debugger to see your fields: Just let lombok generate a toString for you!
@EqualsAndHashCode
Equality made easy: Generates hashCode and equals implementations from the fields of your object.
@NoArgsConstructor@RequiredArgsConstructor and @AllArgsConstructor
Constructors made to order: Generates constructors that take no arguments, one argument per final / non-null field, or one argument for every field.
@Data
All together now: A shortcut for @ToString@EqualsAndHashCode@Getter on all fields, and @Setter on all non-final fields, and @RequiredArgsConstructor!
@Value
Immutable classes made very easy.
@SneakyThrows
To boldly throw checked exceptions where no one has thrown them before!
@Synchronized
synchronized done right: Don't expose your locks.
@Getter(lazy=true)
Laziness is a virtue!
@Log
Captain's Log, stardate 24435.7: "What was that line again?"


댓글 없음:

댓글 쓰기