스프링 컨테이너를 사용하지 않고 기존에 사용하는 방식으로 구현했다면
A클래스가 B객체의 메서드를 구현하고 싶다면
이렇게 구현해서 사용했을 것이다.
하지만 이러한 구조는 A클래스가 B클래스를 직접적으로 참조하므로 결합도가 높다.
결합도를 낮추기 위한 방법으로 Spring IOC 컨테이너를 사용한다.
IOC 컨테이너를 사용하여 구현하려면
먼저 사용하고자 하는 클래스를 Bean으로 등록해야한다.
클래스를 Bean으로 등록하는 방법은 3가지가 있다.
3가지 방법 중 한가지 이상을 사용하여 Bean으로 등록했다면
IOC 컨테이너가 관리하는 영역에 들어간 것이다.
그리고 필요한 시점에 bean 객체를 주입해준다.
의존성을 주입 하는 방법은
Dependency Injection 과 Dependecy Lookup 두가지 가 있다.
Dependency Injection
1. setter 메서드
2. constructor 주입
3. 메서드 주입
그림과 같이 constructor 주입 방법 과 setter 메서드 방법을 xml방식으로 등록하는 방법이다.
설명을 하자면 ClubServiceLogic 안에 clubStore 인테이스를 가지고 있다.
생성자로 clubStore인터페이스의 구현체를 가지고 있다면
application-context.xml을 참조하여 의존성을 주입한다.(생성자 주입 부분)
즉, ClubServiceLogic클래스는 clubStore의 인터페이스 정보만 알게 된다.
(구현체에 대한 정보는 모름)
@Service 어노테이션을 사용 - 비즈니스 로직 처리 (ID값 지정 가능)
@Reposittory 어노테이션을 사용 - 저장소 연결 (ID값 지정 가능)
이제 전체 흐름을 살펴보자
먼저 UI 에서 비즈니스 로직을 호출할때 MemberSerivce인테이스가 호출되고 구현체인
MemberServiceLogic 실제 수행되는데 앞서 @Service 어노테이션을 설정되어있어
Spring IOC 컨테이너가 구현체를 알아서 주입해준다.
그리고 MemberServiceLogic 안에 MemberStore 인테이스를 가지고 있다.
MemberStore 인터페이스 구현체인 MemberMapstore는 @Reposittory 어노테이션 설정이 되어있기 때문에 IOC컨테이너가 주입을 해준다.
[참고]
@Service
@Reposittory
안에는 @Component 어노테이션이 존재하고 앞서 component-scan으로 bean을 등록 했기 때문에 관리하는 컴포넌트(bean)로 인식하게 된것이다.
Dependecy Lookup(보통 사용하지 않음)