Lombok

김태은·2022년 4월 27일
0

Lombok

  • Lombok이란 Java의 라이브러리로 반복되는 메소드를 Annotation을 사용해서 자동으로 작성해주는 라이브러리다. 보통 DTO나 Model, Entity의 경우 여러 속성이 존재하고 이들이 가지는 프로퍼티에 대해서 Getter나 Setter, 생성자 등을 매번 작성해줘야 하는 경우가 많은데 이러한 부분을 자동으로 만들어주는 라이브러리라고 할 수 있다.

  • 또한 DTO와 같이 자주 변경되는 클래스의 경우 멤버 변수가 추가되거나 없어질 때마다 Getter, Setter, 생성자 등을 수정해줘야 하는 경우가 발생한다. 이러한 경우에도 Lombok을 이용하면 단순히 프로퍼티를 추가하고 삭제하는 것만으로도 충분하다.

  • Lombok을 이용해서 작성한 코드는 컴파일 과정에서 Annotation을 이용해서 코드를 생성하고 이런 결과물이 .class에 담기게 되는 것이다.

Lombok 사용 예제

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

}

우선 build.gradle에서 dependencies 추가

package com.example.spring.april;

import java.time.LocalDateTime;


public class DevDto {

    String name;
    Integer age;
    LocalDateTime startAt;

}

예제에서 사용할 Dto 생성

package com.example.spring.april;

import org.junit.jupiter.api.Test;

class DevDtoTest {

    @Test
    void test(){

    }


}

Dto클래스를 테스트할 테스트 클래스 생성

  • test만 작성해도 @Test void test(){} 함수가 작성될 수 있게 하는 법
  1. Seettings -> Live Templates에 들어가 Java를 선택한 뒤 + 버튼을 클릭하고 Live Template를 선택한다.
  2. 단축어인 test와 함수를 입력한 뒤 Define 버튼을 클릭한다.
  3. Java를 선택한 뒤 Ok 버튼 클릭 -> 완료

Dto클래스에 롬북 사용해보기

1.@Getter, @Setter

필드에 대한 getter, setter를 자동으로 생성해주는 Annotation이다. 만약 필드의 이름이 name이라면 getName()과 setName()을 추가해준다.

package com.example.spring.april;

import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
public class DevDto {

    String name;
    Integer age;
    LocalDateTime startAt;

}

롬북 어노테이션에 대해 자세히 알고 싶을 때

롬북 어노테이션을 선택한 후 마우스 오른쪽 버튼 클릭 -> Refactor -> Delombok -> 디롬북할 어노테이션 선택

-> @Setter를 디롬북한 결과 : Setter 어노테이션이 어떤 역할을 하는지 정확히 알 수 있다.

Test를 통해 @Getter @Setter 이 제대로 적용되었는지 확인

2. @ToString

@ToString이 붙은 클래스는 lombok이 toString() 메소드를 생성해준다. 기본적으로는 클래스 이름과 각 필드에 대한 값을 ,으로 구분해서 출력해준다.
@ToString 사용 전 devDto를 print했을 때 결과 : com.example.spring.april.DevDto@3ee0fea4

@ToString 사용 후 devDto를 print했을 때 결과 :
DevDto(name=snow, age=21, startAt=2022-04-27T10:43:36.736328700)

@ToString(exclude = "password")
-> exclude를 통하여 제외할 필드를 지정할 수 있다.

3. @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

  • @NoArgsConstructor
    매개변수가 없는 생성자를 생성한다. 만약 불가능 하다면(final 필드 때문에) 컴파일 에러가 난다. 만약 @NoArgsConstructor(force = true)를 사용하면 컴파일 에러를 발생시키는 대신 모든 final 필드는 기본값(0, false, null)로 초기화된다.

  • @RequiredArgsConstructor
    초기화되지 않은 모든 final 필드, @NonUll 필드에 대한 생성자를 생성해준다. @NonNull 필드의 경우 null check 구문 또한 생성해준다. 생성자 파라미터의 순서는 필드가 작성된 순서와 같다.

  • @AllArgsConstructor
    모든 필드에 대한 생성자를 만들어준다. 마찬가지로 @NonNull 필드에 대한 null check 구문을 생성해준다.

package com.example.spring.april;

import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;

import java.time.LocalDateTime;

@Setter
@Getter
public class DevDto {
    @NonNull
    String name;
    Integer age;
    LocalDateTime startAt;

    //@AllArgsConstructor
    public DevDto(String name, Integer age, LocalDateTime startAt) {
        this.name = name;
        this.age = age;
        this.startAt = startAt;
    }

    //@NoArgsConstructor
    public DevDto() {
    }

    //@RequiredArgsConstructor
    public DevDto(@NonNull String name) {
        this.name = name;
    }
}

롬북 어노테이션을 디롬북하여 각각의 생성자 확인

4. @Data

모든 필드에 대해 @ToString, @EqualsAndHashCode, @Getter를, 모든 non-final 필드에 대해 @Setter를 설정하고 @RequiredArgsConstructor를 설정해주는 단축 Annotation이다.

@Data는 실무에서 잘 쓰이지 않음 (Dto에 개인 정보가 있는 경우 @ToString이 있으면 보안에 문제가 생기기 때문에, 불필요한 기능들이 생기기 때문에 )

5. @Builder

빌더를 자동으로 작성해준다. 클래스에 작성하면 모든 필드에 대한 빌더를 만들어준다. 원하는 필드에 대해서만 빌더를 작성하고 싶은 경우 생성자를 작성하고 그 위에 @Builder를 붙여주면 된다.

-> 빌더 사용 예시

6. Slf4j

log를 사용할 수 있음

package com.example.spring.april;

import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;

import java.time.LocalDateTime;

@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@RequiredArgsConstructor
@Builder
@Slf4j
public class DevDto {
    
    //private static final Logger log = org.slf4j.LoggerFactory.getLogger(DevDto.class);
    @NonNull
    String name;
    Integer age;
    LocalDateTime startAt;

    public void printLog(){
        log.info(getName());
    }

}

7.@Cleanup
close() 메소드를 자동으로 호출해준다.
해당 Annotation을 통하여 close() 관련 코드 작성을 최소화 할수 있다.

8. @EqualsAndHashCodePermalink
equals, hashCode 메소드를 생성해준다.
exclude 를 통하여 제외할수 있다.

  • 실무에선 주로 @Getter/@Setter, @ToString 이정도가 가장 많이 사용된다고 한다.
  • 편할려고 쓰는 Annotation 무분별하게 모르고 쓰면 오히려 독이 될수도 있을것 같다. 항상 위의 내용을 숙지하고 권장사항을 따르며 사용하도록 하자.

참고
https://www.korecmblog.com/lombok/
https://ksshlee.github.io/spring/java/lombok/

0개의 댓글