웹 개발/spring

[lombok] 자주 사용하는 lombok 어노테이션

dani0312 2024. 2. 6. 11:17

지난 글에서는 생성자를 자동으로 생성해주는 어노테이션에 대해 알아보았다. 

이번 글에서는 Getter/Setter와 같이 빈번히 사용되는 유형들의 롬복 어노테이션에 대해 알아볼 것이다.

 

 

 

 

📌 lombok 주요 어노테이션

 

◾ 생성자 생성

생성자 자동 생성은 지난 시간에 알아보았지만 다시 간단히 정리하면 아래와 같다. 자세한 설명은 아래 링크를 참조할 수 있다. 

2024.02.03 - [웹 개발/java] - [lombok] 생성자 생성 어노테이션 3가지

 

생성자 자동 생성

@NoArgsConstructructor 매개변수가 없는 기본 생성자를 생성해준다.
@AllArgsConstructor 모든 필드 값을 매개변수로 받는 생성자를 만들어준다.  
@RequiredArgsConstructor final이나 @NonNull인 필드 값만 매개변수로 받는 생성자를 만들어준다.

 

 

 

◾ 메서드 생성

접근자/설정자 자동 생성

@Getter Getter를 자동으로 생성해준다.
@Setter Setter를 자동으로 생성해준다.

 

 

기타 유용한 메서드 자동 생성

@ToString toString() 메서드를 자동으로 생성해준다.
@EqualsAndHashCode equals(), hashCode()메서드를 자동으로 생성해준다.  
@With with()메서드를 자동으로 생성해준다.

 

🤔@With?

불변 객체를 쉽게 생성하고 수정할 수 있도록 도와준다. 이 어노테이션을 사용하면 해당 필드 값을 변경한 새로운 객체를 생성하는 메서드가 생성된다. 이 메서드는 기존 객체와 동일한 타입의 객체를 반환하며, 특정 필드의 값만 변경되어 있다.

 

⚠주의

@ToString은 멤버 변수 중 객체 타입이 존재하고 순환 참조가 있다면 무한 루프가 발생한다. 이 경우 꼭 `exclude`를 사용하는 것이 중요하다.

 

 

 

통합 기능

@Data @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 모두 포함한 편리한 어노테이션이다.
@Value @Data - @Setter + 불변성

 

@Value는 @Data의 변형된 기능이다. 모든 필드를 private final로, 클래스를 final로 설정하고 Setter를 생성하지 않는다. @Value를 사용하면 클래스가 불변성을 가지게 되어 객체의 상태를 변경할 수 없다. 

 

@Data에서 @Setter를 제외한 어노테이션들을 가진다. final이 붙기 때문에 setter는 존재할 수 없다.

@Data - @Setter = @Getter + @Setter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode

 

⚠주의

@Data는 @ToString과 마찬가지로 순환참조가 발생하는 경우, 문제가 발생한다. 이 경우에는 `exclude`를 사용할 수 없기 때문에 코드가 길어져도 @Data는 피하는 것이 좋다.

 

 

빌더 패턴

@Builder 메서드 체이닝을 이용하는 static메서드 builder()를 생성해준다.
@Builder.Default 명시적으로 기본값을 설정할 수 있다. 
@Singular 해당 필드를 컬렉션으로 처리하여 다수의 값을 할당할 수 있다. 

 

공식문서 https://projectlombok.org/features/Builder

 

 

 

 기타

@NonNull null-check로직을 자동으로 생성하여 null값이 넘어온 경우 NullPointerException이 발생한다.
@Log / @Slf4j 로깅 코드를 자동으로 생성하는데 사용된다.
@Cleanup 해당 영역을 벗어날 때 지정된 리소스의 close()를 호출한다.
@Synchronized 메서드 또는 코드 블록에 대한 synchronized블록을 자동으로 생성한다.

 

@Synchronized는 java의 synchronized의 더 안전하게 변형된 기능이다.

 

 

 

 

 

 

 


Reference

옵션 정리

https://velog.io/@0giri/Lombok-%EC%82%AC%EC%9A%A9%EB%B2%95

기능별로 정리

https://www.daleseo.com/lombok-popular-annotations/

간략히 정리

https://velog.io/@yeoj1n/Spring-Lombok-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98