📢 장정우님이 지음,
[스프링부트 핵심가이드 : 스프링 부트를 활용한 애플리케이션 개발 실무] 책을 읽고 정리한 글입니다.
롬복(Lombok)은 데이터(모델) 클래스를 생성할 때 반복적으로 사용하는 getter/setter 같은 메서드를 어노테이션으로 대체하는 기능을 제공하는 라이브러리이다. 자바에서 데이터 클래스를 작성하면 대개 많은 멤버 변수를 선언하고, 각 멤버 변수별로 getter/setter 메서드를 만들어 코드가 길어지고 가독성이 낮아진다. 인텔리제이 IDEA나 이클립스 같은 IDE에서는 이러한 메서드를 자동으로 생성하는 기능을 제공하긴 하지만 가독성이 떨어진다는 점에서는 마찬가지다.
이러한 경우 롬복을 활용하면 다음과 같은 장점이 있다.
어노테이션 기반으로 코드를 자동 생성하므로 생산성이 높아진다.
반복되는 코드를 생략할 수 있어 가독성이 좋아진다.
롬복을 안다면 간단하게 코드를 유추할 수 있어 유지보수에 용이하다.
반면 몇 가지 이유로 롬복을 사용하는 것을 좋아하지 않는 개발자도 있다. 롬복을 선호하지 않는 가장 큰 이유는 코드를 어노테이션이 자동 생성하기 때문에 메서드를 개발자의 의도대로 정확하게 구현하지 못하는 경우가 발생한다는 것이다.
앞에서 설명한 설치와 설정 과정을 모두 마쳤다면 정상적으로 롬복을 사용할 수 있다. 지금까지 프로젝트 실습을 진행하면서 생성한 데이터 클래스에 롬복을 적용하면서 각 어노테이션의 기능을 살펴보겠다.
먼저 Product 엔티티 클래스에 롬복을 적용해 보겠다. 아래 코드는 앞에서 살펴본 Product 엔티티 클래스이다.
package com.springboot.jpa.data.entity;
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long number;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer price;
@Column(nullable = false)
private Integer stock;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
public Product(Long number, String name, Integer price, Integer stock, LocalDateTime createdAt,
LocalDateTime updatedAt){
this.number = number;
this.name = name;
this.price = price;
this.stock = stock;
this.createdAt = createdAt;
this.updatedAt = updatedAt;
}
public Product(){
}
... getter/setter 메서드 생략...
}
참고로 위 예제에서는 코드를 조금 더 보기 편하게 getter/setter 메서드를 생략했는데, 만약 getter/setter 메서드가 모두 포함돼 있었다면 최소 100줄 이상이 될 것이다. 위 코드를 아래와 같이 어노테이션을 이용해 많은 코드를 대체할 수 있다.
package com.springboot.jpa.data.entity;
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "product")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long number;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer price;
@Column(nullable = false)
private Integer stock;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
이전 코드와 비교해보면 심지어 getter/setter 메서드를 생략한 예제보다 코드 라인 수가 적다. 물론 어노테이션으로 메서드를 자동 생성했기 때문에 필요한 모든 코드는 갖춰져 있다.
롬복은 다양한 어노테이션을 제공하고 있다. 그중 많이 사용하는 어노테이션들을 소개한다.
클래스에 선언돼 있는 필드에 대한 getter/setter 메서드를 생성한다.
데이터 클래스의 초기화를 위한 생성자를 자동으로 만들어주는 어노테이션은 다음의 세 가지가 있다.
이름 그래도 toString() 메서드를 생성하는 어노테이션이다.
@EqualsAndHashCode는객체의 동등성(Equality)와 동일성(Identity)을 비교하는 연산 메서드를 생성한다.
@Data 는 앞서 설먕힌 @Getter/Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode 를 모두 포괄하는 어노테이션이다. 즉, 앞에서 살펴본 각각의 어노테이션에서 생성하는 대부분의 코드가 필요하다면 @Data 어노테이션으로 앞에서 설명한 코드를 전부 한 번에 생성할 수 있다.
롬복과 관련된 자세한 기능은 공식 사이트의 features 항목https://projectlombok.org/features/all 에서 확인할 수 있다.