Java + SpringBoot를 사용하는 프로젝트를 한다면 롬복을 한 번쯤은 써봤을 것이고, 없으면 안 된다는 사람도 있을 것이다. 근데 "롬복을 제대로 알고 있나?"라는 의문이 들어서 정리해보려고 한다.
Lombok 🌶️
공식문서를 보면 롬복은 코드 작성을 편하고 훨씬 간결하게 도와주는 도구라고 생각하면 된다.
Project Lombok(롬복)은 자바 라이브러리로, 자동으로 에디터와 빌드 도구에 연결됩니다. 이 라이브러리를 사용하면 자바 코드 작성을 훨씬 간결하게 할 수 있습니다.
롬복을 사용하면 귀찮은 getter, setter, equals, hashCode와 같은 메서드를 수동으로 작성할 필요가 없습니다. 단순한 어노테이션 하나로 클래스에 완전한 빌더 기능을 제공할 수 있습니다. 또한 로깅 변수 자동화와 같은 다양한 기능도 제공하여 코드의 반복과 중복을 줄여주며, 개발자의 생산성을 향상해 줍니다.
먼저 자주 사용하는 기능 중에 헷갈릴만한 `@NoArgsConstructor`, `@AllArgsConstructor`, `@RequiredArgsConstructor`에 대해 정리해보려고 한다.
@NoArgsConstructor
- `@AllArgsConstructor`는 인자(파라미터)가 없는 기본 생성자를 생성한다.
> 이름에서 알 수 있듯이 '아무것도 필요하지 않은 생성자'를 만들어준다.
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class ToyBox {
private String toyName;
private int toyCount;
public void showToys() {
System.out.println("장난감 이름: " + toyName + ", 장난감 개수: " + toyCount);
}
}
class TestMain {
public static void main(String[] args) {
// 빈 상자(ToyBox)를 만듭니다.
ToyBox emptyBox = new ToyBox();
emptyBox.showToys(); // 이 상자 안에는 아무것도 들어있지 않다.
}
}
생일 선물로 상자를 받았다고 생각해 보자. 그 상자 안에는 아무것도 들어있지 않다. `@NoArgsConstructor`는 그런 빈 상자 같은 역할을 하는 생성자를 만들어주는 기능이다.
여기서 `ToyBox`라는 클래스는 장난감의 이름(`toyName`)과 개수(`toyCount`)라는 두 가지 정보를 가지고 있다. 보통 상자 안에 무언가를 넣을 때는 무엇을 넣을지 알아야 하는데, `@NoArgsConstructor` 덕분에 아무것도 안 넣고 빈 상자를 만들 수 있다.
`TestMain`에서 `ToyBox`의 빈 상자를 만들고, 그 상자 안의 내용을 확인해 보면, 장난감의 이름은 아직 모르는 상태(`null`)이며, 장난감의 개수도 0개라는 것을 알 수 있다.
@RequiredArgsConstructor
- `@RequiredArgsConstructor `는 초기화되지 않은 `final` 필드 또는 `@NonNull`로 표시된 필드에 대한 생성자를 생성한다. 즉, 필수적으로 초기화가 필요한 필드들만을 인자로 받는 생성자를 생성한다.
> '필수로 필요한 것만을 가진 생성자'를 자동으로 만들어준다.
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class SpecialBox {
private final String favoriteToy; // 'final'은 이 변수가 꼭 필요하다는 것을 의미
private String otherToy;
public void showToys() {
System.out.println("가장 좋아하는 장난감: " + favoriteToy + ", 다른 장난감: " + otherToy);
}
}
class TestMain {
public static void main(String[] args) {
// 가장 좋아하는 장난감만 있는 SpecialBox를 만든다.
SpecialBox specialBox = new SpecialBox("트랜스포머");
specialBox.showToys();
}
}
이번에는 상자에 가장 좋아하는 장난감만 들어있다고 생각해 보자. 다른 것은 필요 없고, 그 장난감만 있으면 된다. `@RequiredArgsConstructor`는 그런 상자를 만들 때 필요한 생성자를 자동으로 만들어주는 기능이다.
`SpecialBox`라는 클래스는 `favoriteToy`와 `otherToy`라는 두 가지 정보를 가지고 있다. 하지만 `favoriteToy`는 `final` 키워드가 붙어있기 때문에 이 장난감은 상자에 꼭 들어가야 한다. 그래서 `@RequiredArgsConstructor`는 `favoriteToy`만을 요구하는 생성자를 만들어준다.
@AllArgsConstructor
- ` @AllArgsConstructor`는 모든 필드에 대한 생성자를 생성한다. 즉, 클래스의 모든 멤버 변수를 인자로 받는 생성자를 만든다.
> '모든 것을 필요로 하는 생성자'를 자동으로 만들어준다.
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class GiftBox {
private String toy;
private String chocolate;
public void showGifts() {
System.out.println("장난감: " + toy + ", 초콜릿: " + chocolate);
}
}
class TestMain {
public static void main(String[] args) {
// 장난감과 초콜릿이 들어있는 GiftBox를 만든다.
GiftBox filledBox = new GiftBox("레고", "허쉬");
filledBox.showGifts();
}
}
이번에는 선물로 상자를 받았는데, 그 안에는 좋아하는 장난감과 초콜릿이 들어있다고 생각해 보자. 이 상자는 선물 받기 전에 이미 내용물이 들어있어야 한다. ' @AllArgsConstructor`는 그런 상자를 만들 때 필요한 생성자를 자동으로 만들어주는 기능이다.
`GiftBox`라는 클래스는 장난감(`toy`)과 초콜릿(`chocolate`)이라는 두 가지 정보를 가지고 있다. `@AllArgsConstructor` 덕분에 우리는 장난감과 초콜릿을 모두 담은 `GiftBox`를 만들 수 있다.
이렇게 롬복을 사용하면 코드를 더 간결하게 만들어주면서, 자주 사용하는 패턴의 생성자 코드를 쉽게 작성할 수 있도록 도와준다.
더 확인해 보면 좋을 것 같은 Builder 심화
https://adjh54.tistory.com/96
https://adjh54.tistory.com/152
언제나 잘못된 설명이나 부족한 부분에 대한 피드백은 환영입니다🤍