본문 바로가기
Develops/JAVA

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

by SLOTH91 2024. 3. 30.
반응형

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:티스토리]

 

 

반응형