클래스 간의 의존관계 1
- 한 클래스가 실행할 때 다른 클래스의 서비스가 필요
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.”); }
}
인터페이스를 이용한 낮은 결합도로 설계
의존성 주입 (DI: Dependency Injection) 필요
- 이용(의존)할 객체를 속성에 설정(주입)
- 직접 객체 생성, 주입
- 생성자/setter를 통한 의존성 주입
- 프레임워크에서 객체 생성, 주입 (IoC Inversion of control)
- Google Guice, Spring 프레임워크
- xml: 의존성 추가, @annotation: 정의
- Google Guice, Spring 프레임워크
- 직접 객체 생성, 주입
직접 생성, 주입 (생성자/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 효과: 객체의 수명주기 관리
- 컴포넌트화: 클래스(객체) 간의 독립성
- 클래스의 인스턴스화(객체 생성) 기능
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 클래스를 찾아 주입해줌
'CS' 카테고리의 다른 글
[소프트웨어 공학] 디자인 패턴 Design Pattern (0) | 2022.09.26 |
---|---|
[소프트웨어 공학] 디자인 원칙 SOLID (0) | 2022.09.26 |
[소프트웨어 공학] Maven (0) | 2022.09.26 |
[소프트웨어 공학] 객체지향 개발 프로세스 (0) | 2022.09.19 |
[소프트웨어 공학] 순차 다이어그램(Sequence Diagram) (0) | 2022.09.19 |