Develops/JAVA

[JAVA] Lombok 활용하기(Annotation을 활용한 Getter, Setter 처리)

SLOTH91 2024. 3. 30. 12:46
반응형

Java 언어를 이용해 개발을 하다 보면 기계적으로 작성해야 하는 코드들(Getter, Setter, ToString 등)이 상당히 많은데, 그런 코드들을 자동화하여 코드 다이어트를 해주는 Java 필수 라이브러리가 Lombok이다.

 

설명

Lombok이란?

  • 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리
  • Getter, Setter, Equlas, ToString 등과 다양한 방면의 코드를 자동완성 해준다

Lombok 장점

  • 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
  • 반복되는 코드 다이어트를 통한 가독성 및 유지보수성 향상
  • Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용 가능

Lombok Annotation 종류

Annotation 설명
@Getter @Setter Lombok에서 가장 자주 활용하는 어노테이션이다.
@Getter와 @Setter를 클래스 이름 위에 적용시키면 모든 변수들에 적용이 가능하고, 변수 이름 위에 적용시키면 해당 변수들만 적용 가능하다.
@AllArgsConstructor 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션이다. 
@NoArgsConstructor 어떠한 변수도 사용하지 않는 기본 생성자를 자동완성 시켜주는 어노테이션이다.
@RequiredArgsConstructor 특정 변수만을 활용하는 생성자를 자동완성 시켜주는 어노테이션이다. 
생성자의 인자로 추가할 변수에 @NonNull 어노테이션을 붙여서 해당 변수를 생성자의 인자로 추가할 수 있다. 아니면 해당 변수를 final로 선언해도 의존성을 주입받을 수 있다.
@EqualsAndHashCode 클래스에 대한 equals 함수와 hashCode 함수를 자동으로 생성해준다. 
만약 서로 다른 두 객체에서 특정 변수의 이름이 똑같은 경우 같은 객체로 판단을 하고 싶다면 아래와 같이 해줄 수 있다.
ex) @EqualsAndHashCode(of = {"userId", "userName"}) 
@ToString 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성시켜 준다. 
출력을 원하지 않는 변수에 @ToString.Exclude 어노테이션을 붙여주면 출력을 제외할 수 있다. 또한 상위 클래스에 대해도 toString을 적용시키고자 한다면 상위 클래스에 @ToString(callSuper = true) 를 적용시키면 된다. 
@Data @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동완성 시켜준다. 실무에서는 무겁고 객체의 안정성을 지키기 때문에 @Data의 활용을 지양한다.
@Builder 해당 클래스의 객체의 생성에 Builder패턴을 적용시켜준다.
모든 변수들에 대해 build하기를 원한다면 클래스 위에 @Builder를 붙이면 되지만, 특정 변수만을 build하기 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션을 붙여주면 된다.
@Delegate 한 객체의 메소드를 다른 객체로 위임시켜 준다.
@Log 해당 클래스의 로그 클래스를 자동 완성 시켜준다. 
ex) @Log4j2

 

 

사용 예시

  • @Getter, @Setter
    • 모든 변수들에 대해 Getter 메소드를 만들고, name 변수에 대해서만 Setter 메소드 자동완성
@Getter
public class User extends Common {
    @Setter
    private String name;
    private String address;
}

 

  • @AllArgsConstructor
    • 모든 변수를 사용하는 생성자 자동완성
@AllArgsConstructor
public class User {
    private String name;
    private String address;
}

 

  • @NoArgsConstructor
    • 어떠한 변수도 사용하지 않는 기본 생성자 자동완성
@NoArgsConstructor
public class User {
    private String name;
    private String address;
}

 

  • @RequiredArgsConstructor
    • 특정 변수만을 활용하는 생성자 자동완성
@RequiredArgsConstructor
public class User {
    @NonNull
    private String name;
    private final String address;
    private String address;
    
    /* RequiredArgsConstructor 통해 아래의 생성자를 자동 생성할 수 있다.
    public User(String name, String address) {
        this.name = name;
        this.address = address;
    } */
}

 

  • @EqualsAndHashCode
    • 클래스에 대한 equals 함수와 hashCode 함수 자동생성
    • @EqualsAndHashCode(of = {"name", "subName"}) 설정하여 name 과 subName가 동일할 때 같은 객체로 인식
    • Common를 상속하고 있는데, 상위 클래스의 경우 적용시키지 않기 위해 callSuper=false 설정
@NoArgsConstructor
@EqualsAndHashCode(of = {"name", "subName"}, callSuper = false))
public class User extends Common {
    @NonNull
    private String name;
    @NonNull
    private String subName;
    private String address;
}

 

  • @ToString
    • 클래스의 변수들을 기반으로 ToString 메소드 자동완성
    • @ToString.Exclude 어노테이션을 붙여주면 출력 제외
    • 상위 클래스에 대해도 toString을 적용시키고자 한다면 상위 클래스에 @ToString(callSuper = true) 적용
@ToString
public class User extends Common {
    @ToString.Exclude
    private String name;
    private String address;
}

 

  • @Data
    • @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 자동완성 
@Data
public class User extends Common {
    private String name;
    private String address;
}

 

  • @Builder
    • 모든 변수들에 대해 build 하기를 원한다면 클래스 위에 @Builder 어노테이션 작성
    • 특정 변수만을 build 하기 원한다면 생성자를 작성하고 그 위에 @Builder 어노테이션 작성 
@Builder
public class User {
    private String name;
    private String address;
    private String phone;
    
    @Builder
    public User(String name, String address) {
        this.name = name;
        this.address = address;
    }
    
}

 

  • @Delegate
    • 한 객체의 메소드를 다른 객체로 위임
@AllArgsConstructor
@Getter
public class Product {
    private String productNo;
    private String productName;
}

---------------------------------------------------------------------------

@AllArgsConstructor
@Getter
public class User {
    private String name;
    private String address;
    
    @Delegate
    private List<Product> productList;
}

---------------------------------------------------------------------------

@RestController
@RequestMapping(value = "/User")
public class UserController {
    @GetMapping(value = "/select")
    private ResponseEntity select(@RequestBody User user){
        Product product = new Product(); 
        user.getProductList().add(product);     // 기존 방식
        user.add(product);                      // @Delegate 활용 방식

        return ResponseEntity.ok(user);
    }
}

 

  • @Log
    • @Log4j2와 같은 어노테이션을 활용하면 해당 클래스의 로그 클래스 자동완성
@RestController
@RequestMapping(value = "/User")
@Log4j2
public class UserController {
    @GetMapping(value = "/select")
    private ResponseEntity select(@RequestBody User user){
        return ResponseEntity.ok(user);
    }
}

 

 

Maven 적용 방법

      <!-- lombok -->
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.12</version>
          <scope>provided</scope>
      </dependency>

 

 

[참고]

https://mangkyu.tistory.com/78 [MangKyu's Diary:티스토리]

 

 

반응형