본문 바로가기
spring

[Spring] Lombok

by goblin- 2024. 9. 28.

Lombok은 자바에서 반복적이고 보일러플레이트 코드를 줄여주는 라이브러리로, 특히 **스프링(Spring)**에서 자주 사용됩니다. Lombok을 사용하면 getter, setter, 생성자, equals, hashCode, toString 등의 메서드를 자동으로 생성할 수 있어 코드가 간결해지고, 유지보수성도 크게 향상됩니다.

 

스프링에서는 Lombok을 사용해 DTO, 엔티티 클래스, 서비스 로직 등에서 필요한 메서드를 자동으로 생성하여 코드의 중복을 줄일 수 있습니다. 아래에서는 자주 사용되는 Lombok 어노테이션과 그 역할을 설명하고, 스프링에서 어떻게 활용되는지 설명하겠습니다.

 

Lombok 설정하기

 

Lombok을 사용하려면 프로젝트에 Lombok 의존성을 추가해야 합니다. Maven 또는 Gradle을 사용하는 스프링 프로젝트에서 Lombok을 설정하는 방법은 다음과 같습니다.

 

Maven 설정 (pom.xml):

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>  <!-- 최신 버전 사용 권장 -->
    <scope>provided</scope>
</dependency>

 

Gradle 설정 (build.gradle):

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.24'  // 최신 버전 사용 권장
    annotationProcessor 'org.projectlombok:lombok:1.18.24'
}

의존성 추가 후 프로젝트를 빌드하면 Lombok이 자동으로 설정됩니다.

 

1. @Getter / @Setter

 

설명: @Getter@Setter는 클래스의 필드에 대해 getter와 setter 메서드를 자동 생성합니다.

어디서 사용: DTO, 엔티티 클래스 등에서 객체의 필드를 접근하거나 수정할 때 사용합니다.

 

사용 시

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private String name;
    private String email;
}

이 코드를 사용하면 자동으로 getName(), setName(), getEmail(), setEmail() 메서드가 생성됩니다.

 

사용하지 않을 시

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

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

차이점: Lombok을 사용하면 직접 getter/setter 메서드를 작성할 필요가 없어 코드가 간결해집니다.

 

2. @ToString

 

설명: @ToString은 클래스에 대해 toString() 메서드를 자동으로 생성해줍니다. 객체의 모든 필드 값을 문자열로 반환합니다.

어디서 사용: 객체를 디버깅하거나 로그에 출력할 때 유용합니다.

 

사용 시

import lombok.ToString;

@ToString
public class User {
    private String name;
    private String email;
}

이 코드를 사용하면 toString() 메서드가 자동으로 생성되고, 예를 들어 User{name='John', email='john@example.com'}과 같은 형식으로 출력됩니다.

 

사용하지 않을 시

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

차이점: Lombok을 사용하면 직접 toString() 메서드를 작성할 필요가 없어 코드가 간결해집니다.

 

3. @NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor

 

설명:

@NoArgsConstructor: 매개변수 없는 기본 생성자를 자동으로 생성합니다.

@AllArgsConstructor: 모든 필드를 매개변수로 받는 생성자를 자동으로 생성합니다.

@RequiredArgsConstructor: final 필드나 @NonNull 필드만을 받는 생성자를 자동으로 생성합니다.

어디서 사용: DTO나 엔티티 클래스에서 생성자를 간편하게 생성할 때 사용됩니다.

 

사용 시

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;

@NoArgsConstructor  // 기본 생성자
@AllArgsConstructor // 모든 필드를 매개변수로 받는 생성자
@RequiredArgsConstructor // final 필드만 받는 생성자
public class User {
    private final String name;
    private String email;
}

@NoArgsConstructor기본 생성자를, @AllArgsConstructor모든 필드를 매개변수로 받는 생성자를, @RequiredArgsConstructorfinal 필드만을 받는 생성자를 생성합니다.

 

사용하지 않을 시

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

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

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public User(String name) {
        this.name = name;
    }
}

차이점: Lombok을 사용하면 생성자를 일일이 작성할 필요 없이 자동으로 생성되므로, 코드가 간결해집니다.

 

4. @Data

 

설명: @Data는 **@Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor**를 모두 포함하는 종합적인 어노테이션입니다. 객체에 필요한 기본적인 메서드들을 자동으로 생성해줍니다.

어디서 사용: DTO, 엔티티 클래스에서 자주 사용됩니다.

 

사용 시

import lombok.Data;

@Data
public class User {
    private final String name;
    private String email;
}

@Data를 사용하면 자동으로 getter/setter, toString(), equals(), hashCode(), 생성자가 생성됩니다.

 

사용하지 않을 시

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) && Objects.equals(email, user.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, email);
    }
}

차이점: Lombok을 사용하면 자동으로 모든 필수 메서드가 생성되므로 코드가 훨씬 간결해지고, 반복 작업을 줄일 수 있습니다.

 

5. @EqualsAndHashCode

 

설명: @EqualsAndHashCode는 객체 간의 equals()hashCode() 메서드를 자동 생성합니다. 객체의 동등성 비교해시 값 생성에 사용됩니다.

어디서 사용: 객체의 동등성 비교가 필요한 클래스에서 사용됩니다.

 

사용 시

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class User {
    private String name;
    private String email;
}

이 코드를 사용하면 equals()hashCode() 메서드가 자동으로 생성됩니다.

 

사용하지 않을 시

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) && Objects.equals(email, user.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, email);
    }
}

차이점: Lombok을 사용하면 자동으로 equals()hashCode() 메서드가 생성되므로, 수동으로 작성할 필요가 없습니다.

 

6. @Builder

 

설명: @Builder빌더 패턴을 자동으로 구현하는 어노테이션으로, 복잡한 객체 생성을 유연하게 할 수 있습니다. 객체를 생성할 때 체이닝 방식으로 값을 설정할 수 있습니다.

어디서 사용: 값이 많은 객체나 선택적 매개변수가 있는 객체를 만들 때 유용합니다.

 

사용 시

import lombok.Builder;

@Builder
public class User {
    private String name;
    private String email;
}

빌더 패턴을 사용하면 다음과 같이 객체를 생성할 수 있습니다:

User user = User.builder()
                .name("John")
                .email("john@example.com")
                .build();

사용하지 않을 시

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

    public static class UserBuilder {
        private String name;
        private String email;

        public UserBuilder name(String name) {
            this.name = name;
            return this;
        }

        public UserBuilder email(String email) {
            this.email = email;
            return this;
        }

        public User build() {
            return new User(this.name, this.email);
        }
    }
}

차이점: Lombok의 @Builder를 사용하면 빌더 패턴을 자동으로 구현할 수 있으므로, 수동으로 작성하는 번거로움을 덜 수 있습니다.

 

7. @NonNull

 

설명: @NonNull은 해당 필드나 메서드 매개변수가 null이 될 수 없도록 자동으로 검증해줍니다. null일 경우 자동으로 **NullPointerException**을 던집니다.

어디서 사용: null 체크가 필요한 필드매개변수에서 사용됩니다.

 

사용 시

import lombok.NonNull;

public class User {
    private String name;

    public User(@NonNull String name) {
        this.name = name;
    }
}

namenull이면 자동으로 **NullPointerException**이 발생합니다.

 

사용하지 않을 시

public class User {
    private String name;

    public User(String name) {
        if (name == null) {
            throw new NullPointerException("name cannot be null");
        }
        this.name = name;
    }
}

차이점: Lombok의 @NonNull을 사용하면 null 체크 로직을 수동으로 작성할 필요가 없어 코드가 간결해집니다.

 

 

Lombok 어노테이션 설명
@Getter/@Setter 필드에 대한 getter/setter 메서드를 자동으로 생성합니다.
@ToString toString() 메서드를 자동으로 생성하여 객체의 필드 값을 문자열로 반환합니다.
@NoArgsConstructor 기본 생성자를 자동으로 생성합니다.
@AllArgsConstructor 모든 필드를 매개변수로 받는 생성자를 자동으로 생성합니다.
@RequiredArgsConstructor final 필드나 @NonNull 필드를 받는 생성자를 생성합니다.
@Data @Getter, @setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 포함합ㄴ디ㅏ.
@EqualsAndHashCode equals()및 hashCode() 메서드를 자동으로 생성합니다.
@Builder  빌더 패턴을 자동으로 구현합니다.
@NonNull 필드나 매개변수가 null일 수 없도록 체크하고, NullProinterException을 자동으로 던집니다.

Lombok을 사용하면 객체와 관련된 반복적인 코드를 자동으로 생성해주어 코드가 훨씬 간결해지고, 유지보수성을 높일 수 있습니다.

'spring' 카테고리의 다른 글

[Spring] CustomError 작성법  (0) 2024.10.20
[Spring] 주요 Annotation  (3) 2024.10.19
[Spring] Bean  (1) 2024.10.12
[Spring] Spring과 Tomcat  (0) 2024.10.12
[Spring] DTO  (0) 2024.10.04