롬복(Lombok)은 데이터(모델) 클래스를 생성할 때 '반복적으로 사용하는 getter/setter 와 같은 메서드를 어노테이션으로 대체하는 기능을 제공하는 라이브러리' 이다.
인텔리제이나 이클립스에서 이런 메서드를 자동으로 생성하는 기능을 제공하긴 하지만 가독성이 떨어진다는 단점은 여전하다.
Lombok 활용시 장점
※ 물론, 개발자의 의도대로 정확하게 구현하지 못 하는 경우가 생기는 단점도 존재한다.
Lombok의 주요 어노테이션
다양한 어노테이션을 제공하지만, 많이들 사용하는 주요 어노테이션에 대해서 알아보자!
클래스에 선언되어 있는 필드에 대한 getter/setter 메서드를 생성한다.
인텔리제이, 이클립스 등에서 제공하는 기능과 비슷하지만 코드 수를 줄일 수 있는 강한 강점이 있다.
데이터 클래스의 초기화를 위해 생성자를 자동으로 만들어주는 어노테이션은 3가지가 있다.
1) NoArgsConstructor : 매개변수가 없는 생성자를 자동 생성한다.
2) AllArgsConstructor : 모든 필드를 매개변수로 갖는 생성자를 자동 생성한다.
3) RequiredArgsConstructor : 필드 중 final이나 @NotNull이 설정된 변수를 매개변수로 갖는 생성자를 자동 생성한다.
바로 알 수 있듯이 toString() 메서드를 생성하는 어노테이션이다.
toString() 메서드는 필드의 값을 문자열로 조합해서 리턴한다. 또한, 민감한 정보처럼 숨겨야 할 정보가 있다면 @ToString 어노테이션이 제공하는 exclude 속성을 사용해 특정 필드를 자동 생성에서 제외할 수도 있다.
객체의 동등성(Equality)과 동일성(Identity)을 비교하는 연산 메서드를 생성한다.
'equals'는 두 객체의 내용이 같은지 '동등성'을 비교하고,
'hashCode'는 두 객체가 같은 객체인지 '동일성'을 비교한다.
만약 부모 클래스가 있어 상속을 받는 상황이라면, 부모 클래스의 필드까지 비교할 필요가 있는 경우가 생기기도 한다. 이런 경우에는 @EqualsAndHashCode에서 제공하는 callSuper 속성을 이용하면 된다.
callSuper의 기본값은 false이고, true일 경우에 부모객체의 값도 비교 대상에 포함한다.
※ 동등성과 동일성?
equals와 hashCode에서 나오는 '동등성(equality)'과 '동일성(identity)'.
동등성은 비교 대상이 되는 두 객체가 가진 값이 같음을 의미하고, 동일성은 두 객체가 같은 객체임을 의미한다.
두 메서드는 일반적으로 클래스 단위의 객체를 비교하는데 사용하고, Object 클래스의 메서드를 오버라이딩해 구현한다. 동등성과 동일성이 원시(primitive) 타입의 자료형과 레퍼런스(reference) 타입의 자료형에서 어떻게 사용되는지 알아보면 이해하는데 도움이 됨! 다만, 이 중 String 타입은 조금 특별한데, String은 레퍼런스 타입이지만 원시 타입처럼 사용된다.
위에 설명되어 있는 @Getter/Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode를 모두 포괄하는 어노테이션이다. 즉, 위에 쓴 어노테이션에서 생성하는 대부분의 코드가 필요하다면 @Data 어노테이션으로 위에 있는 코드를 전부 한 번에 생성할 수 있다.