1. DI (의존성 주입)의 필요성

위의 사진은 안쪽의 사자와 바깥쪽의 사자가 있고 그 사자를 가두는 평범한 동물원이다. 동물원에 대한 평가는 사자의 상태에 따라 달라지는데 이를 의존성(Dependency)가 있다고 표현한다. 바깥쪽 우리의 사자도 안쪽의 사자가 만약 병이 걸리거나 난폭해지면 피해를 받을 수 가 있기 때문에 바깥쪽의 사자도 안쪽의 사자에게 의존성을 갖고 있다.
만약 위와 같이 의존성을 가진 사자와 동물원이 있을 때 가장 안쪽의 사자에게 병이 걸렸다고 생각해보자. 안쪽의 사자가 병이 걸렸기 때문에 바깥에 있는 사자에게 옮길수도 있고 결국 동물원에 큰 피해를 남길수도 있다. 그렇기 때문에 사육사는 안쪽에 있는 사자를 치료해야 하는데 치료 방법에 따라 안쪽 사자의 우리나 환경이 달라지기 때문에 안쪽사자의 치료를 하면서 바깥쪽의 사자와 동물원에도 변화를 주어야 하는 귀찮은 일이 생길것이다.
2. DI (의존성 주입)이 그래서 뭔데?
위키 피셜로는 의존성 주입이란 객체간의 관계를 단일 책임 원칙을 따를 수 있도록 컨테이너에 의존성을 부여하여 결합도를 낮추는 방법을 뜻하는데 조금 풀어서 설명하자면 필요한 객체를 직접 생성하는것이 아니라 외부로부터 객체를 받아서 사용하는것을 뜻한다. 예시 코드는 다음과 같다.
의존성 주입을 하지 않았을 때
@Service
public class MyService {
private final MyRepository repository;
public MyService(MyRepository repository) {
repository = new MyRepository();
}
//...
}
의존성 주입을 했을 때
@Service
public class MyService {
private final MyRepository repository;
@Autowired
public MyService(MyRepository repository) {
this.repository = repository;
}
//...
}
의존성 주입을 하지 않을시에는 새로운 객체를 생성하여 관리하기 때문에 MyRepsitory의 내용이 변경되었을 시에 코드를 수정해줄 필요가 있다. 하지만 의존성주입을 하면 위와같이 @Autowired 어노테이션를 사용하여 repository를 가져오려고할 때 @Autowired를 통해 repository가 등록된 빈을 찾아주어 자동적으로 @Service 어노테이션이 등록이 되고 스프링 컨테이너에 등록되어 있는 외부 객체를 가져올 수 있게 된다. MyService는 MyRepository의 객체에 대한 책임이 없기 때문에 MyRepository의 코드의 내용이 바뀌어도 따로 수정하거나 관리해줄 필요가 없어진다.
'자바 스프링' 카테고리의 다른 글
| 타임리프 @RequestParm 값 넘겨주기 문제 (0) | 2025.02.08 |
|---|---|
| 자바 스프링으로 크롤링 해보기 (0) | 2024.09.10 |
| IOC 컨테이너(스프링 컨테이너)와 제어의 역전에 대하여 (0) | 2024.05.11 |
| React Session 저장문제 (0) | 2024.01.10 |
| 자바 스프링 구조 (1) | 2024.01.08 |