
Java(Spring Boot)로 개발을 하다 보면 클래스(DTO, Entity, Service 등)를 만들 때 반복적으로 작성하는 코드가 많아진다.
이런 반복 코드를 매번 직접 작성하면 클래스가 길어지고, 수정할 때 누락/실수 가능성이 커진다.
Lombok은 어노테이션만 붙이면 컴파일 시점에 필요한 코드를 자동 생성해줘서 생산성과 가독성을 크게 올려준다.
필드에 대한 getter/setter를 자동 생성한다.
실무에서는 무분별한 @Setter 사용이 위험할 수 있어서, 필요한 필드에만 제한적으로 쓰는 것을 권장한다.
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class UserDto {
private String name;
private int age;
}
toString() 메서드를 자동 생성한다. 디버깅할 때 객체 상태를 빠르게 확인할 수 있다.
단, JPA Entity에서 연관관계 필드까지 포함되면 무한 루프가 발생할 수 있으니 exclude 옵션을 조심해야 한다.
import lombok.ToString;
@ToString
public class ProductDto {
private int id;
private String name;
}
import lombok.ToString;
@ToString(exclude = "orders")
public class MemberDto {
private Long id;
private String email;
private Object orders;
}
equals() / hashCode()를 자동 생성한다. Set/Map 같은 컬렉션에서 “같은 객체인지” 비교 기준이 된다.
JPA Entity는 id 생성 전략 때문에 equals/hashCode 기준을 잘못 잡으면 문제가 생길 수 있어 신중하게 사용한다.
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class MemberDto {
private Long id;
private String email;
}
생성자를 자동으로 만든다.
JPA Entity에서는 기본 생성자가 거의 필수라서 @NoArgsConstructor를 자주 쓴다.
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
public class SimpleDto {
private String title;
private int count;
}
final 또는 @NonNull 필드만 받는 생성자를 자동 생성한다.
Spring에서는 이걸 이용해서 생성자 주입을 깔끔하게 구성한다.
@Autowired를 필드에 붙이는 방식보다 안전하고 테스트/확장에도 유리하다.
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public void save() {
// business logic
}
}
Builder 패턴을 자동 생성한다. 생성자 파라미터 순서 실수를 방지하고, DTO 생성 코드가 훨씬 읽기 쉬워진다.
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class UserResponseDto {
private Long id;
private String name;
private int age;
}
@Data는 아래 기능을 한 번에 제공한다.
편하긴 하지만, Entity에 사용하면 setter/toString/equals가 한 번에 생겨서 위험할 수 있다.
그래서 실무에서는 DTO 전용으로만 사용하는 경우가 많다.
import lombok.Data;
@Data
public class LoginDto {
private String email;
private String password;
}
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserDto {
private String name;
private int age;
}
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
}
Entity는 무분별한 setter를 막고, 필요한 변경은 도메인 메서드로 처리하는 패턴이 안전하다.
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Entity
@Getter
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
public void changeName(String name) {
this.name = name;
}
}
Lombok은 단순히 “코드를 줄여주는 도구”가 아니라, 클래스의 핵심 의도를 더 잘 보이게 만들어주는 도구라는 걸 느꼈다.
특히 Spring에서는 @RequiredArgsConstructor로 생성자 주입을 깔끔하게 구성할 수 있어서, 프로젝트 규모가 커질수록 Lombok의 효과가 더 커진다.
다만 Entity에 @Data를 붙이거나, 연관관계가 있는 필드에 @ToString을 무심코 적용하면 문제를 만들 수 있으니 “어디에 어떤 어노테이션을 붙이는지” 기준을 잡는 게 중요하다고 느꼈다.