의존성 주입(DI)

JeongO·2023년 2월 26일
0

🟠 개념

객체가 필요할 때 new생성자를 사용하여 새로운 객체를 만드는 것이 아닌 외부로부터 이미 생성되어 있는 객체를 주입받는 것.

각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것.

🟠 장점

객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다.

객체 간의 의존성을 줄일 수 있다.

코드의 재사용성을 높일 수 있다.

테스트가 용이하다.

🟠 방법

1. 생성자 주입

클래스의 생성자가 하나이고, 그 생성자로 주입받을 객체가 Bean으로 등록되어 있다면 @Autowired를 생략할 수 있다.

2. Field 주입

필드에 @Autowired만 붙여주면 자동으로 의존성 주입이 된다.
사용법이 간단해 가장 쉽게 접할 수 있고, 코드가 간결하다.

단점
외부에서 변경이 힘들다
프레임워크에 의존적이고 객체지향적으로 좋지 않은 코드가 된다

3. Setter 주입

Setter 메서드에 @Autowired 를 붙이는 방법.

단점
set메서드를 public으로 열어두어야 하기 때문에 변경에 취약해진다

🔸 생성자 주입이 권장되는 이유

1. 순환 참조 방지

개발을 하다 보면 여러 컴포넌트들 간에 의존성이 생기고, 이때 A클래스가 B클래스를 참조하고, B클래스는 A클래스를 참조하는 순환참조가 생길 수있다.
이때, 필드 주입과 Setter주입의 경우 bean이 생성된 후에 참조를 하기 때문에 어플리케이션이 아무런 오류나 경고 없이 구동된다 → 실제 코드가 호출될 때까지 문제를 알 수 없다.
하지만 생성자를 통해 주입하고 실행하면 BeanCurrentlyInCreationException 예외가 발생되고 문제를 미리 알 수 있다.
순환참조 문제 뿐 아니라 의존 관계 내용을 외부로 노출 시킴으로써 어플리케이션 실행 시점에 오류를 체크할 수 있다.


2. 불변성
생성자로 의존성을 주입할 경우 final 선언을 할 수 있고, 따라서 런타임에서 의존성을 주입받는 객체가 변할 일이 없다.
Setter주입이나 일반 메서드 주입을 하게 되면 수정의 가능성을 열어두게 되고, 이는 OOP의 5가지 원칙 중 OCP(Open-Closed Principal)를 위반하게 된다.
생성자 주입을 통해 변경의 가능성을 배제하고 불변성을 보장하는 것이 권장된다.
그리고 필드 주입 방식의 경우 null이 생성될 가능성이 있는데, final로 선언한 생성자 주입 방식은 null이 생길 가능성이 없다.

3. 테스트 용이
생성자 주입을 하게 되면 테스트코드를 더 편리하게 작성할 수 있다.
DI의 핵심은 관리되는 클래스가 DI컨테이너에 의존성이 없어야 한다는 것이다. 즉, 독립적으로 인스턴스화가 가능한 POJO(Plain Old Java Object)여야 한다.

⇒ 이와 같은 이유로 생성자 주입 방식이 권장된다.





🐌 참고자료

[Spring] 의존성 주입 3가지 방법 - (생성자 주입, Field 주입, Setter 주입)

[Spring] 의존성 주입(Dependency Injection, DI)이란? 및 Spring이 의존성 주입을 지원하는 이유



⏱️요약

DI는 객체가 필요할 때 new 생성자를 통해 새로운 객체를 만드는 것이 아니라,

이미 만들어져서 스프링컨테이너에 빈으로 보관되어 있는 객체를 필요할 때 주입받아 사용하는 것을 말합니다.

객체간 의존도와 결합도를 낮추어 유연한 코드를 작성할 수 있는 장점이 있습니다.

의존성을 주입하는 방법은 세 가지, 필드주입, 세터주입, 생성자 주입이 있는데 이 중 생성자 주입이 가장 권장되는 방법입니다.

profile
IT'S YOUR VICTORY

0개의 댓글

관련 채용 정보