# Table of Contents

# Lombok

Lombok을 사용하면 코드에서 반복적으로 정의해야하는 Getter, Setter, Constructor 등의 메소드를 어노테이션으로 쉽게 추가할 수 있다.

# 설치

Lombok을 사용하려면 다음과 같은 의존성을 추가해야한다.

dependencies {
    // Lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

# @Getter

@Getter는 멤버변수에 대한 Getter를 추가해준다. 다음 클래스를 살펴보자.

public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;
}

@Getter를 클래스에 붙이면 클래스의 모든 멤버변수에 대한 Getter가 추가된다.

@Getter
public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;
}

@Getter를 멤버변수에 붙이면 해당 멤버변수에 대한 Getter만 생성된다.








 


public class Person {
    @Getter
    private String name;
    @Getter
    private int age;
    @Getter
    private boolean isMarried;
    private double money;   // 멤버변수 money에 대한 Getter는 생성되지 않는다.
}

# @Setter

@Setter는 멤버변수에 대한 Setter를 추가해준다. 다음 클래스를 살펴보자.

public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;
}

@Setter를 클래스에 붙이면 클래스의 모든 멤버변수에 대한 Setter가 추가된다.

@Setter
public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;
}

@Getter를 멤버변수에 붙이면 해당 멤버변수에 대한 Getter만 생성된다.








 


public class Person {
    @Setter
    private String name;
    @Setter
    private int age;
    @Setter
    private boolean isMarried;
    private double money;   // 멤버변수 money에 대한 Getter는 생성되지 않는다.
}

# @AllArgsConstructor

@AllArgsConstructor는 모든 멤버 변수를 사용하는 생성자를 생성한다.

@AllArgsConstructor
public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;

    /* 아래 생성자가 자동으로 생성된다.
    public Person(String name, int age, boolean isMarried, double money) {
        this.name = name;
        this.age = age;
        this.isMarried = isMarried;
        this.money = money;
    }    
    */
}

# @NoArgsConstructor

매개변수가 없는 기본 생성자를 생성한다.

@AllArgsConstructor
public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;

    /* 아래 생성자가 자동으로 생성된다.
    public Person() {

    }
    */
}

# @RequiredConstructor

@RequiredConstructor@NonNull이 붙은 멤버변수만을 인자로 받는 생성자를 생성한다.



 
 




@RequiredArgsConstructor
public class Person {
    @NonNull private String name;
    @NonNull private int age;
    private boolean isMarried;
    private double money;
}
Person p = new Person("Paul", 34);

또한 @RequiredConstructor는 보통 Spring Framework에서 의존성을 주입할 때 사용한다. 이 어노테이션을 붙이면 초기화되지 않는 final 멤버변수에 의존성을 주입해준다.





 
 




@Service
@RequiredArgsConstructor
public class AuthService {

    private final PasswordEncoder passwordEncoder;
    private final UserRepository userRepository;

    // ...
}

# @Builder

@Builder는 빌더 패턴으로 객체를 생성할 수 있도록 도와준다. 클래스에 어노테이션을 추가하면 모든 멤버변수에 대한 메소드를 추가해준다.

@Builder
public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;
}
Person p = Person.builder()
    .name("Paul")
    .age(34)
    .isMarried(true)
    .money(40000.0)

특정 변수에 대한 메소드만 추가학 싶다면 생성자를 작성하고 생성자에 어노테이션을 추가한다.

public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;

    @Builder
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

# @ToString

@ToString을 사용하면 멤버변수를 기반으로 toString()메소드를 자동으로 생성해준다.

@ToString
public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;
}

@ToString.Exclude가 붙은 멤버변수는 toString()의 출력에서 제외된다.

@ToString
public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    
    @ToString.Exclude
    private double money;
}

# @EqualsAndHashCode

equals()hashCode()를 만들어준다.

@EqualsAndHashCode
public class Person {
    private String name;
    private int age;
    private boolean isMarried;
    private double money;
}

# @Data

@Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode를 자동으로 생성해준다. @Data를 사용하면 객체가 무거워지고 불변성을 보장하기 때문에 사용을 지양한다.