반응형
Lombok이란?
Lombok은 자바 Domain(DTO, VO) 에서 반복적으로 작성되는 getter/setter나 toString, 생성사 코드 등의 소스들을, 어노테이션(Annotaion)을 사용하여 생략할 수 있도록 컴파일 시점에 자동으로 생성해주는 라이브러리이다.
환경
IntelliJ IDEA Ultimate 2021. 3. 2
Gradle 7.4.1
※IntelliJ 2020.03 이후 버전에서는 기본Plugin으로 Lombok이 설치되어 있습니다.
설치방법
파일 -> 설정 -> 플러그인 -> Lombok 검색 후 설치
Dependency 설정하기
Lombok Plugin을 사용하기 위해서는 dependency에 추가되어야만 사용이 가능하다.
Gradle 7.4.1
//build.gradle
...
dependencies {
//lombok plugin
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//default
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Annotation Processing 설정하기
어노테이션 프로세싱 활성화를 해주어야 어노테이션 기반인 lombok을 사용할 수 있습니다.
파일 -> 설정 -> 빌드,실행,배포 -> 컴파일러 -> 어노테이션프로세서 에서 어노테이션 처리 활성화를 체크해준다
Lombok의 Annotation
@Getter/@Setter
- 어노테이션을 붙인 클래스 멤버 변수들 혹은 특정 변수의 getXXX(), setXXX() 메소드를 생성한다.
- 기본적으로 public method로 선언된다.
- @Setter(AccessLevel.PRIVATE)처럼 AccessLevel을 통하여 접근권한을 설정할 수 있다. (PRIVATE, PROTECTED 등)
- @Setter 같은 경우는 무결성이 보장되어야 하는 클래스나 변수에는 사용을 지양해야 한다.
@ToString
- 어노테이션을 붙인 클래스의 toString() 메소드를 생성한다.
- @ToString(callSuper = true)를 사용하면 상속받은 클래스의 정보까지 출력된다. (default값은 false)
- @ToString을 붙인 클래스에 순환 참조를 하는 객체 타입 필드가 있다면, 무한 루프가 발생한다.
- ex1) 클래스 A에 어노테이션을 붙였는데, A의 멤버 변수에 클래스 B타입이 있고 B의 멤버 변수에 클래스 A타입이 있을 경우 무한루프 발생
- solution) @Tostring(exclude = "A")와 같이 명시적으로 해당 필드를 제외시켜줘야 한다.
@NonNull
- 어노테이션을 붙인 변수는 반드시 값이 있어야 한다.
- Setter에 null 값이 들어오게 되면 NulPointerException이 발생하게된다.
- @NonNull은 불필요하게 branch coverage를 증가시키므로 사용이 권장되지는 않는다.
@NoArgsConstructor
- 어노테이션이 붙은 클래스의 기본 생성자를 생성한다.
- AcessLevel 을 통하여 접근권한을 설정할 수 있다.
- 기본값은 Public 이지만, Protected 를 사용하여 안전성을 보장해주는 것을 권장한다.
@RequiredArgsConstructor
- 어노테이션이 붙은 클래스의 final 혹은 @NonNull인 필드만을 포함한 생성자를 생성한다.
- AccessLevel을 통하여 접근권한을 설정할 수 있다.
- 필드에 잘못된 값이 들어가도 에러를 뱉이 않을수도 있기에 사용에 주의가 필요하다.
@AllArgsConstructor
- 어노테이션이 붙은 클래스의 모든 필드를 포함한 생성자를 생선한다.
- AccessLevel을 통하여 접근권한을 설정할 수 있다.
- 필드에 잘못된 값이 들어가도 에러를 뱉지 않을수도 있기에 사용에 주의가 필요하다.
@EqualsAndHashCode
- 어노테이션이 붙은 클래스에 equals()와 hashCode() 메소드를 생성한다.
- exclude를 통하여 특정 필드를 제외시킬 수 있다.
- equals() - 두 객체의 내용이 같은지 비교하는 메소드이다.
- hashCode() - 해당 객체의 해시값을 반환하는 메소드이다.
@Data
- @Getter, @Setter, @EqualsAndHashCode, @RequiredArgsConstructor, @ToString 을 포함한다.
- @Data(staticConstructor = "foo") 와 같이 foo라는 static factory method를 생성 할 수도 있다.
@Value
- 어노테이션이 붙은 클래스를 불변(Immutable) 클래스로 선언한다.
- 모든 필드와 클래스를 기본적으로 private 및 final로 선언하고, setter 메소드를 생성하지 않는 점을 제외하곤 @Data와 비슷하다.
@Cleanup
- close() 메소드를 자동으로 호출해주어, close()관련 코드 작성을 최소화 할 수 있다.
@Synchronized
- synchronized 키워드를 사용할 때 데드락이 발생하는 경우를 방지하기 위해 어노테이션이 붙은 메소드가 실행되기 전에 잠금 $lock이라는 개인 잠금 필드를 생성한다
- lock 오브젝트를 자동으로 생성하므로, Synchronized를 손쉽게 사용할 수 있게 해준다.
@Builder
- 빌더 패턴을 사용할 수 있도록 빌더API를 제공한다
- private 이긴 하지만, @AllArgsConstructor를 기본적으로 적용한다.
- 클래스보다는 사용자 정의 생성자 혹은 static 객체 생성 메소드에 사용하는 것을 권장한다.
- @Singular : Collection 타입에 서넝ㄴ하게 되면 파라미터를 하나씩 추가할 수 있다.
@Log, @Slf4j
- 로그를 남기기 위한 어노테이션이다.
- 어노테이션을 클래스에 선언하면, log관련 static 메소드를 선언하지 않아도 된다.
정리
보통 @Getter, @Setter, @ToString, @Builder, @Log 정도만 많이 사용한다고 합니다.
@Data 보다는 코드가 길어지더라도 필요한 어노테이션만 선언하는 것을 권장합니다
출처
http://gre-eny.tistory.com/303
반응형
'BackEnd > Java' 카테고리의 다른 글
[Spring] Spring Security + jwt 사용 (0) | 2022.07.23 |
---|---|
[Thymeleaf] layout-dialect 사용하기 (0) | 2022.07.22 |
SpringBoot MySQL & JPA 연동 (0) | 2022.03.31 |
JAVA 버전이 변경 안될때 체크사항 (0) | 2022.03.16 |
IntelliJ 설치 (0) | 2022.03.15 |