관리 메뉴

有希

2. @Autowired 본문

프로그래밍/Spring4

2. @Autowired

有希. 2022. 3. 14. 21:58

인젝션(의존 관계)를 받기 위한 설정

@Autowired
public void setFoo(Foo foo)
{
	this.foo = foo;
}

인젝션, 의존 관계에 대해 생각해 봤는데, 이런 의미인거 같다. -> "내 기능을 완성하기 위해 다른 클래스가 필요하다.(의존)" 즉, 나 스스로 완전하지 않고 다른 녀석이 있어야 한다.

인자가 여러개여도 가능하고, 생성자에도 가능하다. 

그리고, autowired가 어떻게 알아서 적절한 클래스를 가져와서 완성시켜주는가? 에 대한 답은 ->

@Component가 붙은 녀석들 중 맞는 녀석을 데려온다.


이렇게 하면 인젝션이 필수가 아니게 할 수도 있다.

@Autowired(required = false)
public void setFoo(Foo foo)
{
	this.foo = foo;
}

그런데 만약에 인터페이스를 인젝션 하려는데, 인터페이스를 구현한 클래스가 2개여서 @Autowired가 뭐가 적절한지 구분할 수 없다면 어떻게 되는가? -> 바로 에러가 발생한다.

이런 경우의 해결 방법은 3가지가 있다.

1. 우선도 부여하기
우선할 디폴트 Bean을 설정하는 @Primary 를 @Bean이나 @Component에 적어준다.
Bean->다른 여러 클래스 들을 담은 자바 오브젝트. Getter/Setter만으로만 접근 가능하며 모든 멤버 변수는 private

@Component
@Primary
public class InterfaceImpl implements Interface {
...
}

2. @Autowired와 병행해서 @Qualifier를 사용. Qualifier에 지정된 녀석을 사용한다.
@Component("이름") 으로 이름을 지정해줘야 하는데, 이름이 겹치게 되면 오류가 발생한다.

@Autowired
@Qualifier("ProductDao")
private ProductDao productDao;

@Component("ProductDao")
public class ProductDaoImpl implements ProductDao
{
...
}

3. Bean 정의 파일인 context:component-scan을 이용한다. 어느 정도 크기의 컴포넌트마다 context를 기술해두고, 테스트나 실사용 시에 정의만 바꿔친다.

'프로그래밍 > Spring4' 카테고리의 다른 글

5. 리플렉션과 성능 문제  (0) 2022.03.14
4. 생명 주기 관리  (0) 2022.03.14
3. @Component  (0) 2022.03.14
1. service, dao 개념  (0) 2022.03.13