Lombok(롬복) 사용하기

🔥Log·2022년 11월 15일
1

스프링

목록 보기
3/18

🧐 Lombok(롬복)?


Lombok은 자바의 Annotation processsor라는 기능을 이용해서 컴파일 시점에 Lombok의 어노테이션을 읽어서, 다양한 메스드와 생성자(getter, setter, constructor등등)를 생성해주는 라이브러리이다.

즉, 개발자가 해야하는 기본적이고 반복적인 일들을 정해진 위치에 @어노테이션만 붙여주면, Lombok이 이런 일들을 대신 해주는 것이다.


🤭 Lombok의 효과


다양한 Before/After 비교를 통해서 Lombok이 얼만큼 코드를 간소화 시켜줄 수 있는지 살펴보자.

1) Getter/Setter

  • 💧 Before: 필드(변수) 하나에 getter와 setter를 생성해줘야해서 코드양이 많다.

  • 🔥 After: Lombok이 getter와 setter를 생성해주기 때문에 필드만 생성해주면 된다.

2) Constructor

@RequiredArgsConstructor 라는 어노테이션은 final 또는 @NonNull 키워드가 붙은 필드에 대해서 생성자를 자동으로 만들어준다.

  • 💧 Before: 보다시피 인자를 받아서 변수에 할당해주는 생성자를 작성해줘야한다.

  • 🔥 After: 어노테이션만 붙여주면, 끝! 코드엔 안보이지만 아래와 같은 생성자가 만들어져있는 것과 같다.
HelloLombokConstructor(String name) {
	this.name = name
}

🔥🔥🔥

Lombok에는 더 다양한 기능들이 있는데, 더 많은 기능들과 Spring에서의 사용법은 밑에서 더 살펴보겠다.


💻 Lombok 설치법


Lombok을 사용하기 위한 설정법들을 알아보자.

0) 전제

  • Java Spring 프레임워크를 쓴다.
  • 개발하던 중간에 Lombok 라이브러리를 추가하는 상황이다.
  • 빌드 툴은 gradle (maven도 같은 흐름으로 설정해주면 된다.)

뭐니뭐니해도 start.spring.io에서 패키지를 export할 때, Lombok 라이브러리를 포함시켜주는 게 가장 편하다. 🤭

1) build.gradle

build.gradle에 configurationsdependencies에 아래의 코드들을 각각 추가해주자.

  • configurations
compileOnly {
	extendsFrom annotationProcessor
}
  • dependencies
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
  • 이렇게 되면 됨

그리고 IntelliJ의 코끼리를 refresh해주자. ㅎㅎ

2) Lombok plugin 설치

InteliJ의 플러그인에서 lombok을 검색해서 설치하자.

참고로 나는 따로 설치한 적이 없는데, 이미 설치가 되어있었다(?) 🤭

3) Annotation processing 활성화

설정에서 "annotation process"를 검색해서 아래의 항목을 활성화 해주자.


🦾 Lombok의 대표적인 어노테이션들


이제 Lombok이 무엇인지, 어떻게 설치하는 지도 알아봤으니 Lombok의 핵심적인 기능들에 대해서 살펴보고, 실무에 어떻게 적용할 수 있을지 알아보도록하자.

@Getter, @Setter, @RequiredArgsConstructor

이 어노테이션들은 위에서 언급했으므로 생략!

@ToString

이름 그대로 toString()을 자동으로 생성해주는 어노테이션이다.
원래는 아래의 이미지처럼 개발자가 직접 toString을 생성해줘야하지만, 이것을 Lombok에서 생성해준다.

  • toString(): Class의 변수를 String으로 예쁘게 출력해주는 메소드이다.

@EqualsAndHashCode

이름 그대로 equals(), hashCode() 메소드를 생성해주는 어노테이션이다.
아래의 코드를 Lombok이 생성해준다.

  • equals(): 이름 그대로 2개의 값이 같은 값인지 비교하는 메소드이다. ==과의 차이점은, ==은 주소값을 비교하는 것이고, equals()는 값 자체를 비교하는 것이다.
    즉, 서로 다른 String 변수에 "hello"를 할당해도, equals()로 비교하면 true가 return이 된다.
    어렵게 얘기한 것 같은데, 값 자체를 비교하는 메소드라고 정리할 수 있겠다. ㅎㅎ;;

  • hashCode(): hashcode는 객체를 식별하는 정수값이고, hashCode()는 이 값을 return하는 메소드이다. 2개의 객체를 같은 객체인지 판별할 때 사용한다. 객체를 비교할 때, 적은 비용이 발생하므로 사용한다고 한다. 왜냐하면, hashcode는 다음과 같은 특징을 갖기 때문이다.
- hashcode가 다르다 -> 두 객체는 다르다.
- hsahcode가 같다 -> 두 객체는 다를수도 있고, 같을 수도 있다.

즉, hashcode로 비교해서 같은 객체인지 판별하고 만약 hashcode가 갖다면, 그 때 equals()로 다시 두 객체를 비교하는 것이다.

왠만하면 다른 객체는 hashcode가 다를 확률이 높으므로, 두 객체를 비교할 때 적은 비용이 든다고 하는 것이다.

@Data

이 어노테이션은 위의 5개의 어노테이션을 한번에 설정해준다.🙊
(스고이...)

@NoArgsConstructor

final같은 키워드가 아무것도 붙어있지 않는 필드의 Constructor를 자동으로 생성해준다.

@AllArgsConstructor

모든 필드에 대해서 Constructor를 자동으로 생성해준다.


🍃 Spring에서의 Lombok 사용법


@RequiredArgsConstructor

-> 스프링에서는 의존성 주입(Dependancy injection)을 해줄때 자주 사용한다. DI는 주로 생성자에서 많이 이루어진다. 다시 말해서 반복적으로 모든 클래스에 생성자를 만들고 해당 클래스에서 사용되는 외부 객체들을 주입하는 코드를 개발자가 작성해야한다는 것이다. 이는 복잡한 서비스 로직이 아니고 반복적인 작업이기 때문에 Lombok을 이용해서 코드를 깔끔하게 만들 수 있다.

  • Before
@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);
    }
}
  • After
@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이 많은 기능들을 마법처럼 제공해주는 장점이 있지만 그렇기 때문에 개발자가 의도하지 않은 동작들이 일어날 수 있다. 그래서 개발자는 많이 주의해야한다. Lombok을 사용할 때, 아래의 내용을 주의해서 사용하자.

  • 사용할 기능만 인지해서 사용하자: 편리하다고, @Data를 막 쓰면 무슨일이 벌어질지 모른다... 🙊
  • @Setter 사용은 자제하자 : 개인 프로젝트는 모르겠지만, 실무에서는 의도치 않은 setter때문에 값이 막 변할 수가 있으니 setter는 필요한 곳에만 직접 선언해주자.
  • 무한 루프 조심 : 스프링과 JPA같은 orm을 쓰다보면, toString()이 무한 루프를 야기할 수 있으니 조심하자.

(개인적으로는 @Getter, @Setter, @RequiredArgsConstructor외에는 잘 안쓴다 😂)

자세한 Lombok 주의사항은 다른 블로그에 잘 설명이 되어 있어서 읽어보면 좋을 것 같다. 🙏


😎 마무리


이번 글에서는 Lombok에 대해서 살펴보았다.
많은 편리한 기능들을 제공하지만 Lombok에 대해서 잘 이해하고, 필요한 곳에 정확히 사용해야겠다.

Lombok에 대한 주의사항은 다른 블로그들에서 너무 잘 설명이 되어 있어서 다른 블로그들을 첨부 하였는데, 혹시나 Lombok을 사용할 사람들이라면 꼭 읽어보면 좋을 것 같다.
(사실 내 글 보다 중요할 수도..? 🤭)

모두 행복코딩하길 바라며! 이번 글을 마치겠다 🙏

0개의 댓글