Java/Lombok

Lombok이란?

kjwc 2023. 2. 27. 21:43
728x90

공식 홈페이지: https://projectlombok.org/

 

Lombok이란 Java의 라이브러리로 반복되는 메서드를 Annotation을 사용해서 자동으로 작성해주는 라이브러리입니다. 보통 DTO(Data Transfer Object)VO(Value Object), Model, Entity의 경우 GetterSetter, 생성자 등을 매번 작성해줘야 하는 경우가 많은데 이러한 부분을 자동으로 만들어주는 라이브러리라고 할 수 있습니다. 또한 DTO(Data Transfer Object)VO(Value Object)같이 자주 변경되는 클래스의 경우 멤버 변수가 추가되거나 없어질 때마다 Getter, Setter, 생성자 등을 수정해줘야 하는 경우가 발생하는데 이럴 때 Lombok을 이용하면 단순히 프로퍼티를 추가하고 삭제하는 것만으로도 충분합니다.

 

Lombok을 이용해서 작성한 코드는 컴파일 과정에서 Annotation을 이용해서 코드를 생성하고 이런 결과물이 컴파일되어 class 파일에 담기게 되는 것입니다. 또한 단순히 Annotation을 이용해서 코드를 작성해주는 라이브러리이므로 각 API가 어떤 식으로 작동하는지 숙지한 채로 사용하는 것이 좋습니다. 다른 라이브러리와 충돌이 발생할 수도 있고 내가 원하지 않는 방식으로 작동할 수도 있기 때문입니다.

 

Lombok 라이브러리는 개발자마다 호불호가 나뉠 수 있습니다. 일부 개발자들은 코드가 직접 눈에 보이는 직관성을 유지하는 것이 좋다고 보는 의견도 있는 만큼 자신의 프로젝트나 성향에 따라 사용하면 좋을 것입니다. 또한 API 설명과 내부동작을 어느 정도 숙지하고 사용해야 합니다. 예를 들어 Lombok@Data Annotation이나 @toString Annotation으로 자동 생성되는 toString() 메서드는 순환 참조 또는 무한재귀호출 문제로 인해 StackOverflowError가 발생할 수도 있습니다. 편리하다는 이유만으로 마구 사용한다면 여러 가지 예외 문제가 발생할 수 있음을 인지해야 합니다.

 

다음은 일반적인 자바 Code의 예입니다.

import java.util.Objects;

public class UserVO {
	private String  name;
	private int     age;
	private boolean gender;
	// 생성자
	public UserVO2() {
		
	}
	public UserVO2(String name, int age, boolean gender) {
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	// Getter & Setter
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public boolean isGender() {
		return gender;
	}
	public void setGender(boolean gender) {
		this.gender = gender;
	}
	@Override
	public String toString() {
		return "UserVO2 [name=" + name + ", age=" + age 
				+ ", gender=" + gender + "]";
	}
	@Override
	public int hashCode() {
		return Objects.hash(age, gender, name);
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		UserVO2 other = (UserVO2) obj;
		return age == other.age && gender == other.gender 
			   && Objects.equals(name, other.name);
	}
}

다음은 Lombok을 이용한 예입니다.

import lombok.Data;

@Data
public class UserVO {
	private String  name;
	private int     age;
	private boolean gender;
}

위의 두 코드는 동일하게 작동 된다. 롬복을 사용해 보는 것이 좋겠다는 생각이 드는가? 

 

728x90