개인 공부 (23.07~

[Spring] @RequiredArgsConstructor, @NoArgsConstructor, @AllArgsConstructor + @Data 어노테이션 정확히 알기

Song쏭 2023. 9. 10. 00:02

Lombok을 프로젝트의 의존성으로 추가하면,

해당 라이브러리에서 제공하는 어노테이션을 사용할 수 있게 된다.

이를 통해 많은 boilerplate 코드( 반복되는 코드)를 줄일 수 있다.


@RequiredArgsConstructor, @NoArgsConstructor, @AllArgsConstructor는 예시를 들어 알아보았다.

아래와 같은 HotelRequestDto 클래스가 있다고 가정해보자.

@Getter
public class HotelRequestDto {
    private String name;
    private String type;
    private String address;
    private String contact;
    private String email;
    private int star;
    private String description;
    private int minPrice;
    private int maxPrice;
    private int rooms;
}

 

@AllArgsConstructor

모든 필드에 대한 생성자를 자동으로 생성한다.

public HotelRequestDto(String name, String type, String address, String contact, String email, int star, String description, int minPrice, int maxPrice, int rooms) {
    this.name = name;
    this.type = type;
    this.address = address;
    this.contact = contact;
    this.email = email;
    this.star = star;
    this.description = description;
    this.minPrice = minPrice;
    this.maxPrice = maxPrice;
    this.rooms = rooms;
}

 

@NoArgsConstructor

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

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

 

@RequiredArgsConstructor

final 또는 @NonNull로 표시된 필드만 포함하는 생성자를 자동으로 생성한다.

주로 필수적으로 값을 가져야하는 필드에 대한 생성자를 만들 때 사용된다.

 

현재 HotelRequestDto 클래스에는 final 또는 @NonNull로 선언된 필드가 없으므로,

 만약 다음과 같이 final 필드가 있다고 가정한다면

@RequiredArgsConstructor는 기본 생성자와 같이 동작합니다.

@Getter
public class HotelRequestDto {
    private final String name;
    //... 나머지 필드
}

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

@Data

Lombok 라이브러리에서 제공하는 어노테이션 중 하나이다.

하나로 여러가지 기능을 한 번에 사용할 수 있게 해준다.

@Data를 클래스에 붙이면 아래와 같은 것들이 자동으로 적용된다.

아래의 5가지 기능은 @Data 어노테이션이 주로 포함하는 핵심적인 기능들이다.

 

1. @Getter 

모든 필드에 대한 getter 메서드를 생성한다.

 

2. @Setter

모든 필드에 대한 setter 메서드를 생성한다.

 

3. @ToString

클래스의 문자열 표현을 제공하는 toString() 메서드를 생성한다.

주로 모든 필드의 내용을 포함한 문자열을 반환하게 된다.

 

4. @EqualsAndHashCode

객체 간의 동등성 비교를 위한 equals()와 hashCode() 메서드를 생성한다.

 

5. @RequiredArgsConstructor

초기화되지 않은 final필드나 @NonNull 어노테이션이 붙은 필드만을 파라미터로 받는 생성자를 생성한다.

 

@Data 어노테이션 하나로 위에 언급된 다양한 기능을 모두 사용할 수 있게 된다.

반복적인 코드 작성을 피할 수 있어 개발의 편의성이 크게 향상된다.

 

하지만, 

@Data는 너무 많은 것을 한번에 제공하기 때문에

실제로 필요하지 않은 메서드까지 자동으로 생성될 수 있다.

따라서 꼭 필요한 기능만을 사용하고자 할 때는 개별 어노테이션을 사용하는 것이 더 좋을 수 있다.

무분별한 사용은 클래스의 의도를 파악하기 어렵게 만들 수 있으므로 적절한 상황에서만 사용하는 것이 좋다.


* 개인 공부하며 기록 중입니다.