spring에서 클래스에 대한 종속성을 자동으로 연결하는데 사용되는 주석이다.
클래스에 주입해야하는 종속성이 있는 경우 @Autowired를 사용하여 적절한 bean을 찾아 주입하도록 spring에 알릴 수 있다
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// ...
}
위 처럼 UserSevice라는 클래스에 UserRepository를 주입해야할때 @Autowired를 이용하면 spring은 UserRepository유형의 bean에 대한 application context를 검색한 다음 UserService에 주입시킨다.
즉 @Autowired를 사용하면 자동 종속성 주입을 허용하여 코드의 양을 줄여주는 spring의 기능이다
결론부터 말하자면 @Autowired를 사용하면 클래스 간의 강한 결합으로 이어질 수 있고, 순환 참조가 일어날지도 모른다. 또한 final을 붙일 수 없어서 객체의 변경이 가능해진다
@Autowired는 클래스의 종속성을 자동으로 연결한다. 이는 아주 편리한 기능이지만 해당 종속성과 밀접하게 연결되어 있음을 의미하기도 한다. 이로인해 코드의 유연성이 떨어지고 장기적인 유지 관리가 더 어려워질 수 있다.
그러면 @Autowired대신에 무엇을 사용해야되냐
바로 생성자를 이용한다.
생성자를 이용할경우 다음과 같은 이점이 생긴다
1. 결합 감소 : 생성자 주입은 클래스 구현 세부 사항에서 종속 클래스를 분리하여 클래스간의 결합을 줄일 수 있다
2. 순환참조 방지 : 생성자 주입은 생성자에 필요한 인자를 먼저 확인한 후 인자에 해당하는 빈을 생성하기때문에 순환참조가 발생하는경우 여기서 막을 수 있다
3. 불변성 보장 : final 키워드를 사용할 수 있기때문에 객체의 불변성이 보장된다
@Controller
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
// ...
}