본문 바로가기

Java/Spring

의존성 주입 - 강한결합

Spring의 의존성 주입이란 스프링 컨테이너가 객체간에 의존성을 부여하는것을 의미한다.

DI (Dependency Injection)" 혹은 한국말로 "의존성 주입"이라고 부른다.

강한결합

의존성 주입이 되지 않은 '강한 결합'의 예시와 문제는 다음과 같다.

 

1.컵에 물이 담긴다는 의미로 객체 'Cup'과 'Water'를 생성하여 사용한다.

Water.java

public class Water{ ... }

Cup.java

public class Cup{
	private final Water water;

	public Cup() {
		this.water = new Water();
	}
}

이때, Cup에는 새로 water을 생성하여 사용해주었다.

 

2.Water객체에 식용인지 아닌지 구분하기 위해서 생성자에 division을 추가한다.

public class Water {
    String division;
    public Water(String division) {
        this.division = division;
    }
}

이럴경우 문제가 무엇일까?

Water의 생성자 변경에 의해 Water를 생성해 놓은 Cup의 Water도 변경해주어야 한다.

만약 이 Cup을 가져다가 같은 방식으로 생성한 Human이라는 클래스가 있다고 하면, Human클래스의 Cup도 변경해 주어야 한다.

 

강한 결합의 해결

그렇다면 강한결합은 어떻게 해결해야 할까?

1. 각 객체에 대한 객체 생성은 1번만 한다.

2. 그렇게 생성된 객체를 모든 곳에서 재사용한다.

 

1. 각 객체에 대한 객체 생성은 1번만 한다.

Water.java

public class Water {
    Water water = new Water();
}

2. 그렇게 생성된 객체를 모든 곳에서 재사용한다.

Cup.java

public class Cup {
    private final Water water;

    public Cup(Water water) {
        //this.water = new Water();
        this.water = water;
    }
    Cup cup = new Cup(water);
}

 

3.만약 Water가 변경된다면..

public class Water {
    String division = "??"; //객체생성
    public Water(String division) {
        this.division = division;
    }
    Water water = new Water(division);
}

값은 아무거나 대충 임의로 넣었다.

어쨌든 이렇게 생성을 한다면 Water가 변경되어도 연관된 다른 클래스를 변경할 필요가 없어진다.

이를 느슨한 결합 이라고 한다.

 

제어의 역전 (IoC: Inversion of Control)

프로그램의 제어 흐름이 뒤바뀐다는 뜻이다.

일반적으로는 강한 결합의 예시처럼 사용자가 자신이 필요한 객체를 생성해서 사용한다.

IoC (제어의 역전)은 용도에 맞게 필요한 객체를 그냥 가져다 사용하고,사용할 객체가 어떻게 만들어졌는지 알 필요가 없다.

 

'Java > Spring' 카테고리의 다른 글

Transaction  (0) 2022.12.28
JWT  (0) 2022.12.15
인증과 인가  (0) 2022.12.14
의존성 주입 - 스프링 IoC컨테이너  (0) 2022.12.13
영속성 컨텍스트  (0) 2022.12.12