Lombok 살펴보기
현재의 자바 코딩에서 롬복은 필수적으로 사용되고 있습니다. 여러가지 필드 변수들을 통해 Getter, Setter를 구성하는 JPA 특성 상 꼭 필요한 라이브러리입니다. 그렇기 때문에 롬복에 대해 먼저 살펴보도록 하겠습니다.
lombok 의존성 추가
dependencies {
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
}
@Getter, @Setter
Class User {
private String name;
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
}
위와 같이 외부에서 접근할 수 없는 변수의 경우 아래와 같이 필드 변수를 변경하거나 반환할 수 있는 함수를 만들어주어야 합니다.
public class User{
...
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getEmail(){
return email;
}
public void setEmail(String name){
this.email=email;
}
...
}
위와 같이 get
, set
메서드를 모드 선언해주는 것은 코드의 길이를 너무 길어지게 할 것입니다.
물론 이를 단축키나, 클래스 내부에서 마우스 오른쪽 버튼을 통해 한 번에 작성가능하게 할 수 있습니다.
하지만, 롬복을 사용하면 좀 더 간단하게 표현할 수 있습니다.
@Getter
@Setter
public clas User{
private String name;
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
}
위와 같이 @Getter
와 @Setter
를 클래스 범위에서 사용하면 각 필드 변수의 get
, set
메서드가 모두 선언된 것과 동일하게 사용가능합니다.
public clas User{
@Getter
@Setter
private String name;
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
}
위와 같이 필드 범위에서 사용하면 해당 필드의 get
, set
메서드만 선언된 것과 같은 효과를 냅니다.
클래스 명 위에서 마우스 오른쪽 클릭 후 refactor>delombok>{어노테이션}을 선택하면 해당 롬복 어노테이션이 사라지고 해당 롬복을 코드로 선언했을 때처럼 코드를 수정하게 됩니다. 이는 실제 컴파일이 진행될 때 생성되는 코드입니다.
위와 같은 경우 필드 변수가 4개 밖에 없지만, JPA에서 사용하는 엔티티의 경우 컬럼들이 모두 필드로 표현되게 됩니다. 그렇기 때문에 컬럼의 숫자가 많을 경우 위와 같은 롬복이 굉장히 도움이 될 것입니다.
@Tostring
toString 메서드를 자동으로 오버라이딩 해서 생성해주는 롬복입니다.
자바의 모든 클래스는 Object 클래스를 상속받고 있기 때문에 toString
메서드를 오버라이딩해서 사용할 수 있습니다.
@Getter
@Setter
public clas User{
private String name;
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
@Override
public String toString(){
return getClass().getName()
+ " : "
+ ", name = " + name;
+ ", email = " + email;
+ ", phoneNumber = " + phoneNumber;
+ ", createdAt = " + createAt;
}
}
위와 같이 구현을 할 경우 필드가 추가될 때마다 수동으로 toString 메서드를 수정해줘야 됩니다. 이를 방지하기 위해 @ToString
롬복을 사용합니다.
@Getter
@Setter
@ToString
public clas User{
private String name;
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
}
위와 같이 선언해 준다면 해당 클래스의 toString
메서드를 자동으로 오버라이딩 해주고, 해당 내용은 모든 필드 변수를 확인할 수 있는 형식입니다.
@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsContructor
각 롬복의 이름만으로도 뜻을 어느정도 유추할 수 있습니다. 각각은 매개변수를 갖지 않는 생성자, 모든 매개변수를 가지는 생성자와 필수 멤버변수를 인자로 받는 생성자를 만들어주는 롬복입니다.
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public clas User{
@NonNull
private String name;
@NonNull
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
}
class UserTest {
@Test
void test(){
// NoArgsConstructor
User user1 = new User();
user.setName("name");
user.setEmail("email");
//AllArgsConstructor
User user2 = new User("name1","email1","phone number", LocalDateTime.now());
//RequiredArgsConstructor
User user3 = new User("name2", "email2");
}
}
멤버 변수위에 @NonNull
롬복이 있을 경우 필수 멤버 변수가 됩니다.
@Data
롬복은 @RequiredArgsConstructor
를 기본 제공합니다.
JPA에서 기본 스펙 상 기본 생성자를 필요로 하기 때문에 @NoArgsConstructor
는 필수적입니다.
@EqualsAndHashCode
JPA에서 사용할 일은 크게 없지만 @Data
어노테이션 상에서 구현되어 있고, 자바에서 객체의 동등성을 비교하기 위해서 equals 메서드와 hashcode 메서드를 오버라이딩 할 것을 권장하고 있기 때문에 @EqualsAndHashcode
를 선언해줍니다.
@Data
@Getter
, @Setter
, @RequiredArgsConstructor
, @ToString
, @EqualsAndHashCode
어노테이션을 모두 선언한 것과 동일한 효과를 줍니다.
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode
public clas User1{
@NonNull
private String name;
@NonNull
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
}
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
public clas User2{
@NonNull
private String name;
@NonNull
private String email;
private String phoneNumber;
private LocalDateTime createdAt;
}
위의 User1 클래스와 User2 클래스는 동일합니다.
@Data
에 @RequiredArgsConstructor
어노테이션이 포함되어 있다고 했지만, 위의 User2에서 @RequiredArgsConstructor
를 선언해준 이유는 다음과 같습니다.
@Data
의 경우 이전에 명시적으로 작성된 생성자가 존재할 경우 새로운 생성자를 만들지 않습니다. 그렇기 때문에 위와 같은 경우 User2에 @RequiredArgsConstructor
를 선언해주지 않으면 필수 멤버 변수를 포함한 생성자는 제공되지 않습니다. 그렇기 때문에 다른 생성자 관련 어노테이션이 선언되어 있다면, 필요할 경우 @RequiredArgsConstructor
를 선언해주어야 합니다.
@Builder
@AllArgsConstructor
와 마찮가지로 모든 필드값을 주입해 객체를 만들 수 있도록 합니다.
User user = User.builder()
.name("name")
.email("email@gmail.com")
.build();
빌더 형식으로 인스턴스를 만들 수 있습니다.