본문 바로가기
Java Web Programming/6. Spring | MyBatis

[Framework/Spring] IOC / DI 의 개념과 활용

by 파프리카_ 2020. 10. 26.
728x90
반응형

[ Spring Framework 개념 ]

: java application의 설계, 구현, 테스트, 운영(유지 보수) 전반에 대한 기반을 제공

& 높은 생산성과 유지보수성 향상을 위해 다양한 인프라를 지원한다.

(infra : 다양한 라이브러리 및 디자인 패턴을 지원)

 

- 프레임워크는 반완전한 어플리케이션이다.

* Framework  : 사전적 의미 = 틀, 뼈대, 기반(infrastructure)

즉, 개발자는 비즈니스 로직에 집중할 수 있도록 기반을 제공하는 것이 프레임워크의 목적이다. 

 

-POJO(Plain Old Java Object) 기반으로한 프레임워크이다. : POJO (프레임워크를 적용하기 전 그냥 자바)

 

- Spring Framework는 IOC(DI)  IOC(DI), AOP, MVC, Security 등을 지원하고,

MyBatis, JUnit 과 같은 오픈소스 라이브러리와의 통합을 지원한다.


[  IOC / DI 개념 ]

> IOC (Inversion Of Control) : 제어의 역행, 제어의 반전, 역제어

⇒ 결합도를 낮추어 유지보수성을 향상한다.

 

- 의존 대상을 필요로 할 때, 기존 제어 방식(생성하는 것)이 아니라,

IOC 컨테이너로부터 의존 대상을 확보하는 방식으로 시스템을 구축하는 것을 말한다. 

 

> DI ( Dependency Injection ) : 의존관계 주입

 

“컴포넌트를 구성하는 인스턴스의 생성과 의존 관계 연결처리를 IOC 컨테이너에게 위임

 

OO Design Principles (객체지향 디자인 원칙) 에 기여한다.

- Loose coupling and high cohesion (결합도를 낮추고, 응집력을 높이자!)


[ IOC / DI의 역할 ]

 

> 기존 제어 방식 : 일반적인 의존 관계

 

> DI 적용 방식 : IOC 컨테이너 환경의 의존 관계

 


[ IOC / DI 적용의 장점 ]

  • 인스턴스의 생명주기 제어
  • Bean Scope 관리 ( Singleton이 기본) *Bean Scope : 중요한 java bean
  • 컴포넌트간의 결합도를 낮춤
  • 단위 테스트 용이
  • AOP 적용하여 공통 기능을 제공

[ IOC / DI의 코딩 구현 모습 ]

 

1. 기존 제어 방식

 : 어떤 작업을 수행하기 위해 Hammer 또는 Spade가 필요하다.

 : 필요 시 생성해서 사용하는 것이 기존 방식이다. 

만약, Hammer에서 Spade로 도구를 변경하기 위해서는 객체 생성부를 변경해야 한다. 

** 도구(의존대상 객체)의 변경이 필요할 때, 코드를 수정해야 하므로 유지보수성이 낮다. 

 

/model

 

/Hammer.java

package model;

public class Hammer {
	public void work() {
		System.out.println("망치 도구로 일하다.");
	}
}

 

/Spade.java

package model;

public class Spade {
	public void work() {
		System.out.println("삽 도구로 일하다.");
	}
}

/test

 

/TestTool.java

package test;

import model.Hammer;
import model.Spade;

public class TestTool {
	public static void main(String[] args) {
		/*
		 * 1. 기존 제어 방식
		 *  : 어떤 작업을 수행하기 위해 Hammer 또는 Spade가 필요하다.
		 *  : 필요 시 생성해서 사용하는 것이 기존 방식이다. 
		 */
		
		//만약, Hammer에서 Spade도 도구를 변경하기 위해서는 
		//객체 생성부를 변경해야 한다.
		
		// -> Spring Framework로 이를 해결할 수 있다.
		
		//Hammer tool = new Hammer(); //망치 도구로 일하다.
		Spade tool = new Spade();
		tool.work(); //삽 도구로 일하다.

	}
}

 

→ Springframe work를 통해, 유지보수성이 높은 코딩을 만들 수 있다. 


2. IOC를 적용한 제어 방식 *DI가 아닌 DL 방식을 진행됨

 : 기존 제어 방식 (TestTool.java)에서 IOC를 적용한 제어방식으로 변경

- Spring IOC Container (ApplicationContext)를 이용해,

스프링 설정 파일 ioc.xml을 시스템 시작 시에 읽어서  필요 객체를 생성한 후,어플리케이션에서 bean id를 요청하면 생성한 객체를 반환해준다.

→ 의존 대상 객체(ex- Tool이 Hammer에서 Spade로 변경)를 바꾸더라도, 기존 소스 코드는 변경할 필요가 없다.

 = 유지보수성 향상 ! 

 

 

/model

 

/Tool.java <<interface>>

package model;

public interface Tool {
	public void work();
}

 

/Hammer.java

package model;

public class Hammer implements Tool{
	public void work() {
		System.out.println("망치 도구로 일하다.");
	}
}

 

/Spade.java

package model;

public class Spade implements Tool{
	public void work() {
		System.out.println("삽 도구로 일하다.");
	}
}

/test

 

Spring IOC Container 

: 객체를 생성하여 제어하는 역할 (singleton 방식으로 운용됨)

 

/TestIOC.java

package test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import model.Tool;

public class TestIOC {
	public static void main(String[] args) {
		//Spring IOC Container : 객체를 생성하여 제어하는 역할
		//(singleton 방식으로 운용됨)
		ClassPathXmlApplicationContext factory 
			= new ClassPathXmlApplicationContext("ioc.xml");
		
		
		Tool tool = (Tool) factory.getBean("tool");
		tool.work();
		
		factory.close();
		
	}
}

/ioc.xml

 

1) class = "model.Hammer"인 경우 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="tool" class="model.Hammer"></bean>

</beans>

 

> TestIOC에서 실행하면, 망치 도구로 일하다. 가 출력됨

 

 

2) class = "model.Spade"인 경우 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="tool" class="model.Spade"></bean>

</beans>

 

> TestIOC에서 실행하면, 삽 도구로 일하다. 가 출력됨

 

 

 

728x90
반응형