lombok

웃음인·2025년 4월 17일

Java

목록 보기
25/37
post-thumbnail

lombok이란?

lombok이란 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다.
lombok을 이용하면 getter, setter, equlas, toString 등과
다양한 방면의 코드를 자동완성 시킬 수 있다 !


lombok의 필요성

[ 기존의 코드 작성 ]
예를 들어 우리가 경기도 지역화폐 가맹점에 대한 상점 목록을 반환해주는
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;                                   // 시군 이름

}


Lombok의 장점

  • 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상

  • 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상

  • Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능

Lombok을 사용하면 정말 많은 이점을 얻을 수 있다.
과거에는 IntelliJ에서 롬복 플러그인을 모든 팀원이 설치해주어야 한다는 단점도 있었지만
현재는 IntelliJ의 기본 플러그인이 되면서 바로 편리하게 이용가능하게 되었다.



lombok.jar 라이브러리 이용 방법

  1. lombok 기능을 이용하고자 하는 프로젝트의 lib 폴더에 lombok.jar 추가
  2. lombok 이용하는 IDE에 설치하기


Lombok 기능 및 사용 예제

@Data

@Getter + @Setter + @Tostirng
실무에서는 너무 무겁고 객체의 안정성을 지키기 때문에 @Data의 활용을 지양한다.


@Getter, @Setter

Lombok에서 가장 자주 활용하는 어노테이션이다.
@Getter@Setter를 클래스 이름 위에 적용시키면 모든 변수들에 적용이 가능하고,
변수 이름 위에 적용시키면 해당 변수들만 적용 가능하다.


@Tostirng

@ToString 어노테이션을 활용하면
클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다.
출력을 원하지 않는 변수에 @ToString.Exclude 어노테이션을 붙여주면
출력을 제외할 수 있다. 또한 상위 클래스에 대해도 toString을 적용시키고자 한다면
상위 클래스에 @ToString(callSuper = true) 를 적용시키면 된다. 


@NoArgsConstructor

@NoArgsConstructor는 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 시켜주는 어노테이션이다.


@AllArgsConstructor

모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.
(모든 필드 초기화용 매개변수 생성자)


@Builder

@Builder 어노테이션을 활용하면 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다.
모든 변수들에 대해 build하기를 원한다면 클래스 위에 @Builder를 붙이면 되지만,
특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션을 붙여주면 된다.


@RequiredArgsConstructor

@RequiredArgsConstructor는 특정 변수만을 활용하는 생성자를 자동완성 시켜주는 어노테이션이다.
생성자의 인자로 추가할 변수에 @NonNull 어노테이션을 붙여서 해당 변수를 생성자의 인자로 추가할 수 있다.
아니면 해당 변수를 final로 선언해도 의존성을 주입받을 수 있다.


@Log 관련 어노테이션

@Log4j2와 같은 어노테이션을 활용하면
해당 클래스의 로그 클래스를 자동 완성 시켜준다.

출처: https://mangkyu.tistory.com/78 [MangKyu's Diary:티스토리]

0개의 댓글