반응형
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

+ Recent posts