Spring

Lombok 이란?

728x90

Lombok 이란 자바 어플리케이션을 개발함에 있어서, 반복적으로 작성되는 코드들 (boilerplate code) 을 작성하는 과정을 간소화 시킨 라이브러리이다.

 

예를들어, 객체를 선언할때 마다 각 필드 변수들에 대해서 매번 getter, setter, constructor 등을 선언해야 했다.

Lombok 을 사용하게 되면 이런 번거로운 작업을 몇개의 어노테이션을 정의하는것 만으로 크게 줄일 수 있다.

 

대표적인 lombok 관련 어노테이션을 몇개만 알아보면

 

 

1. @Getter, @Setter

: 객체의 필드 변수에 접근하기 위한, getter / setter 메소드를 작성하지 않고도 lombok 이 getter / setter 메소드를 만들어준다.

 

- 예시

@Getter
@Setter
public class User {
 
    private String username;
 
    private String password;
 
    private String email;
}
cs

 

 

2. @NoArgsConstructor, @AllArgsConstructor 등 ..

: @NoArgsConstructor 는 매개변수 없는 빈 생성자를 자동으로 생성해주며,

@AllArgsConstructor 는 객체의 모든 필드 변수들을 매개변수로 하는 생성자를 자동으로 생성한다

 

- 예시

@AllArgsConstructor
@NoArgsConstructor
public class User {
 
    private String username;
 
    private String password;
 
    private String email;
}
cs

 

 

3. @EqualsAndHashCode 와 @ToString

: @EqualsAndHashCode 는 equals() 메소드와 hashCode() 메소드를 자동으로 생성해주는 어노테이션이며

@ToString 은 toString() 메소드를 자동으로 생성해주는 어노테이션 이다.

 

- 예시

@EqulasAndHashCode
@ToString
public class User {
 
    private String username;
 
    private String password;
 
    private String email;
}
cs

 

4. @Data

: @Data 어노테이션은 위에서 언급한 @Getter, @Setter, @EqualsAndHashCode, @ToString 을 담는 어노테이션으로 앞서 본것 처럼 @Getter, @Setter 를 직접 선언하기 보다는 @Data 가 더 많이 사용된다

 

- 예시

@Data
public class User {
 
    private String username;
 
    private String password;
 
    private String email;
}
cs

 

 

5. @Builder

: @Builder 를 알기전, 먼저 디자인 패턴 중 빌더 패턴에 대해 알아야하는데

빌더 패턴은 예를들어, 하나의 객체에 필드 변수가 아래와 같이 여러개가 존재할 경우, 각각에 대해서 생성자를 따로 따로 만들어 줘야했다. (Lombok 을 사용하지 않았을때)

 

- builder pattern 적용 이전 (코드 원본 : jdm.kr/blog/217)

public class PersonInfo {
    private String name;
    private Integer age;
    private String favoriteColor;
    private String favoriteAnimal;
    private Integer favoriteNumber;
 
    public PersonInfo(String name) {
        this.name = name;
    }
 
    public PersonInfo(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
 
    /*
        위와 같은 방식으로 필드 변수 갯수 만큼 일일이 생성자 모두 만들어줘야함
        필드 변수 1개를 멤버변수로 하는 생성자
        필드 변수 2개를 멤버변수로 하는 생성자
        ....
        필드 변수 n개를 멤버변수로 하는 생성자
 
        생성자 외에 getter, setter, toString 등 생략..
    */
}
cs

 

이런 불필요한 생성자를 만드는 작업을 최소화 하고자 빌더 패턴이란게 등장했고

아래 코드 처럼 생성자를 쓰지 않고 build 라는 함수를 만들어서 이 객체의 인스턴스를 만드는 객체에서 build 함수를 통해 필드 변수의 값을 초기화 하는 작업을 해줬다

 

 

- builder pattern 적용 후 (코드 원본 : jdm.kr/blog/217)

public class PersonInfoBuilder {
    private String name;
    private Integer age;
    private String favoriteColor;
    private String favoriteAnimal;
    private Integer favoriteNumber;
 
    // getter, setter 생략...
 
    public PersonInfo build(){
        PersonInfo personInfo = new PersonInfo(name, age, favoriteColor, favoriteAnimal, favoriteNumber);
        return personInfo;
    }
}
cs

 

- main 함수 (코드 원본 : jdm.kr/blog/217)

public class BuilderPattern {
    public static void main(String[] args) {
        // 빌더 객체를 하나 만듭니다.
        PersonInfoBuilder personInfoBuilder = new PersonInfoBuilder();
        // 빌더 객체에 원하는 데이터를 입력합니다. 순서는 상관 없습니다.
        PersonInfo result = personInfoBuilder
                .setName("MISTAKE")
                .setAge(20)
                .setFavoriteAnimal("cat")
                .setFavoriteColor("black")
                .setName("JDM"// 다시 같은 메소드를 호출한다면 나중에 호출한 값이 들어갑니다.
                .setFavoriteNumber(7)
                // 마지막에 .build() 메소드를 호출해서 최종적인 결과물을 만들어 반환합니다.
                .build();
        // print is "name:JDM, age:20, favoriteColor:black, favoriteAnimal:cat, favoriteNumber:7"
        System.out.println(result.getPersonInfo());
    }
}
cs

 

그러나 이것 마저도 사실 반복되는 코드(bolierplate code) 구조를 갖고 있다

 

그래서 이것도 줄이기 위해서 등장한게 @Builder 이며

이 @Builder 어노테이션을 사용하면 위와 같이 긴 build() 함수를 만들 필요도 없다.

빌더로 만들 객체에 그냥 @Builder 만 붙이면 된다.

 

 

 

이외에도 다른 여러 어노테이션들이 존재한다.

자세한 부분은 아래 참조

projectlombok.org/features/all

 

Stable

 

projectlombok.org

 

728x90

'Spring' 카테고리의 다른 글

Swagger 를 통한 REST API 문서화  (0) 2021.04.30
MapStruct 란?  (0) 2021.04.15
Spring Boot - Spring Data REST  (0) 2021.03.25
Spring Boot - DAO  (0) 2021.03.24
Spring Boot - Overview  (0) 2021.03.22