ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Lombok 살펴보기
    언어/Java 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

    댓글

Designed by Tistory.