[스프링]3.스프링을 쓰는 이유? 의존성 주입
스프링을 과연 왜 쓸까❓
public class A{
private B b;
public Run(){
b=new B();
}
public void Run(Walk walk){
b.exercise(walk);
}
}
🌈 A 클래스 는 Run() 메소드를 실행 할 때 exercise()를 위해 B 클래스가 필요하다.
이때, A 클래스가 B에 의존성을 갖고 있다(의존한다) 라고 한다.
의존성은 왜 안좋은걸까❓
✏️1.유닛 테스트가 어려움.
내부에서 직접 생성하는 객체에 대해 Mocking을 할 방법이 없다.
따라서 단위테스트를 하기가 까다롭다.
Mocking ❓
: 테스트를 위해 실제 값이 아닌 가짜 값을 만드는 것
상세설명:blog.myungseokang.dev/posts/about-mocking/
Mocking 알아보기 with Python
Mocking with Python
blog.myungseokang.dev
✏️2.코드 변경이 어려움.
A 클래스는 생성자 B 객체를 직접 생성하여 사용중이다.
만약, 나중에 B 라는 클래스가 다른 성질의 Bad B 등으로 바뀐다면
지금처럼 B 클래스에 의존하고 있는 A 클래스도 직접 바꿔줘야 한다.
🌈즉, 객체간의 강한 결합력이 생겨, 소프트웨어 모듈화의 목적인 낮은 결합력 과 높은 응집도에 해가 되는 행위이다.
✔️1.의존성 주입(Dependency Injection)
위와 같은 문제 때문에 의존성 주입이 생겼다.
의존성을 주입하지 않는 경우, 위와 같이 직접 필요한 객체를 생성하는 경우이며 의존성 주입을 하는 경우
다음과 같다.
✏️1.생성자 주입 , 2.세터 주입
public class A{
private B b;
public Run(B b){ //1.첫번째 DI 방법 [Construction Injection]
this.b=b;
}
public void setRun(B b){ //2.두번째 DI 방법 [Setter Injection]
this.b=b;
}
}
이런 경우를 사용하면 왜좋지❓
코드의 수정이 용이하다.
의존성을 주입하지 않는다면, A 클래스의 직접 B 클래스 를 생성하는 부분을 바꿔줘야 한다.
의존성을 주입하는 코드를 변경해주어야 하는것은 같으나, 한 클래스를 수정했을 때 다른 클래스를 수정해야 하는 상황을 방지해 준다.
🌈이 때문에 스프링은 DI 방식을 이용하여 모듈간의 결합도를 낮추어준다.
DI란? IOC Containner 가 개발자 대신 xml 파일에 정의된 대로 Bean 객체를 생성하고 의존성을 대신 주입하는 것을 의미한다.
IOC 란? 제어의 역전, 사용자가 직접 객체를 생성하고 관리하던 것을 스프링의 IOC Containner 가 대신 해준다는 말이다.
DI를 통해 개발자가 해야할 일은 다음과 같다.❗️
✏️1.Bean class 작성
✏️2.주입을 위한 설정(xml 파일 기술 또는 어노테이션 적용)
출처:[galid1.tistory.com/493?category=769011]