롬복이라는 Java의 코드 작성과 유지보수를 간소화하기 위해 사용되는 라이브러리의 어노테이션이다. '@Setter'와 '@Getter'는 클래스의 필드에 대해 자동으로 setter 및 getter 메소드를 생성해준다.
// 우리가 짠 코드
import lombok.Setter;
@Getter
@Setter
public class Person {
private String name;
}
----------------------------------------
// Lombok이 자동으로 만들어주는 setter와 getter 메소드
// 코드상으로는 메소드의 선언이 안 보인다.
public void setName(String name) {
this.name = name;
}
public void getName() {
return this.name;
}
먼저 우리는 객체 지향의 핵심요소 중 '캡슐화'에 대해서 알 필요가 있다.
객체 지향의 캡슐화
객체의 속성(Variable)을 보호하기 위해 "꼭 필요한 정보와 기능만" 외부에 오픈한다.
대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현 하게 한다.
어디서든지 쓸 수 있는 Lombok의 Setter메소드는 객체 지향의 원칙 중 하나인 정보은닉을 해치게 된다.
위의 기본 사용 방법의 코드에서 볼 수 있듯이, Person객체의 name필드는 private로 접근에 제한을 둠으로서 정보은닉을 지키려고 하고 있지만 public의 setter메소드 때문에 정보은닉의 효과가 사라지게 된다. 이는 또한 객체의 상태 관리 복잡성을 높임으로서 유지보수를 어렵게 만든다.
정보수정의 메소드가 Setter 메소드 하나로 통일되면서, 각 상황마다 왜 이 Setter가 쓰였는지 주석을 따로 쓰지 않는한 알 길이 없다. 객체의 상태가 사용자 의도에 의해 바뀌는지 개발자의 의도에 바뀌는지, 어떤 목적으로 쓰였는지 메소드의 이름에 그 의도가 담기지 않으니 왜 쓰였는지 알 수가 없어 가독성과 유지보수성을 떨어지게 한다.
만약, 객제 상태를 수정하기 전에 입력된 데이터의 검증 로직이 필요하다면 Lombok의 setter를 사용할 때 마다 매번 검증 코드를 같이 짜줘야 할 것이다. 이는 코드의 유지보수를 어렵게 만들고 객체의 상태가 유효하지 않은 상태로 남을 수 있는 위험성을 남긴다.