본문으로 바로가기

[Java] Lombok Library

category Launguage/Java 2021. 11. 22. 01:03

Lombok 이란?

Java 를 이용해 개발을 하다보면 Getter, Setter, ToString 등.. 기계적으로 작성해야하는 코드들이 존재한다.

Lombok 라이브러리는 어노테이션을 통해 빈번하게 사용되는 메소드를 자동으로 생성해주는 기능을한다.

Getter / Setter 자동 생성

@Getter 와 @Setter 어노테이션은 Java Class 에 선언된 필드(프로퍼티)의 getXxx() / setXxx() 메소드를 자동으로 생성해준다.

/* 특정 프로퍼티에 추가 */
package com.cheolwon.tailerbox.data.entity;

import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotNull;

public class UserEntity {

    @NotNull
    private long userId;

    /* userName 필드에 대한 getUsername() / setUserName() 메소드생성 */
    @NotNull
    @Getter @Setter
    private String userName;

}

/**
 * 전체 프로퍼티에 getter / setter 메소드 추가
 * getUserId() / setUserId()
 * getUserName() / setUserName()
 */
package com.cheolwon.tailerbox.data.entity;

import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotNull;

@Getter @Setter
public class UserEntity {

    @NotNull
    private long userId;

    @NotNull
    private String userName;

}

위와 같이 특정 필드(프로퍼티)에 추가하는 경우 해당 필드에 대한 get / set 메소드가 자동 생성되며 아래와 같이 사용할 수 있다.

UserEntity userEntity = new UserEntity();
userEntity.setUserName("tailerbox")
String userName = userEntity.getUserName()

Constructor 자동 생성

@NoArgsConstructor : 파라미터가 없는 생성자를 생성

@AllArgsConstructor : 모든 필드값을 파라미터로 받는 생성자를 생성

@RequiredArgsConstructor : final 또는 @NotNull 인 필드 값만 파라미터로 받는 생성자를 생성

 

ToString 메소드 자동 생성

@ToString : toString() 메소드를 자동으로 생성. exclude 속성을 사용하면 특정 필드를 toString() 결과에서 제외한다.

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

위와 같이 클래스에 @ToString 어노테이션을 붙여주면된다. exclude 속성에 사용된 password는 결과에서 제외된다.

User user = new User();
user.setId(1L);
user.setUserName("tailerbox");
user.setPassword("1234");
user.setScores(new int[] {90, 80, 100});
System.out.println(user);

다음과 같이 Class(field1=value1, field2=value2, ...) 와 같은 형태로 출력된다.

User(id=1, username=tailerbox, scores=[90, 80, 100])

equals, hashCode 자동 생성

자바빈을 만들 때 equals 와 hashCode 메소드를 자주 오버라이딩 한다.

@EqualsAndHashCode(callSuper = true) 어노테이션을 사용하면 해당 메소드를 자동으로 생성할 수 있다.

@EqualsAndHashCode(of = {"username", "email"}, callSuper = true)
public class User extends Domain {
  private String username;
  private String email;
  private String password;
}

of 속성을 사용하여 비교 대상이 되는 필드의 값을 지정할 수 있고, 위의 코드에서는 비교 대상이 되는 두 객체의 필드 중 username 과 email 필드가 동일한 경우 같은 객체로 인식하도록 해주고있다. callSuper 속성을 통해 부모 클래스의 필드 포함여부를 선택 적용할 수 있다.

@Data

@Data는 위에 설명한 @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode 를 한번에 설정해주는 매우 유용한 어노테이션이다.

@Data
public class User {
  // ...
}

@Builder

@Builder 어노테이션은 객체를 생성할 때  각 필드에 build 메소드가 추가된 Builder 패턴을 적용시켜준다.

모든 필드에 대한 build를 하고자 한다면 클래스의 상단에 어노테이션을 추가하면 되지만, 특정 필드에 대해서만 적용하기를 원할 경우 생성자를 작성하고 생성자의 상단에 @Builder 어노테이션을 추가하면된다.

@Data
@Builder
public class UserEntity {

    @NotNull
    private long userId;

    @NotNull
    private String userName;

}

위와 같이 어노테이션을 추가했다면 아래와 같은 형태로 객체를 초기화 할 수 있다.

UserEntity userEntity = new UserEntity();
userEntity.builder()
	.userId(1L)
	.userName("tailerbox")
	.build();

@Delegate

@Delegate 어노테이션은 한 객체의 메소드를 다른 객체로 위임시켜준다. 만약 Store 에 Review를 추가하는 상황이라고 가정하자.

/* Review Class */
@AllArgsConstructor
@Getter
public class Review {
    private String userName;
    private String contents;
}

/* Store Class */
@Getter
@NoArgsConstructor
public class Store {
    private String storeName;
    private String telephone;
    @Delegate
    private List<Review> reviewList;
}


/* 사용하기 */

Review review = new Review("글쓴이", "내용");

// Delegate가 되지 않은 상태
store.getReviewList.add(review)

// @Delegate를 사용한 경우
store.add(review)

'Launguage > Java' 카테고리의 다른 글

[Java] JavaFaker (Mock Data 만들기)  (0) 2021.12.06
[Java] JPA (Java Persistance API)  (0) 2021.12.02