객체를 사용하는 두가지 방법이 있다.
객체지향 프로그램에서 다른 객체를 사용하는 것을 다르게 표현하면 다른 객체에 의존한다고 표현한다.
다른 객체를 사용하기 위해서는 객체를 생성하거나, 생성되어 있어야 하는데, 내가 직접 생성하여 사용할 수 도있고, 미리 만들어져 있는 것을 할당 받아서 사용할 수 도 있다.
그림을 보면 A는 갑이고, B C는 을인 관계이다. A가 B, C의 기능이 필요하면 직접 만들고 B,C의 기능을 사용한다. 여기서 A는 B,C기능을 사용한다고 볼 수도있지만, B,C기능에 의존한다고 볼 수도있다.
여기서는 A가 을이고, B,C를 가지고 있는 누군가가 갑이다. 을인 A가 B,C의 기능이 필요해 갑에게 요청하면 갑이 A에게 B,C의 기능을 주입시켜주는 구조이다.
여기서 객체를 생성하고, 라이프 사이클을 관리하고 다른 필요한 객체의 의존 주입을 관리해주는 누군가를 컨테이너라고 부르는데, 스프링이 이런 컨테이너 역할을 해준다.
객체 간의 의존 관계에서 직접 생성하면 생성부터 메모리 관리를 위한 소멸까지 해당 객체의 라이프 스타일을 개발자가 관리해야하므로 강한 결합이고, 이미 누군가가 생성한 객체를 주입 받으면 사용만 하기 되기 때문에 약한 결합이 된다.
서비스가 생성될 때마다 repository도 생성하면 엄청 많아지는데,
객체를 계속 생성하지말고, 한개를 생성해두면 닳지도 않고 여러명이서 동시에 쓸 수 있다.