Spring 학습 정리 - 스프링 핵심 IoC, DI

DragonTiger·2022년 1월 12일
0

IoC, DI

제어의 역전 IoC(Inversion of Control)

기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다.
한마디로 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다. 개발자 입장에서는 자연스러운 흐름이다.

MemberRepository memberRepository = new MemberRepository();

자바로 프로그래밍을 하면서 객체를 생성할 때 직접 클래스에 new 연산자를 이용하여 생성했다.
하지만 스프링을 사용하게 되면 프로그램의 흐름을 스프링 프레임워크가 주도하게 된다. 따라서 객체의 생성주기를 프레임워크가 관리하기 떄문에 이를 두고 '제어의 역전'(Inversion of Control)이라고 표현하는 것이다.
프로그램에 대한 제어 흐름에 대한 권한은 모두 스프링컨테이너가 가지고 있다. (스프링컨테이너가 관리하는 객체는 빈이라고 부른다.)
이렇듯 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)이라한다.

의존관계 주입 DI(Dependency Injection)

DI는 Dependency Injection의 줄임말로 말 그대로 '의존성 주입'으로 이해할 수 있다. 스프링 프레임워크는 매번 new를 통해 개발자가 인스턴스를 생성하지 않고, 의존성 객체라는 프레임워크에 의해 생성된 객체(빈)를 주입시키는 방식을 취한다.

@Autowired
MemberRepository memberRepository;

맨위의 코드와 비교하면 주입받는 객체가없다 대신 @Autowired 어노테이션만 붙어있을뿐이다.(실제론 생성자 주입을 권장한다) 참조 - 망나니개발자

이와 관련되어선 객체지향 5원칙(SOLID)과도 밀접한 연관이있다.
의존관계 주입은 제어의 역행이 일어날 때 스프링이 내부에 있는 객체들간의 관계를 관리할 때 사용하는 기법이다.
한 객체가 어떤 객체(구체 클래스)에 의존할 것인지는 별도의 관심사이다. Spring에서는 DI 컨테이너를 통해 서로 강하게 결합되어 있는 두 클래스를 분리하고, 두 객체 간의 관계를 결정해 줌으로써 결합도를 낮추고 유연성을 확보하고자 하였다. 의존성 주입으로 애플리케이션 실행 시점에 객체를 생성하고 관계를 결정해 줌으로써 다른 구체 클래스에 의존하는 코드를 제거하며 서로 다른 두 객체의 결합을 약하게 만들어 주었다. 또한 이러한 방법은 상속보다 훨씬 유연하다. 단, 여기서 주의해야 하는 것은 다른 빈을 주입받으려면 자기 자신이 반드시 컨테이너의 빈이여야 한다는 것이다.
애플리케이션 실행 시점에 필요한 객체(빈)를 생성해야 하며, 의존성이 있는 두 객체를 연결하기 위해 한 객체를 다른 객체로 주입시켜야 하기 때문이다.

따라서 이러한 의존관계 주입으로 인해 모듈 간의 결합도가 낮아지고 유연성이 높아진다.

참고
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
망나니개발자

profile
take the bull by the horns

0개의 댓글