![[Spring] 의존성 주입(DI) 알아보기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0oZ7a%2Fbtr02zH1Ph4%2Ff6cLoSoZPPF2EwK9Orinw1%2Fimg.png)
의존성 주입(DI)이란?
의존성 주입(Dependency Injection)은 객체 간의 의존관계를 스프링 컨테이너가 개발자가 정의한 Bean 등록 정보를 바탕으로 자동으로 주입해 주는 기능이다.
Q. 의존관계란 무엇인가?
A. 의존관계는 쉽게 말하면 의존 대상 B가 변하면, 그것이 A에 영향을 미치는 관계를 말합니다.
예를 들어 자동차 공장 직원은 자동차 제작 과정에 의존한다. 제작 과정이 변경된다면, 공장 직원은 바뀐 새로운 방법으로 자동차를 만들어야 한다. 제작 과정의 변화가 공장 직원의 행위에 영향을 미쳤기 때문에 "공장 직원은 제작 과정에 의존한다"라고 할 수 있다.
이를 코드로 보면 다음과 같다.
public class FactoryWorker{
private SonataMakingProcess sonataMakingProcess;
public FactoryWorker(){
sonataMakingProcess = new SonataMakingProcess();
}
}
이 경우 만약 자동차 제작 과정이 AvanteMakingProcess로 바뀐다면, FactoryWorker 클래스의 생성자를 변경해야 한다. 이와 같이 제작 과정이 바뀔 때마다 생성자를 변경해야 하기에 유연성이 떨어진다.
다른 차 제작 과정을 의존 받을 수 있게 의존성 주입을 이용해 해결하면 다음과 같다.
public interface CarMakingProcess{
...
}
public class AvanteMakingProcess implements CarMakingProcess{
...
}
public class FactoryWorker{
private CarMakingProcess carMakingProcess;
public FactoryWorker(CarMakingProcess carMakingProcess){
this.carMakingProcess = carMakingProcess;
}
}
만약, 어떤 자동차 제작 과정을 사용할지를 공장주가 정한다고 하면, FactoryWorker가 의존하는 CarMakingProcess를 외부(공장주)에서 결정하고 주입하는 것이다.
스프링 DI 컨테이너(공장주)가 애플리케이션 실행 시점에 필요한 객체를 생성하여 FactoryWorker 클래스에 주입해 주는 역할을 한다.
의존성 주입(DI)의 종류
- 필드 주입(Field Injection)
필드 주입은 코드가 간결하지만 외부에서 접근이 불가능하다는 단점이 있다. 외부에서 수정할 수 없어 코드를 테스트하는데 어려움이 있다. 그렇기에 요즘은 거의 사용을 안 하는 추세이다.
@Service
public class MemberService {
@Autowired
private MemberRepository memberRepository;
}
@Service: 스프링에서 서비스를 지정하는 어노테이션. @Component와 거의 차이가 없지만 비즈니스 로직을 수행하는 서비스 레이어 클래스임을 나타낸다.
@Autowired: 해당 변수 및 메서드에 스프링이 관리하는 Bean을 자동으로 매핑해주는 개념이다.
- 수정자 주입(Setter Injection)
수정자 주입은 객체가 변경될 가능성이 있는 경우에 사용하는 것이 좋다.
@Service
public class MemberService {
private MemberRepository memberRepository;
@Autowired
public void setMemberRepository(final MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
- 생성자 주입(Constructor Injection)
스프링 프레임워크에서 가장 권장되는 방식으로 생성자로 객체를 생성하는 시점에 필요한 빈을 주입한다. 테스트 코드를 작성하는데 용이하고, 생성자 호출 시점에 1회 호출되는 것이 보장되기에 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우에 강제하기 위해 사용할 수 있다.
@Service
public class MemberService {
private MemberRepository memberRepository;
@Autowired
public MemberService(final MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
의존성 주입 장점
- 주입받는 대상이 변하더라도 그 구현 자체를 수정할 일이 없거나 줄어든다.
- 재사용성이 높은 코드가 된다.
- 테스트하기 좋은 코드가 된다.
- 가독성이 높아진다.
참고자료
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/
의존관계 주입(Dependency Injection) 쉽게 이해하기
이번 글에서는 DI(의존성 주입, 의존관계 주입)의 개념을 설명한다.
tecoble.techcourse.co.kr
https://code-lab1.tistory.com/122
[Spring] 의존관계 주입(Dependency Injection), 의존성 주입, DI란?
의존관계(Dependency)란? 의존관계 주입(Dependency Injection)에 대하여 알아보기 전에 의존관계가 무엇인지 알아야 한다. 의존관계는 의존 대상 B가 변하면, 그것이 A에 영향을 미칠 때 A는 B와 의존관계
code-lab1.tistory.com
'Spring' 카테고리의 다른 글
[Spring] Cascade옵션 알아보기 (0) | 2023.03.15 |
---|---|
[Spring] Bean Validation 알아보기 (1) | 2023.03.09 |
[Spring] DTO를 사용하는 이유를 알아보자 (0) | 2023.03.04 |
[Spring] JPA 연관관계 매핑 알아보기 (0) | 2023.02.23 |
[Spring] 프로젝트 생성 및 환경 세팅 (0) | 2023.02.22 |
느리더라도 단단하게 성장하고자 합니다!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!