스프링 부트(Spring Boot)에서 의존성 주입을 위해 흔히 사용되는 방법 중 하나는 @Autowired 애너테이션을 사용하는 것입니다.
그러나 @RequiredArgsConstructor 애너테이션을 활용하면 @Autowired를 생략할 수 있습니다.
@Autowired 사용
@Autowired는 스프링 프레임워크에서 제공하는 애너테이션으로, 필드, 생성자 또는 메서드에 붙여 의존성을 자동으로 주입할 수 있습니다. 주로 다음과 같은 방식으로 사용됩니다
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
// 다른 코드 생략
}
위 예제에서 @Autowired는 MyRepository 타입의 빈을 myRepository 필드에 주입합니다. 이 방식은 간단하고 직관적이지만, 필드 주입(Field Injection)의 단점이 존재합니다. 필드 주입은 주로 테스트하기 어려워지며, 주입된 의존성을 변경할 수 없다는 단점이 있습니다.
@RequiredArgsConstructor 사용
@RequiredArgsConstructor는 롬복(Lombok) 라이브러리가 제공하는 애너테이션으로, final 또는 @NonNull 필드를 매개변수로 하는 생성자를 자동으로 생성합니다. 이를 통해 생성자 주입(Constructor Injection)을 간편하게 사용할 수 있습니다. 예를 들어, 다음과 같이 사용됩니다
@Service
@RequiredArgsConstructor
public class MyService {
private final MyRepository myRepository;
// 다른 코드 생략
}
위 코드에서 롬복은 MyRepository 타입의 myRepository 필드를 매개변수로 받는 생성자를 자동으로 생성합니다. 스프링은 이 생성자를 통해 의존성을 주입합니다. 따라서 @Autowired 애너테이션이 필요 없습니다.
@RequiredArgsConstructor의 장점
- 불변성(Immutable): 생성자 주입을 사용하면 필드가 final로 선언되기 때문에, 해당 필드는 초기화 이후 변경될 수 없습니다. 이는 객체의 불변성을 유지하는 데 도움이 됩니다.
- 테스트 용이성: 생성자 주입은 주입된 의존성을 쉽게 모킹(Mocking)할 수 있어 단위 테스트가 용이합니다. 또한, 주입되지 않은 필드에 대해 컴파일 타임에 오류를 잡아낼 수 있습니다.
- 순환 의존성 방지: 생성자 주입을 사용하면 순환 의존성을 피할 수 있습니다. 필드 주입의 경우, 런타임에 순환 의존성 문제가 발생할 수 있지만, 생성자 주입은 컴파일 타임에 이를 방지할 수 있습니다.
결론
@RequiredArgsConstructor를 사용하면 @Autowired 애너테이션 없이도 스프링 빈의 의존성을 주입할 수 있습니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있으며, 테스트 작성이 용이해집니다. 또한, 객체의 불변성을 보장하여 안전한 코드를 작성하는 데 도움이 됩니다. 이러한 이유로 생성자 주입 방식과 @RequiredArgsConstructor를 사용하는 것이 권장됩니다.
'Java' 카테고리의 다른 글
22/05/30 JAVA (인터페이스, 스태틱) (0) | 2022.06.11 |
---|---|
22/05/30 JAVA (추상 클래스, 메소드) (0) | 2022.06.03 |
22/05/27 JAVA (class - 상속, 오버라이딩, 다형성) (0) | 2022.05.29 |
22/05/26 JAVA (12DAY) (0) | 2022.05.29 |
22/05/25JAVA (DAY11) (0) | 2022.05.28 |
댓글