DI는 각자의 계층이나 서비스들 간에 의존성이 존재할 경우 스프링컨터에너로부터 주입받아 서로 연결시킵니다.
의존성을 낮출 수 있게 되고 즉, 결합도를 낮추게 되는 장점이 생깁니다.
DI를 하는 방식
Field Injection(필드 주입)
코드가 간결하고 편하지만 의존관계를 정확히 파악하기 힘듦.
필드 주입 시 final 키워드를 선언할 수 없어 객체가 변할 수 있음.
주입이 동시에 일어나 겹치는 경우 순환참조 에러가 남.public class Controller{ @Autowired private Service service; }
Setter Injection(수정자 주입)
setter 혹은 사용자정의 메서드를 통해 의존관계 주입.
setter의 경우 객체가 변경될 필요성이 있을 때만 사용한다.(주입하는객체를 변경하는 경우는 드물다)public class Controller{ private Service service; @Autowired public setService(Service service){ this.service = service; } }
Constructor Injection(생성자 주입) (*추천)
1.객체 불변성 확보
2. 테스트 용이
3. 순환참조 에러방지
생성자에 @Autowired를 붙여 의존성을 주입받을 수 있음.
Spring 4.3이후로는 클래스 내 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면 @Autowired 생략 가능.
생성자 주입은 인스턴스 생성시 1회 호출되는 것이 보장되기 때문에, 주입받은 객체가 변하지 않거나, 반드시 객체주입이 필요한 경우 강제하기 위해 사용됨.public class Controller{ private Service service; @Autowired public Controller(Service service){ this.service = service; } }
코드의 재사용성, 유연성이 높아진다.
하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.
객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다.
유지보수가 쉬우며 테스트가 용이해진다.
확장성을 가진다.