[SpringBoot] Lombok

Coastby·2022년 11월 6일
0

LIKELION Back-End School

목록 보기
54/61
post-custom-banner

Lombok이란 Java 라이브러리로 반복되는 메서드 작성을 줄여주는 코드 다이어트 라이브러리이다.

롬복 (Lombok)을 이용하면 보일러플레이트 코드* (Boilerplate Code)의 절감을 도모할 수 있다. 롬복을 이용하려면 의존관계를 빌드 스크립트에 추가한다.

* 보일러플레이트 코드란 프로그래밍 언어에서 상용구 코드를 말한다. 예를 들어 자바에서는 클래스의 getter, setter 메서드가 있다. 이런 메서드는 꼭 필요하지만 코드의 길이를 길어지게 하고 개발자에게 의미 없는 노동을 강요한다는 단점이 있다.

💡 Lombok의 단점 및 주의사항
롬복 라이브러리는 개발자마다 호불호가 나뉠 수 있어 프로젝트나 성향에 따라 사용하는 것이 좋다. 또한 API 설명과 내부 동작을 어느정도 숙지하고 사용해야 한다.
예들 들어, @Data 어노테이션이나 @toString 어노테이션으로 자동 생성되는 toString()메서드는 순환 참조 또는 무한재귀호출 문제로 인해 StackOverflowError가 발생할 수 있다.

@Getter@Setter

@Getter@Setter 어노테이션을 작성하면 어노테이션 프로세서에 의해 getter와 setter가 자동으로 생성된다. 개발 시 어노테이션을 부여하고 필드를 정의하기만 하면 된다.

@Getter(AccessLevel.PRIVATE) 과 같이 접근 제한자를 설정할 수 있다.

특정 필드에서 getter, setter 생성을 막고 싶다면 필드에 @Getter(AccessLevel.NONE)을 붙여주면 해당 필드는 lombok이 메소드를 생성하지 않는다.

@Getter
@Setter
public class Person {

	String name;

}

○ 변수 타입을 val로 통일하기

롬복에서는 로컬 변수의 타입을 val로 설정할 수 있다. 꽤 긴 타입명도 val 세 글자로 통일할 수 있으며 자동 생성되는 타입에는 final이 부여된다.

참고로 자바 10부터 로컬 변수 타입 추론을 이용할 수 있어 var를 사용할 수 있다. 단, 자바 10의 var로 정의된 변수는 롬복에서 val로 정의한 것과 달리 final로 한정되지 않는다.

○ 생성자 만들기

  1. static 필드들은 스킵된다.
  2. 파라미터의 순서는 클래스에 있는 필드 순서에 맞춰서 생성한다. 만약 클래스 필드 순서를 바꾸면 생성자 파라미터 순서도 바뀌므로 주의한다.
  3. AccessLevel을 설정해야 한다. 디폴트는 public이지만 필요에 따라 설정할 수 있다.

@AllArgsConstructor
: 모든 필드에 대한 생성자를 자동으로 생성한다. 필드에 @NonNull 어노테이션이 있다면 생성자 내에서 null-check 로직을 자동으로 생성한다. 하지만 없다면 null이 들어와도 객체가 생성된다.

@NoArgsConstructor
: 파라미터가 없는 기본 생성자를 생성한다. 사용 시 주의할 사항
1. 필드들이 final로 생성되어 있는 경우에는 필드를 초기화할 수 없기 때문에 생성자를 만든 수 없고 에러가 발생한다.
이 때는 @NoArgsConstructor(force = true) 옵션을 이용해 final 필드를 0, false, null 등으로 강제 초기화시켜 생성자를 만들 수 있다.
2. @NonNull 같이 필드에 제약조건이 설정되어 있는 경우, 생성자 내 null-check 로직이 생성되지 않는다. 후에 초기화를 진행하기 전까지 null-check 로직이 발생하지 않는 점을 염두하고 코드를 개발해야 한다.

@RequiredArgsConstructor
: 추가 작업을 필요로하는 필드에 대한 생성자를 생성한다. 초기화되지 않은 모든 final 필드, @NonNull로 마크된 필드들에 대한 생성자를 자동으로 생성한다.

○ toString 메소드 생성

@ToString 어노테이션 사용 시 아래와 같은 함수를 생성해 준다. exclude 속성을 사용하면 특정 필드를 toString() 결과에서 제외시킬 수도 있다.

@ToString(exclude = "password")
public class BoardCategoryLombok {

    private String category_id;
    private String category_name;
    private Date regdate;
    private int board_cnt;
    private int seq;
    
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("BoardCategoryBean{");
        sb.append("category_id='").append(category_id).append('\'');
        sb.append(", category='").append(category_name).append('\'');
        sb.append(", regdate=").append(regdate);
        sb.append(", board_cnt=").append(board_cnt);
        sb.append(", seq=").append(seq);
        sb.append('}');
        return sb.toString();
    }

}

○ equals, hashCode 자동 생성

@EqualsAndHashCode 어노테이션을 이용해 equals(), hashCode() 메서드를 생성할 수 있다.

callSuper 속성을 통해 메소드 자동 생성 시 부모 클래스의 필드까지 감안할지 안 할지에 대해서 설정할 수 있다. callSuper = false가 디폴트값이며, 자신 클래스의 필드 값들만 고려한다.

@Data

@Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode 한번에 설정해주는 어노테이션이다.

profile
훈이야 화이팅
post-custom-banner

0개의 댓글