반복되는 코드작업을 해결해주는 코드 다이어터 Lombok

Allow·2022년 4월 6일
0

Lombok으로 코드 다이어트 하기

Lombok은 Java기반에서 VO, DTO, Entity클래스를 생성할 때 반복적으로 작성하는 getter, setter, toString과 같은 작업들을 어노테이션을 사용하여 보다 더 간편하게 개발할 수 있게 도와주는 라이브러리이다.

Lombok의 장점

  1. 반복되는 코드를 줄여줌으로 코드의 가독성이 좋아진다.
  2. 반복되는 코드를 줌여줌으로 생산성이 증가한다.
  3. JPA를 사용하고 있는 경우 JPA환경과 일관화됨으로 가독성이 좋은 코드를 작성할 수 있다.

Lombok의 단점

  1. 모든 협업 인원이 Lombok의 설치해야한다.
  2. @Data @ToString어노테이션으로 자동 생성되는 toString()메서드의 순환참조, 재귀호출 문제로 스택오버플로우가 발생할 수 있다. (자세한 내용은 권남님의 블로그 참고)

설치방법

다양한 IDE를 지원하지만 가장 많이 사용하는 EclipseIntelliJ 두 IDE의 설치방법에 대해 알아보겠다. (사실 내가 이 두가지 IDE를 사용한다.)

다른 IDE의 설치방법을 알고싶다면 공식홈페이지의 [Install] 탭에 자세하게 설명되어있다.

Eclipse

롬복 공식사이트에서 파일을 다운받고 실행시키면 아래와 같은 화면이 나오고 내 PC에 설치되있는 IDE를 선택하고 "install/Update"버튼을 눌러 설치를 하면 된다.
(Eclipse 실행한 상태에서 설치를 했다면 재시작을 해야한다.)

IntelliJ

IntelliJ Lombok은 설치방법은 비교적 간단하다.
Preferences > Plugins > Browse repositories.. > Lombok 검색 > Install > restart


Build

설치를 마친 후에 프로젝트에 적용되어 있는 빌드 방식에 따라 lombok을 추가해준다.

Maven

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

Gradle

repositories {
    mavenCentral()
}
 
dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.12'
    annotationProcessor 'org.projectlombok:lombok:1.18.12'
    
    testCompileOnly 'org.projectlombok:lombok:1.18.12'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.12'
}

사용방법

VO, DTO클래스를 생성할 때 보통 아래와 같이 생성자, getter, setter, toString이 포함되어있는 코드를 작성하게 된다. IDE에서 Generate해주는 편리한 기능이 있지만 인자가 많아질 수록 코드의 양은 늘어나고 가독성 또한 떨어진다.

Lombok을 적용하지 않은 코드

public class TestVO {
    private long id;
    private String name;
    private String nickName;
    private double weight;
    private double height;
 
    public TestVO() {}
    
    public TestVO(long id, String name, String nickName, double weight, double height) {
        this.id = id;
        this.name = name;
        this.nickName = nickName;
        this.weight = weight;
        this.height = height;
    }
 
    public long getId() {
        return id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getNickName() {
        return nickName;
    }
 
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
 
    public double getWeight() {
        return weight;
    }
 
    public void setWeight(double weight) {
        this.weight = weight;
    }
 
    public double getHeight() {
        return height;
    }
 
    public void setHeight(double height) {
        this.height = height;
    }
 
    @Override
    public String toString() {
        return "TestVO{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                ", weight=" + weight +
                ", height=" + height +
                '}';
    }
}

Lombok을 적용한 코드

@Getter @Setter @ToString @NoArgsConstructor @AllArgsConstructor 다섯가지 어노테이션을 사용함으로 코드의 양을 줄일 수 있을 뿐만 아니라 가독성 또한 좋아진다.

import lombok.*;
 
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class TestVO {
    private long id;
    private String name;
    private String nickName;
    private double weight;
    private double height;
}

위 다섯가지의 어노테이션을 모두 사용할 경우에는 @Data 어노테이션 하나면 더 깔끔하게 적용할 수 있다.
하지만 @Data어노테이션은 가급적 지양하도록 한다.(lombok 사용 시 주의해야 할 점)

import lombok.*;
 
@Data
public class TestVO {
    private long id;
    private String name;
    private String nickName;
    private double weight;
    private double height;
}

이렇게 lombok을 적용하게 되면 작업성과 코드의 가독성 두 가지 이점을 얻을 수 있다.


자주 사용되는 어노테이션

lombok에서 자주 사용되는 어노테이션을 정리해본다.

접근자 / 설정자 자동 생성 관련 Annotation

@Getter와 @Setter

@Getter는 모든 필드에 대해서 getter메서드를 생성해주며, @Setter는 모든 non-final 필드의 setter메서드를 생성해준다.

@Setter사용시 유의해야 할 점

무분별한 @Setter어노테이션의 사용은 지양한다. Setter는 객체를 언제든지 변경할 수 있는 상태가 되어서 변경되지 않아야할 필드에 @Setter를 적용하는 경우에는 객체의 안전성이 보장받을 수 없다.

import lombok.*;
 
@Getter
@Setter
public class TestVO {
    private long id;
    private String name;
    private String nickName;
    private double weight;
    private double height;
}

생성자 관련 어노테이션

@NoArgsConstructor

파라미터가 없는 생성자를 만들어주는 어노테이션이다.

@AllArgsConstructor

모든 필드값을 파라미터로 받는 생성자를 만들어주는 어노테이션이다.

@RequiredArgsConstructor

접근제어자 final이나 notNull인 필드값만 받아 생성자를 만들어 주는 어노테이션이다.

import lombok.*;
 
import javax.validation.constraints.NotNull;
 
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class TestVO {
    @NotNull
    private long id;
    private String name;
    private String nickName;
    private double weight;
    private double height;
}

기타

@NotNull

@Notnull어노테이션은 Class위에서는 사용이 되지 않는다. Class내 필드값에 직접 사용한다. (위 코드 참고)

@Builder

클래의 다수의 필드값이 있는 경우 생성자를 만들 때 필드값이 많고 순서 또한 맞춰서 파라미터값을 입력해야 하기 때문에 코딩할 때 불편한 경우가 있다.

@Builder어노테이션을 사용하게 되면 자동으로 빌더패턴을 생성해줌으로 작업하는데 많은 도움을 준다.

import lombok.*;
 
import javax.validation.constraints.NotNull;
 
@Builder
public class TestVO {
    @NotNull
    private long id;
    @NotNull
    private String name;
    private String nickName;
    private double weight;
    private double height;
 
    // @Builder 적용 예시
    public class BuilderExClass {
        TestVO testVO = TestVO.builder()
                .id(1L)
                .nickName("nickName")
                .name("green")
                .height(80)
                .height(180)
                .build();
    }
}

lombok을 사용하면서 자주 사용되는 어노테이션이 있으면 추가로 작성할 예정이다.

이렇게 lombok어노테이션을 잘 활용하면 작업성과 가독성의 두 마리 토끼를 잡을 수 있게 된다. 하지만 사용할 때 JPA와 같은 ORM등과 같이 사용할 때 발생할 수 있는 오류들에 대해 염두해두고 사용해야한다.

공식 문서도 잘 설명되어 있는 편이라서 참고해보면 좋다.

Lombok 공식 문서

profile
반갑습니다!

0개의 댓글