Lombok

By | 2020년 3월 12일
Table of Contents

Lombok

롬복은 소스 생성을 자동화 해주는 툴입니다.

어노테이션 일람

@Getter

get 메소드를 자동 생성해 줍니다. 쓰고 안쓰고의 차이가 많이 납니다.

소스 라인수가 급증하고 내부 변수 하나 추가 삭제 할때마다 get 메소드를 추가 삭제를 해주어야 하는 문제가 생깁니다.

// with @Getter annotation
@Getter
public class OrderMaster {
    String orderserial;
    String cancelYn;
    LocalDateTime canceldate;
}

// without @Getter annotation
public class OrderMaster {
    String orderserial;
    String cancelYn;
    LocalDateTime canceldate;

    public String getOrderserial() {
        return orderserial;
    }

    public String getCancelYn() {
        return cancelYn;
    }

    public LocalDateTime getCanceldate() {
        return canceldate;
    }
}

@Setter

@Getter 와 비슷하지만 비권장 어노테이션입니다.

비권장 이유는 아래에 모아서 설명합니다.

@ToString

toString() 메소드를 자동생성합니다.

@ToString(exclude = "password")
public class User {
    private Long id;
    private String username;
    private String password;
    private int[] scores;
}

@NoArgsConstructor

파라미터가 하나도 없는 생성자를 자동생성해 줍니다.

// with @NoArgsConstructor annotation
@NoArgsConstructor
public class OrderMaster {
    String orderserial;
    String cancelYn;
    LocalDateTime canceldate;
}

// without @NoArgsConstructor annotation
public class OrderMaster {
    String orderserial;
    String cancelYn;
    LocalDateTime canceldate;

    public OrderMaster() {
    }
}

@RequriedArgsConstructor

내부 변수중 final 또는 @NonNull 이 붙어 있는 변수들만으로 구성된 생성자를 만듭니다.

@AllArgsConstructor

비권장 어노테이션입니다.

비권장 이유는 아래에 모아서 설명합니다.

@Builder

파라미터가 다수인 생성자의 경우, 파라미터의 순서를 잘못 지정해서 찾아내기 힘든 오류를 만들기 쉽습니다. 그럴때 Builder 를 생성하는데, 이를 자동화 해주는 어노테이션입니다.

@Getter
@NoArgsConstructor
public class Posts extends BaseTimeEntity {

    private long id;

    private String title;

    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
}

Posts posts = Posts.builder()
        .title("titlt")
        .content("content")
        .author("author")
        .build();

@NonNull

변수에 null 이 입력되면 NullPointerException 을 발생시킵니다. null 을 입력할 때 오류를 발생시키면 오류 발생시기가 명확해져서 오류 찾기가 쉬워집니다.

내부변수의 설정은, 생성자 또는 내부변수에 값을 입력하는 특정 메소드 호출에 의해 명확히 정해짐에 반해, 입력시가 아니라 사용시 에러가 발생하게 되면, 어느 시점에 null 이 입력되었는지 찾을 수가 없게 됩니다.

@Getter
public class MyOrderMaster {
    String orderserial;

    @NonNull
    String cancelYn;

    LocalDateTime canceldate;
}

@Data

비권장 어노테이션입니다.

비권장 이유는 아래에 모아서 설명합니다.

비권장 어노테이션

@Setter

변수를 임의로 변경하면 오류를 찾아내기 힘들어집니다.

@Setter
@NoArgsConstructor
public class MyOrderMaster {
    String orderserial;
    String cancelYn;
    LocalDateTime canceldate;
}

MyOrderMaster myOrderMaster = new MyOrderMaster();
myOrderMaster.setCancelYn("Y");
@NoArgsConstructor
public class MyOrderMaster {
    String orderserial;
    String cancelYn;
    LocalDateTime canceldate;

    public void cancelOrder() {
        this.cancelYn = "Y";
        this.canceldate = LocalDateTime.now();
    }
}

MyOrderMaster myOrderMaster = new MyOrderMaster();
myOrderMaster.cancelOrder();

@AllArgsConstructor

Builder 방식 대신 모든 내부변수를 나열하는 방식의 생성자를 생성하고, 아래와 같이 변수타입이 모두 동일한 경우, 한 개발자가 변수의 순서를 변경하면, 찾아내기 매우 어려운 버그가 발생합니다.

따라서, @AllArgsConstructor 의 사용을 제한하고, @Builder 를 이용해 객체를 생성하는 것이 오류 발생을 차단할 수 있습니다.

@AllArgsConstructor
public class Posts extends BaseTimeEntity {
    private String title;
    private String content;
    private String author;
}

Posts posts = new Posts("title", "content", "author");

@Data

@Data 어너테이션은 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 를 한번에 생성해 주는 어노테이션입니다.

비권장 어노테이션을 생성하고, 너무 많은 어노테이션들이 한번에 생성되어 권장하지 않습니다.

One thought on “Lombok

  1. Pingback: [From Hello To QueryDSL] Simple Board (2/12) – 상구리의 기술 블로그

답글 남기기