여기서 상용구라 함은 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
@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
@NonNull
@Cleanup
close()
methods safely with no hassle.@Getter
/ @Setter
public int getFoo() {return foo;}
again.@ToString
toString
for you!@EqualsAndHashCode
hashCode
and equals
implementations from the fields of your object.@NoArgsConstructor
, @RequiredArgsConstructor
and @AllArgsConstructor
@Data
@ToString
, @EqualsAndHashCode
, @Getter
on all fields, and @Setter
on all non-final fields, and @RequiredArgsConstructor
!@Value
@SneakyThrows
@Synchronized
synchronized
done right: Don't expose your locks.@Getter(lazy=true)
@Log
댓글 없음:
댓글 쓰기