Dev.YoungKyu
YoungKyu's Devlog
전체 방문자
오늘
어제
  • 분류 전체보기
    • 부스트캠프
    • iOS
    • visionOS
    • Backend
    • 알고리즘
    • CS
    • Git
    • Python
    • 끄적끄적

블로그 메뉴

  • 홈
  • 🌝 티스토리 홈
  • ⭐️ 깃허브
  • 태그

공지사항

인기 글

최근 댓글

최근 글

태그

  • 부스트캠프
  • swift
  • SwiftUI
  • MVC
  • Python
  • AutoLayout
  • guard
  • constraint
  • Concurrency
  • 티스토리챌린지
  • ImageResource
  • 소프트웨어 테스트
  • 알고리즘
  • 소프트웨어공학
  • 오블완
  • 백준
  • Optional
  • Git
  • boj
  • AVAudioSession
  • CS
  • jekyll
  • 모듈화
  • authenticationinterceptor
  • 소프트웨어 공학
  • ios
  • alamofire
  • if let
  • Swift5.7
  • image

티스토리

hELLO · Designed By 정상우.
Dev.YoungKyu
[소프트웨어 공학] 의존성 주입과 IoC
CS

[소프트웨어 공학] 의존성 주입과 IoC

2022. 9. 26. 09:57

클래스 간의 의존관계 1

  • 한 클래스가 실행할 때 다른 클래스의 서비스가 필요

Driver는 Car가 있어야해

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 클래스를 찾아 주입해줌

 

저작자표시 (새창열림)

'CS' 카테고리의 다른 글

[소프트웨어 공학] 디자인 패턴 Design Pattern  (2) 2022.09.26
[소프트웨어 공학] 디자인 원칙 SOLID  (0) 2022.09.26
[소프트웨어 공학] Maven  (1) 2022.09.26
[소프트웨어 공학] 객체지향 개발 프로세스  (0) 2022.09.19
[소프트웨어 공학] 순차 다이어그램(Sequence Diagram)  (0) 2022.09.19
    'CS' 카테고리의 다른 글
    • [소프트웨어 공학] 디자인 패턴 Design Pattern
    • [소프트웨어 공학] 디자인 원칙 SOLID
    • [소프트웨어 공학] Maven
    • [소프트웨어 공학] 객체지향 개발 프로세스
    Dev.YoungKyu
    Dev.YoungKyu
    iOS를 공부하고 있습니다

    티스토리툴바