오늘은 스프링 부트를 공부하면서 자주 사용했던 어노테이션에 대해 글을 작성해보겠다.
스프링 프레임워크는 3가지 핵심 프로그래밍 모델을 지원하고 있는데, 그 중 하나가 의존성 주입(Dependency Injection, DI) 이다.
DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.
의존성이란 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다.
public class Store {
private Pencil pencil;
}
예를 들어 위와 같이 Store
객체가 Pencil
객체를 사용하고 있는 경우에 우리는 Store
객체가 Pencil
객체에 의존성이 있다고 표현한다.
그리고 이 두 객체 간의 관계를 맺어주는 것을 의존성 주입이라고 하는데,
여기에는 생성자 주입, 필드 주입 등 여러가지가 있지만 요즘에는 생성자 주입을 강력히 권장하고 있다.
@Autowired
란, 스프링 DI(Dependency Injection)에서 사용되는 어노테이션으로,
스프링에서 빈 인스턴스가 생성된 이후 @Autowired
를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입된다.
즉, 해당 변수 및 메서드에 스프링이 관리하는 Bean
을 자동으로 매핑해주는 개념이다.
@Autowired
는 변수, Setter
메서드, 생성자, 일반 메서드에 적용이 가능하며 <property>
, <constructor-arg>
태그와 동일한 역할을 한다.
@Autowired
는 주로 타입(Type
)을 이용해 주입 한다.
@Autowired
가 Type
으로 찾아서 주입하므로 동일한 Bean
타입의 객체가 여러개 있을 경우, Bean
을 찾기 위해 @Qualifier
어노테이션을 같이 사용해야 한다.
public class AutowiredExController {
@Autowired
private AutowiredExService autowiredExService;
}
위와 같이 의존성을 주입할 객체 위에 @Autowired
어노테이션을 붙여주면 자동으로 의존성이 주입된다.
대신에 @RequiredArgsConstructor
사용을 지향하는데 그 이유에 대해 알아보자.
1. 순환 참조 방지
2. final
선언이 가능하다.
3. 테스트 코드 작성 용이
@RequiredArgsConstructor
는 생성자를 자동으로 생성해주는 어노테이션이다.
final
키워드가 붙은 멤버변수를 생성자 파라미터로 알아서 넣어준다.
public class AutowiredExController {
@RequiredArgsConstrucotr
final AutowiredExService autowiredExService;
}
public AutowiredExController(finale AutowiredExService autowiredExService) {
this.autowiredExService =autowiredExService;
}
위의 두 가지 코드는 같은 코드이다.
📌 참고 자료