본문 바로가기
Programming/Spring Boot

롬복(Lombok) 어노테이션(Annotation)

by 돌방로그 2023. 3. 16.


롬복 어노테이션 (Lombok Annotation)

Lombok Library는 코드를 줄여 가독성을 높여주는 라이브러리입니다.

 

 

@Getter

자동으로 getValue() 혹은 isValue()와 같은 접근자 메소드를 생성합니다. 

  • 변수 타입 별 메소드 종류
    • boolean 타입인 경우 → isValue()
    • boolean 타입이 아닌 경우 → getValue() 
  • 옵션
    • lazy: 처음 호출될 때 값을 한 번 계산하고 그 이후 Cache를 사용하는 접근자로 설정
      • Example: @Getter(lazy=true) 

 

Class에 선언된 경우 Class 내 선언된 모든 필드에 대해서 접근자 메소드를 생성합니다.

 

Example

// 선언부
public class User {
	@Getter
	private String name;

	...
    
    @Getter
    private boolean dispatchStatus;
    
    ...
}

// 사용부
String employeeName = user.getName();
boolean dispatchStatus = user.isDispatchStatus();

@Setter

자동으로 setValue()와 같은 설정 메소드를 생성합니다.

Class에 선언된 경우 Class 내 선언된 모든 필드에 대해서 설정자 메소드를 생성합니다.

 

Example

// 선언부
public class User {
	@Setter
	private String name;

	...
    
    @Setter
    private boolean dispatchStatus;
    
    ...
}

// 사용부
user.setName("홍길동");
user.setDispatchStatus(true);

@AllArgsConstructor

자동으로 모든 필드의 값을 파라미더로 전달받는 생성자를 생성합니다. 

 

Example

// 선언부
@AllArgsConstructor
public class User {
	@MonNull
	private String name;

	...
    
    private boolean dispatchStatus;
    
    ...
}

// 사용부
User user = new User("홍길동", ..., true);

@NoArgsConstructor

자동으로 파라미더가 없는 기본 생성자를 생성합니다.

 

Example

// 선언부
@NoArgsConstructor
public class User {
	private String name;

	...
    
    private boolean dispatchStatus;
    
    ...
}

// 사용부
User user = new User();

@RequiredArgsConstructor

자동으로 final이나 @NonNull인 필드 값만 파라미터로 전달받는 생성자를 생성합니다.

 

Example

// 선언부
@AllArgsConstructor
public class User {
	@MonNull
	private String name;

	...
    
    private boolean dispatchStatus;
    
    ...
}

// 사용부
User user = new User("홍길동");

@ToString

자동으로 필드의 toString 메소드를 생성합니다. 

Class에 선언된 경우 Class 내 선언된 모든 필드에 대해서 toString 메소드를 생성합니다.

  • 옵션
    • exclude: 특정 필드에 대해서 toString 메소드를 생성하지 않도록 선언

 

Example

// 선언부
@AllArgsConstructor
@ToString(exclude = "dispatchStatus")
public class User {
	private String name;

	...
    
    private boolean dispatchStatus;
    
    ...
}

// 사용부
User user = new User("홍길동", true);
System.out.println(user);

// 출력 결과
User(name=홍길동, dispatchStatus=true)

@NonNull

자동으로 선언된 필드와 메소드 파라미터에 대해 Null Check 로직을 생성합니다.

다만 Lombok 어노테이션을 이용하여 생성한 메소드나 생성자가 아닌 직접 코딩하여 생성한 메소드와 생성자에 대해서는 @NonNull의 효과가 적용되지 않습니다.

 

Example

// 사용한 경우
public ExampleFunction(@NonNull User user) {
	this.name = user.getUserName();
}

// 사용하지 않은 경우
public ExampleFunction(User user) {
	if(user == null) {
    	throw new NullPointerException("~~~");
    }
    this.name = user.getUserName();
}

@Cleanup

사용 중인 자원이 자동으로 닫히도록(→ close()) 합니다.

@Cleanup 사용하지 않은 경우 'try-catch-finally' 문의 finally 절에서 항상 close() 메소드를 선언하는 수고를 덜 수 있습니다.

 

Example

@Cleanup Connection con = DriverManager.getConnection(url, user, password);

@EqualsAndHashCode

자동으로 자바 빈의 equals, hashCode 메소드를 생성합니다. 

  • 옵션
    • callSuper: 자동 생성시 부모 클래스의 필드까지 감안할 것인지 설정
      • callSuper=true: 부모 클래스 필드 값도 동일한지 체크
      • callSuper=false (Default): 부모 클래스 필드 값 고려하지 않고 자신 클래스의 필드 값만 동일한지 체크

 

Example

// 선언부
@EqualsAndHashCode(callSuper=true)
public class User extends Employee {
	private String userName;
    private String userPhone;
}

// 사용부
User user1 = new User();
user1.setUserId("000001");
user1.setUserName("홍길동");
user1.setUserPhone("010-0000-0000");

User user2 = new User();
user2.setUserId("000000");
user2.setUserName("홍길동");
user2.setUserPhone("010-0000-0000");


user1.equals(user2);
// if 'callSuper=true' then false
// else if 'callSuper=false' then true

@Data

자동으로 아래 어노테이션들을 한번에 설정해주는 어노테이션입니다.

  • @Getter
  • @Setter
  • @RequiredArgsConstructor
  • @ToString
  • @EqualsAndHashCode

 

Example

@Data
public class User {
	...
}

@Value

한 번 생성하고 난 뒤, 변경할 수 없는 불변의 값을 지닌 객체를 생성할 때 사용하는 어노테이션입니다.

유사한 어노테이션으로 @Data가 있으며, 둘의 차이는 값의 불변 여부입니다.

 

Example

@Value
public class User {
	...
}

@Builder

빌더는 다수의 필드를 가지는 복잡한 클래스의 경우 생성자 대신 사용하는 경우가 많습니다.

이러한 빌더를 자동으로 선언한 클래스에 추가하는 기능입니다.

 

추가적으로 @Singular 어노테이션을 컬렉션으로 된 필드에 선언시 모든 원소를 한 번에 입력하지 않고 개별적으로 하나씩 추가하여 선언할 수 있습니다.

 

Example

// 선언부
@Builder
public class User {
	private String userName;
    private String userPhone;
    
    @Singluar
    private List<Integer> userGrade;
}

// 사용부
User user = User.builder()
	.userName("홍길동")
    .userPhone("010-0000-0000")
    .userGrade("A")
    .userGrade("B")
    .build();
    
// 결과
User(userName="홍길동", userPhone="010-0000-0000", userGrade=["A", "B'])

@Log

자동으로 Log 필드를 만들고 선언한 클래스의 이름으로 로거 객체를 생성 및 할당합니다.

@Log 외에도 @Slf4j, @Log4j2와 같은 다양한 어노테이션도 있습니다.

 

Example

// 사용한 경우
@Log
public class ExampleClass { 
	public static void main(String... args) {
    	log.info("Test Log");
	}
}

// 사용하지 않은 경우
public class ExampleClass { 
	public static void main(String... args) {
		private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName())
		log.info("Test Log");
	}
}

 

 


References

댓글