[ 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에서 실행하면, 삽 도구로 일하다. 가 출력됨
'Java Web Programming > 6. Spring | MyBatis' 카테고리의 다른 글
[Spring] 비즈니스 로직 계층 추가 (IOC, DI+DL) (0) | 2020.10.27 |
---|---|
[Spring] 생성자를 통한 DI/DL 적용(constructor-arg) + IOC + maven (0) | 2020.10.27 |
[Spring] DI/DL 적용 + Spring IOC 개발 + maven (0) | 2020.10.27 |
[Spring] 메이븐 maven 형식, Spring IOC 개발단계 (0) | 2020.10.27 |
[Framework/Spring] Eclipse 이클립스에서 Spring 스프링 프레임워크 환경 설정 (0) | 2020.10.26 |