언어/Java

Lombok 살펴보기

cottoncover 2023. 8. 16. 09:48
728x90
반응형
SMALL

현재의 자바 코딩에서 롬복은 필수적으로 사용되고 있습니다. 여러가지 필드 변수들을 통해 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메서드를 자동으로 오버라이딩 해주고, 해당 내용은 모든 필드 변수를 확인할 수 있는 형식입니다.

toString 예시
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();

빌더 형식으로 인스턴스를 만들 수 있습니다.

반응형
LIST