의존 관계란 무엇일까.
A의 기능이 추가되거나 형식이 바뀌는 것이 B에 영향을 끼친다면 A와 B가 의존 관계에 있다고 할 수 있음
class Cook {
private Recipe recipe;
public Cook(){
recipe = new Recipe();
}
}
Recipe 내용이 바뀌면 Cook이 실행하는 내용도 바뀜
의존관계를 인터페이스로 추상화하면 더 다양한 의존관계를 맺게 하여 클래스 간의 결합도를 낮출 수 있음
[TypeScript] 인터페이스와 덕 타이핑(Interface & Duck Typing)
의존관계를 외부에서 결정하고 주입하는 것
자동 주입 기능을 사용하면 의존 객체를 명시하지 않아도 스프링이 필요한 객체를 찾아서 주입해 줌
다음과 같은 조건을 충족해야 함
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않으므로 인터페이스만 의존해야 함
- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정함
- 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 주입해줌으로써 만들어짐
런타임 시점의 의존관계를 외부에서 주입하기
이 경우 개발자가 직접 new를 해주지 않아도 됨
코드의 종속을 줄일 수 있음
But, spring이 발전하면서 객체 설정이 많아지는 것을 방지하기 위해 새로운 방식을 만들어냄
...
@Component
public class Apple {
int width;
public Apple(){
width = 100;
}
public int getWidth(){
return width;
}
}
...
@Controller
public class AppleController {
@Autowired
Apple apple;
@RequestMapping("/home/apple")
@ResponseBody
public String showApple(){
return "width of apple : " + apple.getWidth();
}
}
AppleControler 에서 @Autowired 방식을 사용하여 스프링에게 Apple 객체를 참조하도록 하고, Apple 클래스에서 @Component 를 사용하여 해당 클래스를 스프링이 자동으로 주입하게 하는 것
의존성 주입을 사용함으로써 개발의 생산성을 높일 수 있음
주입된 클래스만 수정해주면 된다는 점에서 유지보수의 측면에서도 효율적