Java (Lombok 어노테이션)

최병현·2026년 1월 1일

java

목록 보기
19/38

1. Lombok의 필요성

Java(Spring Boot)로 개발을 하다 보면 클래스(DTO, Entity, Service 등)를 만들 때 반복적으로 작성하는 코드가 많아진다.

  • getter / setter
  • 생성자
  • toString()
  • equals() / hashCode()
  • builder 패턴

이런 반복 코드를 매번 직접 작성하면 클래스가 길어지고, 수정할 때 누락/실수 가능성이 커진다.

Lombok은 어노테이션만 붙이면 컴파일 시점에 필요한 코드를 자동 생성해줘서 생산성과 가독성을 크게 올려준다.


2. Lombok 기본 특징

  • Lombok은 런타임이 아니라 컴파일 타임에 코드를 생성한다.
  • 실제로 메서드가 “없는 것처럼 보여도” 컴파일 결과에는 생성되어 있다.
  • Spring에서는 특히 생성자 주입(DI)을 깔끔하게 만드는 데 많이 사용한다.

3. Lombok 어노테이션 종류와 역할

3-1. @Getter / @Setter

필드에 대한 getter/setter를 자동 생성한다.

  • @Getter: 읽기 메서드 생성
  • @Setter: 쓰기 메서드 생성

실무에서는 무분별한 @Setter 사용이 위험할 수 있어서, 필요한 필드에만 제한적으로 쓰는 것을 권장한다.

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class UserDto {
    private String name;
    private int age;
}

3-2. @ToString

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;
}

3-3. @EqualsAndHashCode

equals() / hashCode()를 자동 생성한다. Set/Map 같은 컬렉션에서 “같은 객체인지” 비교 기준이 된다.

JPA Entity는 id 생성 전략 때문에 equals/hashCode 기준을 잘못 잡으면 문제가 생길 수 있어 신중하게 사용한다.

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class MemberDto {
    private Long id;
    private String email;
}

3-4. @NoArgsConstructor / @AllArgsConstructor

생성자를 자동으로 만든다.

  • @NoArgsConstructor: 기본 생성자 생성
  • @AllArgsConstructor: 모든 필드를 파라미터로 받는 생성자 생성

JPA Entity에서는 기본 생성자가 거의 필수라서 @NoArgsConstructor를 자주 쓴다.

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
public class SimpleDto {
    private String title;
    private int count;
}

3-5. @RequiredArgsConstructor

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
    }
}

3-6. @Builder

Builder 패턴을 자동 생성한다. 생성자 파라미터 순서 실수를 방지하고, DTO 생성 코드가 훨씬 읽기 쉬워진다.

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class UserResponseDto {
    private Long id;
    private String name;
    private int age;
}

3-7. @Data

@Data는 아래 기능을 한 번에 제공한다.

  • @Getter
  • @Setter
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

편하긴 하지만, Entity에 사용하면 setter/toString/equals가 한 번에 생겨서 위험할 수 있다.

그래서 실무에서는 DTO 전용으로만 사용하는 경우가 많다.

import lombok.Data;

@Data
public class LoginDto {
    private String email;
    private String password;
}

4. 실무에서 많이 쓰는 Lombok 조합

4-1. DTO 추천 조합

  • @Getter
  • @NoArgsConstructor
  • @AllArgsConstructor
  • @Builder (필요할 때)
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;
}

4-2. Service 추천 조합

  • @Service
  • @RequiredArgsConstructor
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
}

4-3. JPA Entity 추천 조합

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;
    }
}

5. 오늘 정리하며 느낀 점

Lombok은 단순히 “코드를 줄여주는 도구”가 아니라, 클래스의 핵심 의도를 더 잘 보이게 만들어주는 도구라는 걸 느꼈다.

특히 Spring에서는 @RequiredArgsConstructor로 생성자 주입을 깔끔하게 구성할 수 있어서, 프로젝트 규모가 커질수록 Lombok의 효과가 더 커진다.

다만 Entity에 @Data를 붙이거나, 연관관계가 있는 필드에 @ToString을 무심코 적용하면 문제를 만들 수 있으니 “어디에 어떤 어노테이션을 붙이는지” 기준을 잡는 게 중요하다고 느꼈다.

profile
Develop

0개의 댓글