[spring boot] Lombok 어노테이션 정리

rosi_bg99·2023년 4월 28일
0

생성자 관련 어노테이션

@NoArgsConstructor

파라미터가 없는 기본 생성자를 생성해준다.

초기화가 필요한 final 변수가 있을 경우 컴파일 에러가 발생한다.
@NoArgsConstructor(force=true)를 사용하면 모든 final 변수는
0 / false / null 로 초기화된다.
그러나 final이 아닌 @NonNull 같은 어노테이션이 있다면 따로 할당해 주어야 한다.

@NoArgsConstructor
public class User {
	private Long id;
    private String name;
    private int age;
}

User user = new User();

@NoargsConstructor(access = AccessLevel.PROTECTED)
Entity나 DTO에서 많이 사용하는데, 무분별한 객체 생성에 대해 체크 할 수 있다. PRIVATE 값으로 설정하면 Proxy 객체 생성 로직에서 오류가 발생할 수 있다.

@RequiredArgsConstructor

final 변수, @NonNull 인 변수 값만 받는 생성자를 생성해준다.

@RequiredArgsConstructor
public class User {
	private final Long id;
    private String name;
    private int age;
}

User user = new User(3L);

@AllArgsConstructor

클래스 내부 모든 필드에 parameter를 받는 생성자를 생성해준다.
parameter의 순서는 클래스 내부에 선언된 필드 순서로 매칭된다.

@AllArgsConstructor
public class User {
	private final Long id;
    private String name;
    private int age;
}

User user = new User(3L, "Rosi", 25);

주의사항

@AllArgsConstructor와 @RequiredArgsConstructor는 심각한 버그를 발생할 수 있어서 사용 시에 주의하거나, 아예 사용을 권하지 않는 경우도 있다.

클래스 변수의 선언된 순서를 변경한다면 IDE에서 리팩토링도 작동하지 않고, lombok도 변화를 감지하지 못하여 에러는 발생하지 않으나, 비즈니스 로직 에러가 생긴다.

그 대신, IDE 자동 생성 기능 등으로 아래처럼 생성자를 직접 만들고,
필요한 경우에는 직접 만든 생성자에 @Builder 어노테이션을 붙이는 것을 권장하기도 한다.

public class User {
	private Long id;
    private String name;
    private int age;
    
    @Builder
    private User(Long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

접근자/설정자 자동 생성

@Getter, @Setter

User 클래스의 name이라는 변수가 있으면, 자동으로 getName(), setName() 메소드를 생성해 준다.

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

user.setName("Rosi");
String userName = user.getName();

ToString 메소드 자동 생성

@ToString

클래스 이름과 쉼표로 구분된 각 필드 값이 포함된 문자열이 반환된다.
exclude 속성을 사용하면, 특정 필드를 toString() 결과에서 제외시킬 수도 있다.

@ToString(exclude = "age")
public class User {
	private Long id;
    private String name;
    private int age;
}

User user = new User();
user.setId(3L);
user.setName("Rosi");
user.setAge(25);
System.out.println(user);

User(id=3, name=Rosi)

equals, hashCode 자동 생성

자바 빈을 만들 때 equals와 hashCode 메소드를 자주 오버라이딩 하는데, @EqualsAndHashCode 어노테이션을 사용하면 자동으로 메소드를 생성할 수 있다.

callSuper 속성을 통해 equals와 hashCode 메소드 자동 생성 시 부모 클래스의 필드까지 감안할지 안 할지에 대해서 설정할 수 있다.

@Data

@Data는 @Getter, @Setter, @RequiredArgsConstructor, @ToString, @EqualsAndHashCode을 한꺼번에 설정해주는 매우 유용한 어노테이션이다.

0개의 댓글