IT/Java

[Lombok] 간편한 코드를 위한 핵심 어노테이션 총정리

jamonSoda 2026. 5. 14. 23:44

Lombok이란?

Java로 개발을 할 때 기계적으로 치는 코드들이 있다.

gettersetter, toString, 생성자.. 등등

 

물론 간단한 단축키를 통해 자동으로 작성이 가능하지만, 그럼에도 코드의 양이 많아져 가독성이 떨어진다는 단점이 있다.

 

하지만!! Lombok을 활용하면 그런 귀찮음과 가독성을 모두 해결해 줄 수 있다.

짧은 어노테이션을 통해 특정 기능을 수행하는 코드들을 대체할 수 있는 것이다.

 

이번에는 자주 사용되는 어노테이션들을 간단하게 살펴보고자 한다.

 

알아두면 무조건 좋으니 꼭! 읽어보자

 


 

의존성 추가

그전에 Lombok을 사용하기 위해선 의존성 추가가 필요하다. 또한 버전은 변경될 수 있다..

Maven 프로젝트일 경우 (porm.xml)

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Gradle 프로젝트일 경우 (build.gradle)

dependencies {
    // 다른 의존성들...
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

 


 

Annotation 정리

@Getter  /  @Setter

이 두 어노테이션은 어떤 객체에서 값을 가져오거나, 설정하는 get(), set() 메서드를 대체할 수 있다.

 

Before

public class Book { // 이 코드의 get(), set() 부분이 대체된다.
    private String isbn;
    private String title;

    public String getIsbn() { 
    	return this.isbn;
    }
    public void setIsbn(String isbn) {
    	this.isbn = isbn; 
    }
    public String getTitle() { 
    	return this.title; 
    }
    public void setTitle(String title) { 
    	this.title = title; 
    }
}

해당 코드에서는 isbn과 title밖에 없음에도 get()과 set()을 위해 코드의 양이 더욱 많아졌다.

그런데 여기서 @Getter@Setter를 사용하면 코드의 양을 많이 줄일 수 있다.

 

After

@Getter
@Setter
public class Book {
    private String isbn;
    private String title;
}

 


 

@ToString

toString() 이라는 메서드를 @Override하여 통해 객체의 메모리 주소가 아닌, 실제 값을 출력할 수 있다.

 

Before

public class Book {
    private String isbn;
    private String title;

    @Override
    public String toString() { // 이 부분을 대체할 수 있다.
        return "Book(isbn=" + this.isbn + ", title=" + this.title + ")";
    }
}

toString의 경우에는 코드의 길이가 길지 않지만, 역시 멤버 변수(isbn, title 등)가 늘어날수록 점점 작성이 부담스러워진다.

그럴 때 역시 어노테이션을 활용할 수 있다.

 

After

@ToString
public class Book {
    private String isbn;
    private String title;
}

@ToString이라는 어노테이션을 통해 @Override로 재정의했던 toString을 완벽하게 대체할 수 있다.

 


 

@NoArgsConstructor  /  @AllArgsConstructor

이 두 어노테이션인 생성자 코드를 대체할 수 있다. 생성자는 크게 두 종류로 "기본 생성자"와 "매개변수가 있는 생성자"로 구분할 수 있다.

 

Before

public class Book {
    private String isbn;
    private String title;

    // 1. 기본 생성자
    public Book() {
    }

    // 2. 매개변수가 있는 생성자
    public Book(String isbn, String title) {
        this.isbn = isbn;
        this.title = title;
    }
}

기본 생성자의 경우 매우 짧은 코드이지만, 매개변수가 있는 생성자는 멤버 변수가 많아질수록 마찬가지로 번거로워진다.

 

After

@NoArgsConstructor
@AllArgsConstructor
public class Book {
    private String isbn;
    private String title;
}

기본 생성자는 @NoArgsConstructor

매개변수가 있는 생성자는 @AllArgsConstructor로 대체할 수 있다.

 


 

 

@RequiredArgsConstructor

final이 붙은 멤버 변수를 찾아서, 그것만을 매개변수로 받는 생성자를 자동으로 만들어준다.

직전에 확인했던 @AllArgsConstructor모든 멤버 변수를 활용하지만, 이것은 "final"이 붙은 것만!!!! 사용한다.

 

Before

public class BookService {
    private final BookDao bookDao;
    private final ReviewDao reviewDao;
    private int number = 1;

    // 이렇게 final인 것만 골라서 생성자 만들기
    public BookService(BookDao bookDao, ReviewDao reviewDao) {
        this.bookDao = bookDao;
        this.reviewDao = reviewDao;
    }
}

이렇게 bookDao와 reviewDao를 직접 선택해서 생성자를 만들어야 하기 때문에 오타나 실수를 할 수 있다.

 

After

@RequiredArgsConstructor
public class BookService { // final이 붙은 것만 감지!!!
    private final BookDao bookDao;
    private final ReviewDao reviewDao;
    private int number = 1;
}

그런데 이 어노테이션을 사용하면, 단 한 줄로 끝낼 수 있다.

 

 


 

사용 예시

지금까지 Lombok의 필수 어노테이션을 살펴보았다. 이번에는 @RequiredAgrsConstructor를 제외한 나머지 어노테이션들을 적용한 예시를 살펴보자.

 

이것을 제외한 이유는 예시로 보여줄 @AllAgrsConstructor와 함께 사용할 수 없기 때문이다.

왜냐하면 모든 멤버 변수에 생성자를 주입했는데, 또 final이 붙은 멤버 변수에 생성자를 주입하는 경우 충돌이 발생할 수 있기 때문이다.

 

Before

public class User {
    private String email;
    private String password;
    private String name;

    public User() {} // 기본 생성자

    // 인자가 있는 생성자
    public User(String email, String password, String name) {
        this.email = email;
        this.password = password;
        this.name = name;
    }

    public String getEmail() { // getter / setter 시작
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) { // getter / setter 종료
        this.name = name;
    }

    @Override
    public String toString() { // toString 재정의
        return "User [email=" + email + ", password=" + password + ", name=" + name + "]";
    }
}

끔찍하다. 코드가 너무 길다.

멤버 변수는 email이랑 password, name 3개밖에 없는데, 도대체 코드가 몇 줄이나 늘어난 건지 모르겠다..

 

이제 어노테이션을 적용해보자.

 

After

@NoArgsConstructor // 기본 생성자 대체
@AllArgsConstructor// 인자가 있는 생성자 대체
@Getter // get() 대체
@Setter // set() 대체
@ToString // toString 재정의 대체
public class User {
	private String email;
	private String password;
	private String name;
}

아름답다.

너무 깔끔하다.

 

43줄의 코드가 단 10줄 만에 끝나버렸다.

 

이렇다 보니 Lombok을 안 쓸 이유가 없다.

 


 

마무리

Lombok은 확실히 편하다. 코드도 깔끔하고 가독성도 훨씬 높아진다.

 

하지만!!!!

 

이렇게 사용하는 어노테이션들이 모두 어떻게 동작하는지는 꼭 알았으면 좋겠다.

편하다고 바로 롬복을 사용하는 것보다 직접 get() set()을 작성하고, toString도 Override 하면서 직접 구현해봐야 한다고 생각한다.

 

왜냐하면 아직 현업에는 Lombok을 사용하지 않고, 직접 Java로 구현된 레거시 코드가 많이 남아있기 때문이다!!!