새소식

Spring

[Spring] 의존성 역전 (IoC, Inversion of Control)

  • -

 

 

의존성 역전

 

1)    의존성 역전(IoC, Inversion of Control)의 개념

 

소프트웨어 개발에서 컴퓨터 프로그램의 제어 흐름을 역전시키는 개념

 

일반적으로 프로그램의 제어 흐름은 개발자가 코드를 작성하여 결정하게 됩니다.

그러나 IOC에서는 제어 흐름의 결정 권한을 프레임워크나 컨테이너에 위임하고,

개발자는 이를 따르는 방식으로 개발을 진행합니다.

 

"상위 수준 모듈은 하위 수준 모듈에 의존해서는 안 된다. 둘 모두 추상화에 의존해야 한다."라는 개념

 

즉, 상위 수준 모듈은 하위 수준 모듈에 직접 의존하는 대신,

추상화된 인터페이스나 추상 클래스와 같은 추상화 계층에 의존해야 합니다.

 

 

 

 

2)    의존성 역전의 예시

 

<예시 - 의존성이 역전되지 않은 경우>

public class Pikachu {
    public void attack() {
        // 피카츄의 공격 코드
    }
}

public class PokemonGame {
    private Pikachu pikachu;

    public PokemonGame() {
        pikachu = new Pikachu();
    }

    public void playGame() {
        pikachu.attack();
    }
}

PokemonGamePikachu 클래스에 직접 의존하고 있습니다.
의존성이 상위 수준 모듈(
PokemonGame)에서 하위 수준 모듈(Pikachu)로 향하고 있음을 나타냅니다.


<예시 - 의존성이 역전된 경우>

public interface Pokemon {
    void attack();
}

public class Pikachu implements Pokemon {
    public void attack() {
        // 피카츄의 공격 코드
    }
}

public class PokemonGame {
    private Pokemon pokemon;

    public PokemonGame(Pokemon pokemon) {
        this.pokemon = pokemon;
    }

    public void playGame() {
        pokemon.attack();
    }
}


Pokemon 인터페이스를 도입하여 PokemonGamePokemon 인터페이스에 의존하도록 변경함.
이렇게 함으로써
PokemonGame은 실제로 어떤 종류의 포켓몬이든
상관없이
attack() 메서드를 호출할 수 있습니다.

즉,
PokemonGame은 더 이상 구체적인 포켓몬 클래스에 직접 의존하지 않으며,
의존성을 역전시킴으로써 유연성과 확장성을 얻을 수 있게 됩니다.

의존성 역전 O

 

 

 

 

3)    의존성 역전의 장점

 

 

①  느슨한 결합

의존성 역전을 통해 상위 수준 모듈은 추상화 계층에 의존하게 됩니다.

이로써 모듈 간의 결합도가 낮아지고, 하위 수준 모듈의 변경이나 대체가 상위 수준 모듈에 영향을 미치지 않게 됩니다.

이는 시스템의 유연성과 재사용성을 높여줍니다.

 

 

 

②  확장성

존성 역전은 새로운 하위 수준 모듈의 추가나 기존 모듈의 변경에 용이합니다.

새로운 하위 수준 모듈이 추가될 경우, 해당 모듈이 추상화 계층을 구현하기만 하면 됩니다.

 

 

 

③  테스트 용이성

의존성 역전은 모듈 간의 의존성을 인터페이스나 추상화 계층으로 추상화하기 때문에 테스트가 용이해집니다.

모의 객체(Mock Object) 또는 대역 객체(Stub Object)를 사용하여 테스트할 모듈의 의존성을 대체할 수 있습니다.

 

 

 

 

 

4)    의존성 역전의 단점

 

 

①  복잡성

 

일반적으로 더 많은 추상화 계층과 인터페이스를 도입하므로 코드의 복잡성이 증가할 수 있습니다.

이는 개발 및 유지보수 과정에서 추가적인 작업을 필요로 할 수 있습니다.

 

 

 

②  실행 시 오버헤드

 

의존성 역전을 위해 IOC 컨테이너를 도입하는 경우, 실행 시에 일부 오버헤드가 발생할 수 있습니다.

객체의 생성 및 관리를 컨테이너에 위임하므로 컨테이너가 초기화되고 의존성이 주입되는 과정이 추가됩니다.

하지만 이 오버헤드는 대부분의 경우 무시할 정도로 작습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2023.06.27 - [Spring] - 의존성주입(DI, Dependency Injection)

 

의존성주입(DI, Dependency Injection)

의존성 주입 1) 의존성 주입의 개념 DI는 객체가 직접 필요로 하는 의존성을 생성자, Setter 메서드, 필드 주입 등의 방법으로 주입받는 것을 의미 이를 통해 객체 간의 결합도를 낮추고, 코드의 재

devwarriorjungi.tistory.com

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.