Spring - IoC , DI

유재학·2022년 11월 10일
0

IoC ( Inversion of Control )란?

  • 말 그대로 해석하면 제어의 역전이다.
  • 스프링에서만 존재하는 개념이 아닌 소프트웨어 세계에서 자주 발견할 수 있는 개념이다.
  • 메소드나 객체의 호출을 개발자가 결정하는 것이 아닌 외부 컨테이너에 의해 결정되는 것을 의미한다.
public Class A {

	private B b;
    
    public A() {
    	b = new B();
    }
}
  • 위 코드는 개발자가 직접 B객체를 호출하여 의존 관계를 나타내는 코드이다.
public class A {
	
    @Autowired
    private B b;
    
}
  • 위 코드는 B 객체가 스프링 컨테이너에 등록되어 관리되고 있는 Bean이라면 Autowired 어노테이션을 통해 개발자가 직접 객체를 관리하지 않고 스프링 컨테이너가 객체를 생성하여 해당 객체에 주입 시키는 코드이다.

  • 원래라면 개발자가 객체를 제어하지만 스프링 컨테이너라는 외부로 제어의 결정권을 넘긴 것이다. 이것을 IoC (제어의 역전) 라고 한다.

IoC는 왜 사용할까?

  • 결론적으로 말하면 유연한 개발을 하기 위해서이다.
  • 각 객체마다 자신의 역할에만 집중하게 만들면서 응집도는 높이고 결합도는 낮추어 유지보수나 변경에 대해 유연하게 대응할 수 있도록 하기 위해서이다.
  • 만약 현재 작성중인 클래스에서 필요한 객체를 생성하고 비즈니스 로직을 수행하고 소멸시키는 일을 한번에 진행 중이라면 나중에 이 클래스를 수정할 경우 굉장히 많은 내부 로직을 수정해야 할 수 있다. 하지만 이러한 부분을 하나 씩 모듈화 시킨다면 필요한 부분만 수정하면 되는 것이다.

그렇다면 DI (Dependency Injection)란 무엇인가?

  • DI란 IoC의 개념을 스프링에 맞게 새롭게 정의한 것이다.
  • 위의 내용에서 스프링 IoC의 대표 동작 원리는 의존관계 주입이라는 것을 알 수 있었다. 외부로부터 객체 주소값을 제공받고 이를 통해 다른 객체들과 의존관계가 만들어지는 것이다.
  • DI는 스프링이 실행될 때 모든 의존성 객체를 싱글톤 패턴으로 만들어주고 필요한 곳에 주입시킨다. 즉, 제어의 흐름을 개발자가 컨트롤하는 것이 아니라 스프링에게 맡겨 작업을 처리한다는 것이다.

결론

  • 결론적으로 IoC는 소프트웨어 세계에서 자주 발견할 수 있는 제어의 역전이라는 개념으로, 응집도는 높이고 결합도는 낮추어 클래스간의 의존성을 최소화함으로써 유지보수나 변경에 대해 유연하게 대응할 수 있다는 장점을 가지고 있는 디자인 패턴이다.

  • DI는 이러한 IoC의 개념을 스프링에 맞게 새롭게 정의한 것으로 스프링이 실행될 때 모든 의존성 객체를 싱글톤 패턴으로 만들어주고 필요한 곳에 주입시켜 제어의 흐름을 스프링에게 맡겨 IoC가 가진 장점을 그대로 가지는 디자인 패턴이다.

profile
github : https://github.com/kiaeh2323 , email : kiaeh9269@gmail.com

0개의 댓글