책책책/토비의 스프링 3.1

[Spring] 제어의 역전 (IoC: Inversion of Control)

Deveun 2021. 6. 5. 22:29

토비의 스프링 1장: 오브젝트와 의존관계

제어의 역전 (IoC : Inversion of Control)

특정 클래스의 생성 / 관계 설정에 대한 책임과 권한을 가지는 제 3의 클래스가 존재하여 (=Factory)

프로그램의 흐름에서 필요한 시점에 직접 오브젝트를 생성하고 만들어진 오브젝트의 메소드를 호출 하는 것이 아니라, 

클라이언트에서는 내부에서는 이에 대한 동작, 생성에 대해서는 신경쓸 필요가 없이 필요에 따라 오브젝트의 생성 메소드를 호출하여 사용하기만 한다.

==> Client는 요청만! Factory는 설계를 담당!

 

스프링에서는 IoC오브젝트인 빈 팩토리/어플리케이션 컨텍스트(bean factory/application context) 에서 오브젝트를 생성하며, 여기서 생성될 오브젝트를 빈(Bean) 이라고 부른다.

이를 사용하기 위해서는 먼저 Factory역할의 java코드를 생성 -> 이를 스프링의 어플리케이션 컨텍스트에서 설정정보로 활용한다.

 

그럼, 이전 게시글의 예제를 스프링 IoC형태로 바꿔보자

(이전게시글 참고: 2021.06.05 - [책책책/토비의 스프링 3.1] - [Spring] 객체지향 - 관심사의 분리)

 

 

(1) SolutionTest.java 에서 오브젝트 생성하던 역할을 SolutionFactory 클래스로 분리

(2) 스프링 어플리케이션 컨텍스트에서 설정정보로 활용하기 위한 annotation 추가

 

SolutionFactory.java

@Configuration // 빈 팩토리를 위한 오브젝트 설정 클래스
public class SolutionFactory {
	
	@Bean // 오브젝트를 생성하는 메소드
	public Solution solution() {
		return new Solution(settingMaker());
	}

	@Bean
	public IfSettingMaker settingMaker() {
		return new ASettingMaker();
	}
}

 

(3) SolutionTest.java 에서는 직접 오브젝트를 생성하지 않고, *ApplicationContext를 사용하여 생성된 오브젝트를 호출

 

SolutionTest.java

public class SolutionTest {
	public static void main(String[] args) {
		
		/*
		 * Spring ApplicationContext 사용 이전 코드
		 * 
		 * SettingMaker aSettingMaker = new ASettingMaker();
		 * Solution aSolution = new Solution(aSettingMaker);
		 */
		
		
		// 어플리케이션 컨텍스트(=빈 팩토리) 생성
		ApplicationContext context = new AnnotationConfigApplicationContext(SolutionFactory.class);

		// 첫 번째 파라미터 "빈 이름" 
		//== SolutionFactory에서 오브젝트를 요청하는 메소드 명
		Solution aSolution = context.getBean("solution", Solution.class); 
	}
}

 

*ApplicationContext

: 스프링에서 사용하는 IoC 컨테이너로 BeanFactory 인터페이스를 상속한다.

애플리케이션에서 IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관게설정을 담당한다.

==> 클라이언트에서 구체적인 팩토리 클래스를 알 필요도 없어진다.

 

 

 

[참고서적] http://www.acornpub.co.kr/book/toby-spring3.1-vol1#spring3

 

토비의 스프링 3.1 Vol. 1 스프링의 이해와 원리

스프링의 핵심 프로그래밍 모델의 원리와 이에 적용된 다양한 디자인 패턴, 프로그래밍 기법의 이해를 돕는 책

www.acornpub.co.kr