Spring - DI 에 대하여 간단 이해
들어가며
이번포스트에서는 DI - Dependency Injection 에 대해서 알아보겠습니다.
DI 는 의존성 주입으로 객체를 만들 때 객체를 통해 객체를 생성하는 것이아닌
외부에서 객체를 생성해 사용한다는 개념에서 부터 시작합니다.
객체를 사용하는 방법
결국 차이점은 내부에서 만들어 하냐 - 외부에서 만들어서 주입을 받느냐의 차이점입니다.
중요한 점은 왼쪽과 같이 만들게 된다면 A 는 B 와 C 의 기능의 종속되게 되고,
이러면 개발자가 해당 하는 객체에 라이프 사이클을 모두 신경써서 개발 해야합니다.
만약 A에서 B , C 가 문제가 생기거나 수정 사항이 생기면 이를 제어하기 위해 A 객체 자체가 정상적으로 작동하지 않을 것입니다.
예를 들어 객체 A를 결제프로세스 전체 라고 하고, B를 결제 , C를 로깅하는 메서드를 담고 있다고 가정해보겠습니다.
만약 , C가 동작하는 중 장애가 발생하거나 소요시간이 오래 걸리게 되면 정상적으로 결제 자체가 정상적으로 동작하지 않을 것 입니다. - 일반적으로 nonException인 경우 장애가 발생하여도 선제처리가 되어있지 않다면 일단 올라는 가는데 동작이 원활히 되지 않을 것 입니다.
이런 경우를 강한 결합 - 강결합 이라고 표현합니다. b,c에 의해 a가 종속되었다고 이야기할 수 있습니다.
반대로 오른쪽에 경우 문제가 발생하여도 트랜잭션의 전파가 잘 처리되어 있다면 결제 자체는 정상적으로 작동하게 될 것입니다.
이렇게 의존성을 줄일 수 있는데 이것을 약결합이라고 부릅니다.
Spring이 관리해주는 약결합
이런식으로 관리가 되어서 라이프 사이클을 직접 관리하지 않아도 되게 됩니다.
그래서 이런식으로 코드를 작성하게 되는 것 입니다.
1
private final PostReposioty postRepository = new PostRepository();
이런 식으로 만드는 것이 아니라
1
private final PostReposioty postRepository
이렇게 주입 받아 만드는 것을 DI라고 하는데 이때 우리가 자주 보는 생성자를 통해 의존성을 주입하여 사용하게 됩니다.
1
2
3
public PostService(PostRepository postRepository){
this.postRepository = postRepository;
}
변경사항이 있는 경우에는 강한 결합으로 작성 된 코드의 문제점이 발생되어 컴파일러에서 에러를 내줍니다.