public class Driver { // Driver.java
private Car m;
public Driver() { m = new Car(); } // 생성자
public void drive( ) {
m.engineOn(); m.go(); m.stop(); m.engineOff();
}
} // ↕ 높은 결합도
public class Car { // Car.java
public void engineOn( ) { System.out.println(“Car engine started.”); }
public void go() { System.out.println(“Car goes.”); }
public void stop() { System.out.println(“Car stops.”); }
public void engineOff() { System.out.println(“Car engine stopped.”); }
}
클래스 간의 의존관계 2
서비스 클래스를 다른 클래스로 변경할 경우
비행기 조종사로 바뀜
public class Driver { // Driver.java
private Plane m;
public Driver() { m = new Plane(); } // 생성자
public void drive( ) {
m.engineOn(); m.go(); m.stop(); m.engineOff();
}
} // ↕ 높은 결합도
public class Plane { // Plane.java
public void engineOn( ) { System.out.println(“Car engine started.”); }
public void go() { System.out.println(“Car goes.”); }
public void stop() { System.out.println(“Car stops.”); }
public void engineOff() { System.out.println(“Car engine stopped.”); }
}
인터페이스를 이용한 낮은 결합도로 설계
Car와 Plane 모두 Movable함
의존성 주입 (DI: Dependency Injection) 필요
이용(의존)할 객체를 속성에 설정(주입)
직접 객체 생성, 주입
생성자/setter를 통한 의존성 주입
프레임워크에서 객체 생성, 주입 (IoC Inversion of control)
Google Guice, Spring 프레임워크
xml: 의존성 추가, @annotation: 정의
직접 생성, 주입 (생성자/setter를 통한 의존성 주입)
public class Driver { // 생성자 버전
private Movable m;
public Driver(Movable m) {
this.m = m;
}
public void drive() {
m.engineOn();
m.go();
m.stop();
m.engineOff();
}
}
public class Main {
public static void main(String[] args) {
Movable m = new Plane();
Driver p = new Driver(m); // 생성자로 의존성 주입
p.drive();
}
}
public class Driver { // setter 버전
private Movable m;
public void setMovable(Movable m) {
this.m = m;
}
public void drive() {
m.engineOn();
m.go();
m.stop();
m.engineOff();
}
}
public class Main {
public static void main(String[] args) {
Movable m = new Plane();
Driver p = new Driver();
p.setMovable(m); // setter로 의존성 주입
p.drive();
}
}
Spring 프레임워크를 이용한 의존성 주입
DI 컨테이너가 @Autowired 어노테이션의 멤버 변수(속성)에 대해 @Component 어노테이션이 선언된 클래스들 중에서 해당하는 타입의 클래스를 찾아 객체 주입
byType 방법 (클래스 이름)
Bean 정의에서 클래스 스캔 범위 지정
DI 컨테이너 (객체 사이의 의존관계 주입 기능)
클래스의 인스턴스화(객체 생성) 기능
singleton 효과: 객체의 수명주기 관리
컴포넌트화: 클래스(객체) 간의 독립성
Spring 프레임워크를 이용한 의존성 주입
import org.springframework.beans.factory.annotation.Autowired;
public class Driver { // Driver.java
@Autowired
private Car m;
// public Driver() { m = new Car(); }
public void drive() {
m.engineOn(); m.go(); m.stop(); m.engineOff();
}
}
import org.springframework.stereotype.Component;
@Component
public class Car { // Car.java
public void engineOn() { System.out.println(“Car engine started.”); }
public void go() { System.out.println(“Car goes.”); }
public void stop() { System.out.println(“Car stops.”); }
public void engineOff() { System.out.println(“Car engine stopped.”); }
}
// DI 컨테이너가 @Component 중에 Car 클래스를 찾아 주입해줌