반응형
1. 의존성 주입
의존성 주입이란?
클래스간 의존성을 클래스 외부에서 주입하는 것을 뜻함
인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입
(인터페이스를 사이에 둬 느슨한결합[결합도를 낮춤] + 클래스의 인스턴스를 외부에서 생성하여 주입)
★클래스간 의존성이란?
클래스간에 의존 관계를 가지고 있다는 뜻 -> 한 클래스가 바뀔 때 다른 클래스가 영향을 받는다.
new 키워들를 통해 객체를 생성할 때 의존성을 갖는다.
강한 결합 VS 느슨한 결합
- 강한결합 : 객체 내부에서 다른 객체를 생성하는 경우 강한결합을 가지는 구조
강한결합의 경우 객체를 변경할 때마다 Person 객체는 두 부분을 수정해야한다.
1) 필드 와 생성자 부분
2) personDo() 메서드 바디부분
하지만, 단순히 이 예제에서는 2부분만 수정하면 되지만 소스가 길어지는 경우 손봐야할 부분이 더 많아진다!!
class Person {
private Eat eat;
public Person(){
this.eat = new Eat();
}
public void personDo(){
eat.eatting(); //"밥먹기"
}
}
class Eat{
public void eatting() {
System.out.println("밥먹기");
}
}
class Work{
public void working() {
System.out.println("일하기");
}
}
class Person {
private Work work;
public Person(){
this.work = new Work();
}
public void personDo(){
work.working(); //"일하기"
}
}
class Eat{
public void eatting() {
System.out.println("밥먹기");
}
}
class Work{
public void working() {
System.out.println("일하기");
}
}
- 느슨한결합 : 인터페이스(interface)를 사용하여 특정 클래스의 의존성을 줄인 구조
강한결합과 달리 Eat, Work에 따라 Person 클래스에서 변경될 코드는 Person() 생성자의 인스턴스 주입되는 부분 뿐 이다.
Interface를 사용하기 때문에 부가적인부분은 강제되는 doing()을 이용하기 때문에 해당 부분은 변경될 필요가 없다.
package org.example;
interface DoSomething{
void doing();
}
class Person {
private DoSomething doSomething;
public void Person(){
this.doSomething = new Eat();
};
public void PersonDo(){
doSomething.doing();
}
}
class Eat implements DoSomething{
@Override
public void doing() {
System.out.println("밥먹기");
}
}
class Work implements DoSomething{
@Override
public void doing() {
System.out.println("일하기");
}
}
즉, 클래스간 결합도가 느슨한 경우 한 클래스가 변경될 경우 다른 클래스가 변경될 필요성이 적어진다는 뜻!!
의존성 주입
package org.example;
interface DoSomething{
void doing();
}
class Person {
private DoSomething doSomething;
//생성자를 통한 의존성 주입
public void Person(DoSomething doSomething){
this.doSomething = doSomething;
};
public void PersonDo(){
doSomething.doing();
}
}
class Eat implements DoSomething{
@Override
public void doing() {
System.out.println("밥먹기");
}
}
class Work implements DoSomething{
@Override
public void doing() {
System.out.println("일하기");
}
}
2. 의존성 주입 필요성
1) 인터페이스를 통해 강하게 결합된 클래스를 분리하므로 결합도가 약해져 한 클래스가 변경될 경우 다른 클래스의 변경 필요성이 적어진다.
2) 리팩토링의 쉬워진다.
3) 코드가 유연하다.
4) 클래스간 결합도가 약해져 특정 클래스 테스트하기 편해진다.
반응형
'웹개발 > Spring & SpringBoot' 카테고리의 다른 글
REST API - (4) DELETE METHOD 예제 (0) | 2022.10.24 |
---|---|
REST API - (3) PUT METHOD 예제 (0) | 2022.10.23 |
REST API - (2) POST METHOD 예제 (0) | 2022.10.23 |
REST API - (1) GET METHOD 예제 (0) | 2022.10.23 |