반응형
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 적용 방법
- maven 적용 시 pom.xml 파일에 아래 코드 적용
- lombok 버전의 경우 https://mvnrepository.com/artifact/org.projectlombok/lombok 참고하여 적용
<!-- 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:티스토리]
반응형
'Develops > JAVA' 카테고리의 다른 글
[JAVA] try-with-resources 활용하기 (자동 자원종료 기능) (3) | 2024.11.02 |
---|---|
[JAVA] 변수명 표기법 정리 (카멜, 파스칼, 스네이크, 케밥, 헝가리안) (0) | 2024.05.18 |
[JAVA] 자바 로깅 비교 (Logger, Log4j, SLF4J, Logback, Log4j2) (0) | 2024.03.30 |
[JAVA] 문자열 Byte로 자르기 (0) | 2024.03.03 |