💡 Lombok
- Lombok(롬복)은 Java 라이브러리로, 반복되는
getter
,setter
,toString
등의 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리입니다. - 보통 Model 클래스나 Entity 같은 도메인 클래스 등에는 수많은 멤버변수가 있고 이에 대응되는
getter
와setter
그리고toString()
메서드 그리고 때에 따라서는 멤버변수에 따른 여러 개의 생성자를 만들어주게 되는데, 거의 대부분 이클립스 같은 IDE의 힘만으로 생성한다고 하지만 이 역시도 번거로운 작업이 될 수 있습니다. - 뿐만 아니라 코드 자체가 반복되는 메서드로 인해 매우 복잡해지게 됩니다.
public class CategoryModel {
private String id;
private String parentId;
private String name;
private Long depthLevel;
private Long seq;
private String userYn;
public CategoryModel() {}
public CategoryModel(String id, String parentId, String name, Long depthLevel, Long seq, String userYn) {
super();
this.id = id;
this.parentId = parentId;
this.name = name;
this.depthLevel = depthLevel;
this.seq = seq;
this.userYn = userYn;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getDepthLevel() {
return depthLevel;
}
public void setDepthLevel(Long depthLevel) {
this.depthLevel = depthLevel;
}
public Long getSeq() {
return seq;
}
public void setSeq(Long seq) {
this.seq = seq;
}
public String getUserYn() {
return userYn;
}
public void setUserYn(String userYn) {
this.userYn = userYn;
}
@Override
public String toString() {
return "CategoryModel [id=" + id + ", parentId=" + parentId + ", name=" + name + ", depthLevel=" + depthLevel
+ ", seq=" + seq + ", userYn=" + userYn + "]";
}
}
- Lombok은 여러가지 어노테이션을 제공하고 이를 기반으로 코드를 컴파일과정에서 생성해 주는 방식으로 동작하는 라이브러리입니다.
- 즉 코딩 과정에서는 롬복과 관련된 어노테이션만 보이고
getter
와setter
메서드 등은 보이지 않지만 실제로 컴파일된 결과물(.class
)에는 코드가 생성되어 있다는 뜻입니다. - Lombok을 이용한다면 위 코드를 아래와 같이 축약할 수 있습니다. 클래스에
@Getter
,@ToString
등의 어노테이션을 붙여주기만 하면 됩니다.
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class CategoryModel {
private String id;
private String parentId;
private String name;
private Long depthLevel;
private Long seq;
private String userYn;
}
- 만약 위의 5가지 어노테이션을 붙이는것조차 부담스럽다면
@Data
어노테이션 하나만 붙여 사용할수도 있습니다.
@Data
public class CategoryModel {
private String id;
private String parentId;
private String name;
private Long depthLevel;
private Long seq;
private String userYn;
}
- 또한 보통의 프로젝트에서는 Log4j나 Slf4j 같은 Logging 프레임워크를 사용하는데, 항상 다음과 같이 비즈니스 로직과는 별개로 불필요한 코드가 작성되게 됩니다.
public class CategoryServiceImpl {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(CategoryServiceImpl.class);
//생략
}
- 이 또한 롬복을 사용하면 깔끔하게 코드를 줄일 수 있습니다.
@Slf4j
public class CategoryServiceImpl {
//생략
}
💡 Lombok 어노테이션의 종류
- 생성자 관련
@NoArgsConstructor
: 매개 변수가 없는 기본 생성자를 생성force
:final
필드가 존재할 때 이를 null 또는 0으로 초기화해 기본 생성자를 만들 수 있게 한다.access
: 생성되는 메서드의 접근제어자 설정 (AccessLevel)onConstructor_ = {@어노테이션,...}
: 생성된 생성자에 어노테이션 추가staticName
: 해당 생성자를 사용하는static
생성자를 추가
@RequiredArgsConstructor
:final
필드만 포함된 생성자를 생성access
: 생성되는 메서드의 접근제어자 설정 (AccessLevel)onConstructor_ = {@어노테이션,...}
: 생성된 생성자에 어노테이션 추가staticName
: 해당 생성자를 사용하는static
생성자를 추가
@AllArgsConstructor
: 모든 필드를 포함한 생성자를 생성access
: 생성되는 메서드의 접근제어자 설정 (AccessLevel)onConstructor_ = {@어노테이션,...}
: 생성된 생성자에 어노테이션 추가staticName
: 해당 생성자를 사용하는static
생성자를 추가
- 메서드 관련
@Getter
: Getter를 자동으로 생성lazy
: Getter를 캐시하며, Getter가 CPU가 많이 필요하거나 메모리가 많이 필요한 표현식의 경우 유용 (private final 변수에만 사용 가능, 롬복에서 잠금 처리하여 Thread-safe일 필요없음)onMethod_ = {@어노테이션,...}
: 생성되는 메서드에 어노테이션 추가value
: 생성되는 메서드의 접근제어자 설정 (AccessLevel)
@Setter
: Setter를 자동으로 생성onParam_ = {@어노테이션,...}
: Setter의 매개 변수에 어노테이션 추가onMethod_ = {@어노테이션,...}
: 생성되는 메서드에 어노테이션 추가value
: 생성되는 메서드의 접근제어자 설정 (AccessLevel)
@ToString
: toString 메서드를 자동으로 생성includeFieldNames
: 이름-값 쌍으로 표현할지 값만 표현할지 여부of
: 포함할 필드 설정exclude
: 제외할 필드 설정callSuper
: 슈퍼 클래스의 toString 메서드 출력을 포함시킬지 여부doNotUseGetters
: toString 메서드 구현에 Getter 메서드를 사용하지 않고this
를 사용할지 여부onlyExplicitlyIncluded
: 필드에 설정된@ToString.Include
또는@ToString.Exclude
를 적용시킨다
@EqualsAndHashCode
: equals, hashCode 메서드를 자동으로 생성cacheStrategy
: hashCode의 호출 결과를 캐시하여 이후 호출에 사용할지 여부of
: 포함할 필드 설정exclude
: 제외할 필드 설정callSuper
: 슈퍼 클래스의 toString 메서드 출력을 포함시킬지 여부doNotUseGetters
: toString 메서드 구현에 Getter 메서드를 사용하지 않고 this를 사용할지 여부onlyExplicitlyIncluded
: 필드에 설정된@EqualsAndHashCode.Include
또는@EqualsAndHashCode.Exclude
를 적용시킨다.
@With
: with 메서드를 자동으로 생성- with 메서드는 해당 필드만 인자로 전달한 값으로 변경하여, 모든 필드를 사용한 생성자를 통해 새로운 객체로 반환한다. (해당 객체의 필드와 동일한 값을 설정하면 해당 객체를 반환한다.)
onParam_ = {@어노테이션,...}
: with 메서드의 매개 변수에 어노테이션 추가onMethod_ = {@어노테이션,...}
: with 메서드에 어노테이션 추가value
: 생성되는 메서드의 접근제어자 설정 (AccessLevel)
- 통합 기능
@Data
: 여러 어노테이션 통합@ToString
,@EqualsAndHashCode
,@Getter
,@Setter
,@RequiredArgsConstructor
기능을 함께 제공staticConstructor
:final
변수로 이루어진static
생성자를 만든다. (@RequiredArgsConstructor
를private
로 생성)
@Value
:@Data
의 변형된 기능- 모든 필드를
private final
로 설정, 클래스를final
로 설정, Setter를 생성하지 않는다. staticConstructor
:final
변수로 이루어진static
생성자를 만든다. (@RequiredArgsConstructor
를private
로 생성)
- 모든 필드를
- 빌더 패턴
@Builder
: 메서드 체이닝을 이용하는 static 메서드builder()
를 생성한다. (생성자 대신 편리하게 사용)access
:builder()
의 접근제어자 설정 (AccessLevel)builderClassName
: builder의 클래스 이름을 명시적으로 설정builderMethodName
:builder()
의 메서드 이름을 명시적으로 변경buildMethodName
:build()
의 메서드 이름을 명시적으로 변경toBuilder
: 인스턴스의 현재 값을 가지고 시작하는 builder를 생성setterPrefix
: Setter 메서드의 이름 앞에 해당 문자열을 붙인다.
@Builder.Default
: 명시적으로 기본값 설정- 필드에 값을 설정하지 않은 경우
0
/null
/false
로 기본값이 설정된다. - 이때 기본값을 지정하기 위해 사용
- 필드에 값을 설정하지 않은 경우
@Singular
: 해당 필드를 컬렉션으로 처리하여 다수의 값을 할당할 수 있다.- 값을 비우는 clear 메서드가 함께 생성된다.
- (
"필드명"
): 컬렉션의 값을 할당할 때 사용할 필드명을 따로 지정한다. (기존 필드명은 컬렉션 자체를 할당할 때 사용된다.)
- 그 외
@NonNull
: null-check 로직을 자동으로 생성하여 null 값이 넘어온 경우 NulPointerException 발생, 기본 생성자 대신 해당 필드를 포함한 생성자가 추가된다.@Cleanup
: 해당 영역을 벗어날 때 지정된 리소스의close()
를 호출,try-finally
구문이 적용된다.- (
"메소드명"
):close()
가 아닌dispose()
와 같은 리소스를 닫는 메소드를 호출하고자 할 때 속성으로 해당 메소드명 기입(매개 변수가 있는 메소드는 호출할 수 없다.)
- (
@Synchronized
: java의synchronized
에서 더 안전하게 변형된 기능- static, instance 단위로 락을 거는
synchronized
와 다르게 필드 단위로 락을 건다. (메소드에만 사용 가능) - (
"필드명"
): 해당 필드에 락을 건다.
- static, instance 단위로 락을 거는
@SneakyThrows(예외클래스)
: try-catch 문법으로 해당 예외를 처리, Checked Exception 처리에 유용@Log
,@CommonsLog
,@Log4j2
,@Slf4j
등: 로그 프레임워크를 log라는 이름의private static final
필드로 생성한다.
💡 Lombok 사용 방법
- 우선 아래와 같은 의존성 추가 작업을 수행해줍니다.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
- 이제 위의
org.projectlombok
경로로 이동할 텐데, 우리가 라이브러리를 위처럼 추가하면 Maven은 사용자 폴더의.m2
폴더 안에 있는 repository 폴더로 해당 라이브러리를 저장해줍니다. - 따라서 해당 폴더로 이동한 뒤, 위의 경로를 따라 파일을 찾으면 됩니다.
- 해당 폴더로 이동하였다면 위와 같이 우클릭을 통해 Git Bash를 실행시킨 뒤, 아래와 같은 명령어를 통해 버전에 맞는 jar 파일을 실행시켜줍니다.
$ java -jar lombo-1.18.24.jar
- 그럼 다음과 같은 창이 뜰텐데 여기서 'Specify location' 버튼을 클릭하고 현재 사용하고 있는 프레임워크의 실행 파일 경로를 등록해줍니다.
- 이후 'Install / Update' 버튼을 클릭하여 설치를 완료하고 프로그램을 종료합니다.
📌 References
'🥑 Web Technoloy' 카테고리의 다른 글
JPQL과 QueryDSL (0) | 2023.06.04 |
---|---|
JPA와 Hibernate 그리고 Spring Data JPA (0) | 2023.06.04 |
Spring AOP(Aspect Oriented Programming) (0) | 2023.06.03 |
SpringBoot에서 SMTP를 활용한 메일 전송 구현하기 (0) | 2022.11.16 |
Spring Interceptor 개념 정리, 적용법 (0) | 2022.11.15 |