Java

@RequiredArgsConstructor, @AllArgsConstructor

변위니 2025. 1. 7. 02:27

프로젝트 진행 중 계속해서 의존성 주입 문제가 생겼다.

@Service
@RequiredArgsConstructor
public class SmsSenderService {

    private final SmsCertification smsCertification;

    @Value("${coolsms.apikey}")
    private final String apiKey;

    @Value("${coolsms.apisecret}")
    private final String apiSecret;

    @Value("${coolsms.fromnumber}")
    private final String fromNumber;
    
    // 코드 생략
}

 

@RequiredArgsConstructor 와 @AllArgsConstructor 를 알아보자

 

둘 다 Lombok 에서 제공하는 어노테이션으로 코드를 간결하게 작성할 수 있도록 도와준다.

 


@RequiredArgsConstructor

클래스의 final로 선언된 필드나 @NonNull 로 표시된 필드를 기반으로 생성자를 생성한다.

@RequiredArgsConstructor
public class User {
    private final String name;  // final로 선언
    private final int age;
    
    
    /* 아래와 같은 생성자가 자동으로 생성된다.
    public User(String name, int age) {
      this.name = name;
      this.age = age;
    }
     */
}

 


@AllArgsConstructor

클래스의 모든 필드를 매개변수로 받는 생성자를 자동으로 생성한다. final 필드를 포함한 모든 필드를 초기화하는 생성자가 생성되며, 이를 통해 final 필드를 반드시 초기화할 수 있다.

@AllArgsConstructor
public class User {
    private String name;
    private int age;
    
    /* 아래와 같은 생성자가 자동으로 생성된다.
    public User(String name, int age) {
      this.name = name;
      this.age = age;
    }
     */
}

 

 


@Value 와 @RequiredArgsConstructor?

  • @Value : 외부 프로퍼티 파일에 정의된 값을 런타임 시점에 주입하는 스프링 프레임워크의 기능이다.
  • @RequiredArgsConstructor : 컴파일 시점에 final 필드나 @NonNull 필드를 초기화하는 생성자를 자동으로 생성하는 Lombok 어노테이션이다.

final 필드는 생성자에서 초기화되어야 한다. 컴파일 시점에 @RequiredArgsConstructor는 final 필드를 인자로 받는 생성자를 자동으로 생성하는데, @Value는 런타임 시점에 스프링 컨테이너가 값을 주입한다. 따라서 생성자가 호출된 이후 주입이 이루어져야 하는 @Value와 컴파일 시점에 초기화가 요구되는 final 필드 간의 충돌이 발생하게 된다

'Java' 카테고리의 다른 글

@Transactional과 Proxy  (0) 2025.01.07
Transaction  (0) 2025.01.07
index와 B-tree 그리고 Hash Index  (0) 2025.01.07
StringBuffer & StringBuilder  (0) 2025.01.07
자바 직렬화 Serialization  (0) 2025.01.07