주니어인데 코드 리뷰 때 "여기 의존성 주입(DI)으로 빼자"는 말을 자주 들어요. 스프링 쓰면서 @Autowired 같은 건 붙여봤는데 정작 DI가 뭔지, 왜 좋은 건지는 제대로 설명을 못 하겠더라고요.
제가 지금 짜는 코드는 이런 식이에요.
class UserService {
private MySqlRepo repo = new MySqlRepo();
// ...
}
서비스 안에서 new MySqlRepo()로 직접 만들어 쓰는 건데, 이게 문제라고 하시더라고요. 실제로 테스트를 짜려니까 DB가 안 붙어 있으면 이 클래스를 아예 못 돌리겠더라고요. 그래서 리뷰어분이 생성자로 밖에서 넣어주라(생성자 주입)고 하셨고, 추상 타입(인터페이스)을 받게 바꾸면 테스트할 때 가짜(mock) 객체를 끼울 수 있다는 거까진 이해했어요.
정리하면 이득이 결합도가 낮아지고, 테스트가 쉬워지고, 구현 갈아끼우기가 편해진다 이거 맞나요? 그리고 하나 더요. 찾아보니 DIP(의존관계 역전 원칙)라는 SOLID 원칙이 따로 있던데, DI랑 DIP가 같은 말인가요 다른 말인가요? 이 둘이 자꾸 섞여서 나와서 헷갈립니다.