본문 바로가기

Tech/Spring | SpringBoot

[SpringBoot] SpringBoot 에 lombok 적용하기

반응형

1. lombok

lombok 은 자바 라이브러리 중 하나로 자바 개발시에 반복적으로 구현되는 getter, setter, toString 등을 자동으로 생성해주어 코드를 간결하게 유지하고 생산성을 높여주는 라이브러리이다. 어노테이션을 기반으로 동작하며, 클래스에 어노테이션을 추가하여 컴파일 과정에서 실제 기능이 생성되는 방식으로 동작한다. 즉 소스코드에서는 어노테이션만 보이고 해당 메서드들은 보이지 않지만 실제로 컴파일 된 결과물 .class 파일에는 코드가 생성되어지게 된다.

 

lombok 을 사용하면 반복적인 코드가 제거되어 코드의 가독성이 좋아지고 유지보수에 유리해진다. 또한 반복적인 코드 작성의 시간이 줄어 생산성이 향상된다. 하지만 경우에 따라서는 코드가 직관적이지 않고 어노테이션으로 생략되는 것에 불편함이 있을 수도 있어 상황에 맞게 사용하는 것이 좋다.

 

또한 내부에서 어떻게 구현이 되는지 이해를 하고 사용해야 한다. 예를들어 @ToString 의 경우 클래스의 내부 필드의 성격에 따라서 순환 참조나 무한 재귀 호출 등의 문제를 발생할 수 있다. 그렇기 때문에 각 기능들이 구현하는 로직에 대해서 숙지하고 발생할 수 있는 예외 상황에 대해서 파악한 후에 사용하는 것이 필요하다.

2. lombok 환경설정

lombok 을 사용하기 위해서는 라이브러리 의존성에 lombok 라이브러리를 추가해줘야 한다.

gradle 을 사용하는 경우 build.gradle 의 dependencies 에 다음과 같이 추가하여 사용할 수 있다.

 

repositories {
        mavenCentral()
}

dependencies {
        compileOnly 'org.projectlombok:lombok:1.18.24'
        annotationProcessor 'org.projectlombok:lombok:1.18.24'
        
        testCompileOnly 'org.projectlombok:lombok:1.18.24'
        testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'
}

 

3. lombok 사용방법

lombok 에는 많이 사용하는 몇가지 기능, 어노테이션들에 대해서 알아보자.

- @Getter, @Setter

getter 와 setter 는 lombok 에서 가장 많이 사용되는 어노테이션들이다. 클래스의 특정 필드에 붙여서 해당 필드의 getter, setter 를 생성할 수 있다. 또는 클래스에 어노테이션을 붙이면 해당 클래스의 모든 필드에 대해서 getter, setter 를 자동생성한다.

 

@Getter @Setter
public class GetterSetterEx {

    private Long value;

    // public Long getValue() {
    //     return value;
    // }
    
    // public void setValue(Long value) {
    //     this.value = value;
    // }
}

- @ToString

자바의 객체들은 toString() 메서드를 사용하여 문자열로 표현할 수 있는데, @ToString 어노테이션을 사용하면 개발자가 직접 toString() 메서드를 오버라이딩하여 구현하지 않아도 자동으로 toString() 메서드를 자동생성한다.

 

@ToString 을 사용하여 toString() 을 자동생성하는 경우에 클래스의 필드들의 값에 따라서 순환참조나 무한 재귀 호출이 발생할 수 있다. 이러한 예외상황을 방지하고자 @ToString 어노테이션의 exclude 속성을 사용하여 특정 필드를 제외하여 자동생성하도록 할 수 있다.

 

@ToString
public class ToStringEx {

    private Long id;
    private String name;

    // @Override
    // public String toString() {
    //     return "ToStringEx(id=" + id + ", name=" + name + ")";
    // }
}

- @EqualsAndHashCode

자바 객체들을 비교하기 위하여 equals(), hashCode() 메서드를 오버라이딩하여서 구현한다. @EqualsAndHashCode 를 사용하면 자동으로 이 메서드들을 생성할 수 있다.

 

@EqualsAndHashCode 어노테이션의 callSuper 속성을 사용하면 equals() 와 hashCode() 메서드 생성 시에 부모 클래스의 필드까지 비교할지 여부를 설정할 수 있다. 기본값은 false 로 설정되어 있어서 해당 클래스의 필드만을 비교하도록 되어있다.

 

@EqualsAndHashCode
public class EqualsAndHashCodeEx {
   
    private Long id;

    // @Override
    // public int hashCode() {
    //     final int prime = 31;
    //     int result = 1;
    //     result = prime * result + ((id == null) ? 0 : id.hashCode());
    //     return result;
    // }
    
    // @Override
    // public boolean equals(Object obj) {
    //     if (this == obj)
    //         return true;
    //     if (obj == null)
    //         return false;
    //     if (getClass() != obj.getClass())
    //         return false;
    //     EqualsAndHashCodeEx other = (EqualsAndHashCodeEx) obj;
    //     if (id == null) {
    //         if (other.id != null)
    //             return false;
    //     } else if (!id.equals(other.id))
    //         return false;
    //     return true;
    // }
}

- @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

lombok 을 사용하여 생성자도 자동생성할 수 있다.

생성자를 생성해주는 어노테이션은 @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor 등이 있다. @NoArgsConstructor 는 파라미터가 없는 기본 생성자를 생성하는 어노테이션이다. @AllArgsConstructor 는 클래스의 모든 필드를 파라미터로 받는 생성자를 생성한다. @RequiredArgsConstructor 는 클래스의 필드 중에서 final 이다 @NonNull 로 정의된 필드들을 파라미터로 받는 생성자를 생성한다.

 

@NoArgsConstructor
class NoArgsConstructorEx {
    private Long id;
    // public NoArgsConstructorEx() {}
}

@RequiredArgsConstructor
@AllArgsConstructor
class VariableArgsConstructorEx {

    @NonNull
    private Long id;

    private final String name;
    private String desc;

    // @RequiredArgsConstructor
    // public VariableArgsConstructorEx(@NonNull Long id, String name) {
    //     this.id = id;
    //     this.name = name;
    // }

    // @AllArgsConstructor
    // public VariableArgsConstructorEx(@NonNull Long id, String name, String desc) {
    //     this.id = id;
    //     this.name = name;
    //     this.desc = desc;
    // }
}

- @Data

@Data @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 를 모두 포함하고 있는 어노테이션이다. 이 어노테이션을 사용하여 클래스를 정의해주면 해당 클래스에 위의 모든 어노테이션들이 적용된다.

- @Slf4j

lombok 을 사용하여 logger 도 자동생성할 수 있다. slf4j logger 필드를 자동생성하는 어노테이션으로 클래스에 @Slf4j 어노테이션을 사용하면 log 라는 이름의 변수를 사용하여 logger 를 사용할 수 있게 된다.

 

@Slf4j
public class Slf4jEx {
   
    // private static final Logger log = LoggerFactory.getLogger(Slf4jEx.class);

    public void logging(String message) {
        log.info(message);
    }
}

[Reference]

- https://projectlombok.org/setup/gradle

 

Gradle

 

projectlombok.org

- https://cheershennah.tistory.com/183

 

[java] Lombok 롬복이란? - 코드 다이어트

Lombok 롬복 이란? Lombok 이란 Java 라이브러리로 반복되는 getter, setter, toString .. 등의 반복 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리 이다. 근데 왜 Chilli 모양일까... Java에서 보통 model

cheershennah.tistory.com

- https://www.daleseo.com/lombok-popular-annotations/

 

[자바] 자주 사용되는 Lombok 어노테이션

Engineering Blog by Dale Seo

www.daleseo.com

- https://oingdaddy.tistory.com/46

 

lombok 설치 및 @Slf4j 사용방법

자바로 코딩을 할때 반복적으로 또는 기계적으로 작업을 해야 하는 몇몇 경우가 있다. 예를들면 model 클래스를 작성할때 멤버변수를 정의하고 그에 따른 getter, setter 등을 만든다거나 로그를 사

oingdaddy.tistory.com

 

반응형