본문 바로가기
SpringBoot

@RequiredArgsConstructor 와 @AllArgsConstructor

by 오렌지마끼야또 2023. 11. 15.
728x90
반응형

 

 

 

 

 

 

 

 

@RequiredArgsConstructor @AllArgsConstructor 모두  Lombok 라이브러리에서 제공하는 어노테이션으로, 생성자를 자동으로 만들어주는 역할을 합니다.

 

이 둘의 차이점을 알아보겠습니다.

 

 

@RequiredArgsConstructor 는 final 로 선언된 필드에 대해서만 생성자를 만듭니다.

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class Example {
    private final int id;
    private String name; // final이 아닌 필드

    // 생성자는 id만을 매개변수로 받음
}

이렇게 하면 다음 과 같은 생성자가  생성되는 것입니다.

public Example(int id) {
    this.id = id;
}

 

 

그래서 아래와 같이 작성하면

@RequiredArgsConstructor
public class Service {
    private DomainService domainService;

    public ResponseDto getData() {
        String data = domainService.getName();
        ...
    }
}

domainService 가 초기화 되지 않아 null 이 되고 getData() 메소드의 domainService.getName() 메소드에서 NullPointerException 이 발생합니다.

 

 

 

 

 

반면 @AllArgsConstructor 는 final 여부와 상관 없이 모든 필드에 대해서 생성자를 만듭니다.

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class Example {
    private final int id;
    private String name; // final이 아닌 필드

    // 생성자는 id와 name을 매개변수로 받음
}

------

public Example(int id, String name) {
    this.id = id;
    this.name = name;
}

 

 

 

따라서 필드의 초기화가 필수인지에 따라 상황에 맞게 선택하면 됩니다.

 

 

 

 

 

 

728x90
반응형

댓글