프로젝트 진행 중 계속해서 의존성 주입 문제가 생겼다.
@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 |