스프링 프레임워크 IoC/DI

스프링 프레임워크 IoC/DI

Spring Framework 란 Aspect Oriented Programming, Portable Service Abstraction, Inversion of Control / Dependency Injectoin 기술을 바탕으로 Plain Old Java Object 를 지향하는 경량의 오픈소스 프레임워크입니다.
AOP, PSA, IoC/DI 기술은 스프링의 3 대 핵심 기반기술입니다. 스프링 프레임워크를 제대로 이해하기 위해서는 기반기술을 제대로 이해할 필요가 있습니다.

AOP : 관점 지향 프로그래밍

공통로직(횡단관심사)을 별도의 공간(클래스)에 따로 구현하고 이를 런타임 시 적용이 필요한 클래스 메소드에 프록시를 사용하여 적용하는 기술

PSA : 이동가능한 서비스를 위한 추상화

연동 애플리케이션이 변하더라도 개발자의 코드가 변경되지 않도록 스프링이 개입하여 연동 서비스를 추상화하고 개발자는 이 추상화 서비스와 대화하면 단일 코드로 연동작업을 지속 가능하게 해주는 기술

IoC : 제어의 역행

객체관리를 개발자가 하지 않고 스프링이 대신 맡아서 처리해 주는 기술

DI : 의존성 주입

클래스 내 필요한 의존객체를 외부에서 주입해 주는 기술

Plain Object : 순수한 자바 객체

개발자가 필요로 하는 코드만 존재하는 순수한 객체. 특정 기술을 사용하기 위해서 반드시 구성해야 하는 환경이 없으며 개발자의 클래스에 특정 기술을 위한 코드가 강제되지 않는 상태에 자바 객체


Spring IoC 실습 (XML기반, 인터페이스, 세터주입)

New > Project > Spring Legacy Project
Project Name : carmaker
Simple projects : Simple Spring Maven
Package : com.example.ioc
Spring version : 4.2.0

Money.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.ioc;
public class Money {
private int amount;
public Money() {}
public Money(int amount) {
this.amount = amount;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
}

이 클래스는 값을 보관하기 위해 사용하는 Value Object 입니다.
필드변수 amount 만 직접 코딩하고 나머지는 이클립스가 제공하는 코드 제너레이트 기능을 이용하여 작성하도록 합니다. 마우스 오른쪽 버튼 클릭 후 Source > Generate Getters and Setters 를 클릭하시면 됩니다.

Car.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.ioc;
public class Car {
private String name;
public Car() {}
public Car(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

자동차 관련정보를 관리하는 Value Object 입니다.

HyundaiMaker.java
1
2
3
4
5
6
7
8
9
10
11
package com.example.ioc;
public class HyundaiMaker{

public HyundaiMaker() { }

public Car sell(Money money) {
System.out.println("I sold a car.");
Car car = new Car("Sonata");
return car;
}
}

Money 객체를 받고 Car 객체를 직접 만들어서 리턴하는 서비스 로직을 제공합니다.


Project에서 마우스 우측버튼 -> new -> other -> Spring -> Spring Bean Configuration File

src/main/resources/ioc.xml 을 생성합니다.
다음 버튼을 누른 후 위쪽에 beans을 선택하시고 아래쪽에 spring-beans-4.2.xsd를 선택해주세요.

1
2
3
4
5
6
7
8
<?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-4.2.xsd">
<!—아래 부분만 코딩 하세요 ->
<bean id="orderManager" class="com.example.ioc.OrderManager"/>
</beans>
OrderManagerApp.java
1
2
3
4
5
6
7
8
9
10
package com.example.ioc;
public class OrderManager {
private HyundaiMaker maker;
public OrderManager () {
this.maker = new HyundaiMaker();
}
public void order() {
Car car = this.maker.sell(new Money(1000));
}
}

OrderManager와 HyundaiMaker는 서로 떼어 놓을 방법이 없다. 이 두 클래스는 정적으로 결합(coupling)되어 있습니다.

자바에서 결합도를 떨어뜨리는 일반적인 방법은 구현을 인터페이스 뒤로 숨기는 인터페이스 기반 프로그래밍을 하는 것입니다. 이를 통해 클라이언트 클래스에 영향을 주지 않고도 쉽게 구현 클래스가 교체될 수 있도록 할 수 있습니다.

CarMaker.java
1
2
3
4
package com.example.ioc;
public interface CarMaker {
public Car sell(Money money) ;
}

결합도를 낮추기 위해 인터페이스 기반으로 프로그래밍 합니다.

HyundaiMaker.java
1
2
3
4
5
6
7
8
9
package com.example.ioc;
public class HyundaiMaker implements CarMaker{
public HyundaiMaker() { }
public Car sell(Money money) {
System.out.println("I sold a car.");
Car car = new Car("Sonata");
return car;
}
}

Money 객체를 받고 Car 객체를 직접 만들어서 리턴하는 서비스 로직을 제공합니다.

DaewooMaker.Java
1
2
3
4
5
6
7
8
9
package com.example.ioc;
public class DaewooMaker implements CarMaker {
public DaewooMaker () { }
public Car sell(Money money) {
System.out.println("I sold a car.");
Car car = new Car(“Tosca”);
return car;
}
}

대우 서비스 로직도 만들어 봅시다.

OrderManager.java
1
2
3
4
5
6
7
8
9
10
11
12
package com.example.ioc;
public class OrderManager {
private String name;
private CarMaker maker;
public OrderManager() { }
public void order() {
Car car = this.maker.sell(new Money(1000));
}
//setter 메소드를 통해 CarMaker 타입 객체를 주입 받는다.
public void setMaker(CarMaker maker) {
this.maker = maker;
}
ioc.xml 수정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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-4.2.xsd">
<bean id="hyundaiMaker" class=" com.example.ioc.HyundaiMaker"/>
<bean id=“daewooMaker" class=" com.example.ioc.DaewooMaker"/>
<bean id="orderManager"
class="com.example.ioc.OrderManager">
<!-- 세터 주입을 의미 -->
<property name="maker">
<!-- 이부분을 수정하면 소스수정 없이 maker 교체 가능 -->
<ref bean="hyundaiMaker"/>
</property>
</bean>
</beans>

OrderManagerApp 실행 후 결과 확인해 봅시다.

혹시 안 되시는 부분이나 오타가 있다면 알려주세요!

참고
Share