@Autowired란
스프링에서 인스턴스가 생성된 이후 @Autowired를 설정한 메소드가 자동으로 호출되고, 인스턴스가 주입된다.
즉 설정한 메소드에 스프링이 관리하는 Bean을 자동으로 Mapping 해준다는 개념이다.
변수, Setter 메소드, 일반 메소드, 생성자에 적용이 가능하다.
@Autowired는 @Type을 통해 주입한다.
@Autowired가 Type을 찾아서 주입하기 때문에 동일한 Bean 객체가 다수 있을 경우
@Qualifier 어노테이션을 함께 사용해야 한다.
<context:compenent-scan> 태그
@Autowired로 의존 관계를 주입할 경우, 클래스에 해당 태그를 사용해야 한다.
@Autowired와 @Resource
위의 어노테이션은 Bean을 자동으로 주입 해준다는 동일한 점이 있지만 차이점도 존재한다.
@Autowired
Type으로 의존성을 주입
변수, 생성자, Setter 메소드, 일반 메소드에 적용 가능
@Resource
Name으로 의존성을 주입
변수, Setter메소드에 적용 가능
그런데 @Autowired가 변수, 생성자, Setter 메소드, 일반 메소드에 적용이 가능하지만
Spring Boot 공식 문서에서는 생성자 주입을 권하고 있다.
출처 : https://firework-ham.tistory.com/28
위의 코드처럼 필드에 의존성을 주입하는 것이 아니라
출처 : https://firework-ham.tistory.com/28
생성자를 선언하여 @Autowired를 선언하는 방식이다.
그런데 왜 이렇게 사용할까?
그 이유는
1. 불변성
필드에 주입한다면 final을 선언할 수 없지만
생성자에 주입한다면 final을 선언할 수 있으므로 객체가 변하지 않는다.
2. 순환 참조 방지
여러 컴포넌트 간에 의존성이 생기는데, A가 B를 참조하고 B가 또 A를 참조하는 순환 참조가 발생할 수 있다.
필드 주입하여 사용하게 되면 순환 참조가 발생하면 예외가 발생해야 하는데 그렇지 않다.
하지만 생성자 주입 방식을 사용한다면 순환 참조의 오류를 알 수 있게된다.
'[Spring Boot]' 카테고리의 다른 글
[Spring Boot] JPA의 영속성, ORM, Entity 클래스 (0) | 2021.10.14 |
---|---|
[Spring Boot] REST API -- 미완성 (0) | 2021.10.14 |
[Spring Boot] 프로젝트 파일 (0) | 2021.10.14 |
[Spring boot] @Required Annotation 필수 프로퍼티 검사 (0) | 2021.10.14 |
[Spring Boot] Spring boot pom.xml 및 MVC Controller 설정 (0) | 2021.10.14 |