Skip to content

Lombok 설명 및 활용

eGovFrameSupport edited this page Apr 26, 2023 · 1 revision

Lombok 이란?

Lombok이란 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리이다.
Lombok을 이용하면 Getter, Setter, Equlas, ToString 등과 다양한 방면의 코드를 자동완성 시킬 수 있다.

Lombok의 장점

  • 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
  • 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상
  • Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능

Lombok 기능 및 사용 예제

@Getter @Setter

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

@Getter
public class SessionVO implements Serializable {

	private static final long serialVersionUID = -2848741427493626376L;
	/** 아이디 */
        @Setter
	private String sUserId;
	/** 이름 */
	private String sUserNm;
	/** 이메일 */
	private String sEmail;
	/** 사용자구분 */
	private String sUserSe;
	/** 조직(부서)ID */
	private String orgnztId;
	/** 고유아이디 */
	private String uniqId;
	
}

@AllArgsConstructor

@AllArgsConstructor는 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다.

@Getter
@AllArgsConstructor
public class SessionVO implements Serializable {

	/** 아이디 */
	private String sUserId;
	/** 이름 */
	private String sUserNm;

        /* AllArgsConstructor를 통해 아래의 생성자를 자동 생성할 수 있다.
        public SessionVO(String sUserId, String sUserNm) {
          this.sUserId = sUserId;
          this.sUserNm = sUserNm;
        }
        */
}

@NoArgsConstructor

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

@Getter
@NoArgsConstructor
public class SessionVO implements Serializable {

	/** 아이디 */
	private String sUserId;
	/** 이름 */
	private String sUserNm;

        /* AllArgsConstructor를 통해 아래의 생성자를 자동 생성할 수 있다.
        public SessionVO() {
          
        }
        */
}

@RequiredArgsConstructor

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

@Getter
@RequiredArgsConstructor
public class SessionVO implements Serializable {

	/** 아이디 */
        @NonNull
	private String sUserId;
	/** 이름 */
	private final String sUserNm;
	/** 이메일 */
	private String sEmail;
	/** 사용자구분 */
	private String sUserSe;
	/** 조직(부서)ID */
	private String orgnztId;
	/** 고유아이디 */
	private String uniqId;
	
       /* RequiredArgsConstructor 통해 아래의 생성자를 자동 생성할 수 있다.
       public SessionVO(String sUserId, String sUserNm) {
          this.sUserId = sUserId;
          this.sUserNm = sUserNm;
        }
       */
}

@EqualsAndHashCode

@EqualsAndHashCode 어노테이션을 활용하면 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다.
만약 서로 다른 두 객체에서 특정 변수의 이름이 똑같은 경우 같은 객체로 판단을 하고 싶다면 아래와 같이 해줄 수 있다.

@RequiredArgsConstructor
@EqualsAndHashCode(of = {"companyName", "industryTypeCode"}, callSuper = false))
public class Store extends Common {

    @NonNull
    private String companyName;                                 // 상호명
    @NonNull
    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;                                   // 시군 이름

}

위의 Store에서는 @EqualsAndHashCode(of = {"companyName", "industryTypeCode"}) 로 설정하여
companyName과 industryTypeCode가 동일하다면 같은 객체로 인식하도록 해주고 있다.
또한 Common를 상속하고 있는데, 상위 클래스의 경우 적용시키지 않기 위해 callSuper=false로 해주었다.

@RestController
@RequestMapping(value = "/store")
@Log4j2
public class StoreController {

    @GetMapping(value = "/test")
    private ResponseEntity test(){        
        Store store1 = new Store("가게 이름", "업종코드1");
        Store store2 = new Store("가게 이름", "업종코드1");
        Store store3 = new Store("가게 이름", "업종코드2");
        
        // "companyName과 industryTypeCode가 같기 때문에 true가 나옴
        log.debug(store1.equals(store2));
        
        // "companyName과 industryTypeCode가 다르기 때문에 false가 나옴
        log.debug(store1.equals(store3));

        return ResponseEntity.ok().build();
    }

}

@ToString

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

@Data

@Data 어노테이션을 활용하면 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다.
실무에서는 너무 무겁고 객체의 안정성을 지키기 때문에 @Data의 활용을 지양한다.

@Builder

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

@Getter
@NoArgsConstructor
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;                                   // 시군 이름

    @Builder
    public Store(String companyName, String industryTypeCode){
        this.companyName = companyName;
        this.industryTypeCode = industryTypeCode;
    }
    
}

위와 같이 작성한 부분을 실제 활용한다면 아래와 같이 사용할 수 있다.

@RestController
@RequestMapping(value = "/store")
@Log4j2
public class StoreController {

    @GetMapping(value = "/init")
    private ResponseEntity init(){
        Store store = Store.builder()
                .companyName("회사이름")
                .industryTypeCode("업종코드")
                .build();

        return ResponseEntity.ok(store);
    }

}

@Log 관련 어노테이션

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