한 객체가 사용하는 의존 객체를 직접 만들지 않고 주입 받아 사용하는 방법
의존성 주입을 받지 않은 경우
public class Toy {
private Battery battery;
public Toy() {
Battery battery = new Battery();
this.battery = battery;
}
}
Toy라는 클래스는 Battery 클래스를 강하게 의존하고 있다.
의존성 주입을 받은 경우
<java code>
public class Toy {
private Battery battery;
public Toy(Battery battery) {
this.battery = battery;
}
}
<spring code>
public class Toy {
@Autowired
private Battery battery;
}
@Component
public class Battery {
...
}
Toy 클래스는 이제 직접 객체생성을 하지 않고 외부에서 객체를 주입받는다
@RequiredArgsConstructor를 이용한 생성자 주입
// 서비스 클래스
@Service
@RequiredArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
public void doSomething() {
orderRepository.doSomething();
}
}
// 레포지토리 클래스
@Repository
public class OrderRepository {
public void doSomething() {
System.out.println("this is Repository");
}
}
// 테스트 클래스
@SpringBootTest
public class DiTest {
@Autowired
private OrderService orderService2;
@Test
public void test() {
OrderRepository orderRepository = new OrderRepository();
OrderService orderService = new OrderService(orderRepository);
orderService.doSomething();
}
@Test
public void test2() {
orderService2.doSomething();
}
}
결과
모든 제어 권한은 자신이 아닌 다른 대상(Spring)에게 위임하는 것이다.
객체는 자신이 사용 할 객체를 스스로 생성하지 않으며, 그것이 어디서 만들어 지는지 알 수 없다. 모든 제어 권한은 자신이 아닌 다른 대상에게 위임하여 객체 간의 결합도를 낮추며 코드의 유연성을 높힌다