Lombok은 자바의 Annotation processsor
라는 기능을 이용해서 컴파일 시점에 Lombok의 어노테이션을 읽어서, 다양한 메스드와 생성자(getter, setter, constructor등등)를 생성해주는 라이브러리이다.
즉, 개발자가 해야하는 기본적이고 반복적인 일들을 정해진 위치에 @어노테이션
만 붙여주면, Lombok이 이런 일들을 대신 해주는 것이다.
다양한 Before/After 비교를 통해서 Lombok이 얼만큼 코드를 간소화 시켜줄 수 있는지 살펴보자.
@RequiredArgsConstructor
라는 어노테이션은 final
또는 @NonNull
키워드가 붙은 필드에 대해서 생성자를 자동으로 만들어준다.
HelloLombokConstructor(String name) {
this.name = name
}
Lombok에는 더 다양한 기능들이 있는데, 더 많은 기능들과 Spring에서의 사용법은 밑에서 더 살펴보겠다.
Lombok을 사용하기 위한 설정법들을 알아보자.
- Java Spring 프레임워크를 쓴다.
- 개발하던 중간에 Lombok 라이브러리를 추가하는 상황이다.
- 빌드 툴은 gradle (maven도 같은 흐름으로 설정해주면 된다.)
뭐니뭐니해도 start.spring.io에서 패키지를 export할 때, Lombok 라이브러리를 포함시켜주는 게 가장 편하다. 🤭
build.gradle에 configurations
와 dependencies
에 아래의 코드들을 각각 추가해주자.
compileOnly {
extendsFrom annotationProcessor
}
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
그리고 IntelliJ의 코끼리를 refresh해주자. ㅎㅎ
InteliJ의 플러그인에서 lombok
을 검색해서 설치하자.
참고로 나는 따로 설치한 적이 없는데, 이미 설치가 되어있었다(?) 🤭
설정에서 "annotation process"를 검색해서 아래의 항목을 활성화 해주자.
이제 Lombok이 무엇인지, 어떻게 설치하는 지도 알아봤으니 Lombok의 핵심적인 기능들에 대해서 살펴보고, 실무에 어떻게 적용할 수 있을지 알아보도록하자.
이 어노테이션들은 위에서 언급했으므로 생략!
이름 그대로 toString()
을 자동으로 생성해주는 어노테이션이다.
원래는 아래의 이미지처럼 개발자가 직접 toString을 생성해줘야하지만, 이것을 Lombok에서 생성해준다.
이름 그대로 equals()
, hashCode()
메소드를 생성해주는 어노테이션이다.
아래의 코드를 Lombok이 생성해준다.
==
과의 차이점은, ==
은 주소값을 비교하는 것이고, equals()는 값 자체를 비교하는 것이다.true
가 return이 된다.- hashcode가 다르다 -> 두 객체는 다르다.
- hsahcode가 같다 -> 두 객체는 다를수도 있고, 같을 수도 있다.
즉, hashcode로 비교해서 같은 객체인지 판별하고 만약 hashcode가 갖다면, 그 때 equals()로 다시 두 객체를 비교하는 것이다.
왠만하면 다른 객체는 hashcode가 다를 확률이 높으므로, 두 객체를 비교할 때 적은 비용이 든다고 하는 것이다.
이 어노테이션은 위의 5개의 어노테이션을 한번에 설정해준다.🙊
(스고이...)
final
같은 키워드가 아무것도 붙어있지 않는 필드의 Constructor를 자동으로 생성해준다.
모든 필드에 대해서 Constructor를 자동으로 생성해준다.
-> 스프링에서는 의존성 주입(Dependancy injection)을 해줄때 자주 사용한다. DI는 주로 생성자에서 많이 이루어진다. 다시 말해서 반복적으로 모든 클래스에 생성자를 만들고 해당 클래스에서 사용되는 외부 객체들을 주입하는 코드를 개발자가 작성해야한다는 것이다. 이는 복잡한 서비스 로직이 아니고 반복적인 작업이기 때문에 Lombok을 이용해서 코드를 깔끔하게 만들 수 있다.
@Component
public class OrderServiceImpl implements OrderService{
private final UserRepository userRepository;
@Autowired
public OrderServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public Order createOrder(Long userId, String itemName, int itemPrice) {
User user = userRepository.findById(userId);
return new Order(userId, itemName, itemPrice);
}
}
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService{
private final UserRepository userRepository;
@Override
public Order createOrder(Long userId, String itemName, int itemPrice) {
User user = userRepository.findById(userId);
return new Order(userId, itemName, itemPrice);
}
}
before와 after의 차이는 생성자의 유무이다.
Lobmok의 도움을 받지 않는다면, userRepository
를 생성자에서 주입 받아야하는데, @RequiredArgsConstructor
를 사용함으로써 이 부분을 자동으로 해준다.
Lombok이 많은 기능들을 마법처럼 제공해주는 장점이 있지만 그렇기 때문에 개발자가 의도하지 않은 동작들이 일어날 수 있다. 그래서 개발자는 많이 주의해야한다. Lombok을 사용할 때, 아래의 내용을 주의해서 사용하자.
(개인적으로는 @Getter, @Setter, @RequiredArgsConstructor외에는 잘 안쓴다 😂)
자세한 Lombok 주의사항은 다른 블로그에 잘 설명이 되어 있어서 읽어보면 좋을 것 같다. 🙏
이번 글에서는 Lombok에 대해서 살펴보았다.
많은 편리한 기능들을 제공하지만 Lombok에 대해서 잘 이해하고, 필요한 곳에 정확히 사용해야겠다.
Lombok에 대한 주의사항은 다른 블로그들에서 너무 잘 설명이 되어 있어서 다른 블로그들을 첨부 하였는데, 혹시나 Lombok을 사용할 사람들이라면 꼭 읽어보면 좋을 것 같다.
(사실 내 글 보다 중요할 수도..? 🤭)
모두 행복코딩하길 바라며! 이번 글을 마치겠다 🙏