lombok이란 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다.
lombok을 이용하면getter,setter,equlas,toString등과
다양한 방면의 코드를 자동완성 시킬 수 있다 !
[ 기존의 코드 작성 ]
예를 들어 우리가 경기도 지역화폐 가맹점에 대한 상점 목록을 반환해주는
SpringBoot 기반의 API 서버를 개발한다고 가정하자.
우리는 기존에 Java를 활용하여 프로젝트를 개발할 때 다양한 VO 클래스들을 생성하였고,
해당 예제의 경우 가게들의 정보를 저장하는 Store를 아래와 같이 만들어줄 수 있다.
public class Store extends Common {
private String companyName; // 상호명
private String industryTypeCode; // 업종코드
private String businessCodeName; // 업태명
private String industryName; // 업종명(종목명)
private String telephone; // 전화번호
private String regionMoneyName; // 사용가능한 지역화폐 명
private boolean isBmoneyPossible; // 지류형 지역화폐 사용가능 여부
private boolean isCardPossible; // 카드형 지역화폐 사용가능 여부
private boolean isMobilePossible; // 모바일형 지역화폐 사용가능 여부
private String lotnoAddr; // 소재지 지번주소
private String roadAddr; // 소재지 도로명주소
private String zipCode; // 우편번호
private double longitude; // 경도
private double latitude; // 위도
private String sigunCode; // 시군 코드
private String sigunName; // 시군 이름
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getIndustryTypeCode() {
return industryTypeCode;
}
public void setIndustryTypeCode(String industryTypeCode) {
this.industryTypeCode = industryTypeCode;
}
public String getBusinessCodeName() {
return businessCodeName;
}
public void setBusinessCodeName(String businessCodeName) {
this.businessCodeName = businessCodeName;
}
public String getIndustryName() {
return industryName;
}
public void setIndustryName(String industryName) {
this.industryName = industryName;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getRegionMoneyName() {
return regionMoneyName;
}
public void setRegionMoneyName(String regionMoneyName) {
this.regionMoneyName = regionMoneyName;
}
public boolean isBmoneyPossible() {
return isBmoneyPossible;
}
public void setBmoneyPossible(boolean bmoneyPossible) {
isBmoneyPossible = bmoneyPossible;
}
public boolean isCardPossible() {
return isCardPossible;
}
public void setCardPossible(boolean cardPossible) {
isCardPossible = cardPossible;
}
public boolean isMobilePossible() {
return isMobilePossible;
}
public void setMobilePossible(boolean mobilePossible) {
isMobilePossible = mobilePossible;
}
public String getLotnoAddr() {
return lotnoAddr;
}
public void setLotnoAddr(String lotnoAddr) {
this.lotnoAddr = lotnoAddr;
}
public String getRoadAddr() {
return roadAddr;
}
public void setRoadAddr(String roadAddr) {
this.roadAddr = roadAddr;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public double getLongitude() {
return longitude;
}
public void setLongitude(double longitude) {
this.longitude = longitude;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public String getSigunCode() {
return sigunCode;
}
public void setSigunCode(String sigunCode) {
this.sigunCode = sigunCode;
}
public String getSigunName() {
return sigunName;
}
public void setSigunName(String sigunName) {
this.sigunName = sigunName;
}
}
만약 위의 Store에서 생성자도 필요하고, toString 함수도 Override 해야하는 등
추가적인 작업이 필요하다면 1개의 VO 클래스만 해도 상당히 길어지고,
코드의 가독성은 떨어지는 등의 단점이 있다.
만약 위의 클래스에 lombok을 적용한다면 아래와 같이 단순화시킬 수 있다.
(실무에서 lombok을 활용할 때에는 모든 변수들에 대해 setter를 사용하지 않지만,
예제에서는 단순화를 위해 모든 변수에 대해 @setter를 적용)
@Getter
@Setter
public class Store extends Common {
private String companyName; // 상호명
private String industryTypeCode; // 업종코드
private String businessCodeName; // 업태명
private String industryName; // 업종명(종목명)
private String telephone; // 전화번호
private String regionMoneyName; // 사용가능한 지역화폐 명
private boolean isBmoneyPossible; // 지류형 지역화폐 사용가능 여부
private boolean isCardPossible; // 카드형 지역화폐 사용가능 여부
private boolean isMobilePossible; // 모바일형 지역화폐 사용가능 여부
private String lotnoAddr; // 소재지 지번주소
private String roadAddr; // 소재지 도로명주소
private String zipCode; // 우편번호
private double longitude; // 경도
private double latitude; // 위도
private String sigunCode; // 시군 코드
private String sigunName; // 시군 이름
}
어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상
Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능
Lombok을 사용하면 정말 많은 이점을 얻을 수 있다.
과거에는 IntelliJ에서 롬복 플러그인을 모든 팀원이 설치해주어야 한다는 단점도 있었지만
현재는 IntelliJ의 기본 플러그인이 되면서 바로 편리하게 이용가능하게 되었다.
- lombok 기능을 이용하고자 하는 프로젝트의
lib폴더에lombok.jar추가- lombok 이용하는 IDE에 설치하기
@Getter+@Setter+@Tostirng
실무에서는 너무 무겁고 객체의 안정성을 지키기 때문에@Data의 활용을 지양한다.
Lombok에서 가장 자주 활용하는 어노테이션이다.
@Getter와@Setter를 클래스 이름 위에 적용시키면 모든 변수들에 적용이 가능하고,
변수 이름 위에 적용시키면 해당 변수들만 적용 가능하다.
@ToString어노테이션을 활용하면
클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다.
출력을 원하지 않는 변수에@ToString.Exclude어노테이션을 붙여주면
출력을 제외할 수 있다. 또한 상위 클래스에 대해도 toString을 적용시키고자 한다면
상위 클래스에@ToString(callSuper = true)를 적용시키면 된다.
@NoArgsConstructor는 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 시켜주는 어노테이션이다.
모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.
(모든 필드 초기화용 매개변수 생성자)
@Builder어노테이션을 활용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다.
모든 변수들에 대해 build하기를 원한다면 클래스 위에@Builder를 붙이면 되지만,
특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에@Builder어노테이션을 붙여주면 된다.
@RequiredArgsConstructor는 특정 변수만을 활용하는 생성자를 자동완성 시켜주는 어노테이션이다.
생성자의 인자로 추가할 변수에@NonNull어노테이션을 붙여서 해당 변수를 생성자의 인자로 추가할 수 있다.
아니면 해당 변수를 final로 선언해도 의존성을 주입받을 수 있다.
@Log4j2와 같은 어노테이션을 활용하면
해당 클래스의 로그 클래스를 자동 완성 시켜준다.
출처: https://mangkyu.tistory.com/78 [MangKyu's Diary:티스토리]