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 |