IoC/DI loose_coupling

가수왕·2022년 12월 10일
0

Spring

목록 보기
3/4

0. 개요

이전 포스팅에서 IoC의 특징으로 객체간 느슨한 결합 (loose_coupling)을 말했다. 그렇다면 여기서 말하는 느슨한 결합은 무엇이며 느슨한 결합의 장점이 무엇이길래 IoC의 특징으로 말하는 것인지 알아보려 한다.

1. 결합

객체간 결합이란 무엇을 말하는 걸까?
내가 이해한걸 간단히 표현하면 객체가 수정될때 다른 객체에 영향을 얼마나 미치는가 이다.
조금 더 일반화해서 표현하면
A클래스를 사용하는 B클래스가 있다. 이 때 A클래스를 수정했을 때 B클래스의 코드가 얼마나 바뀌어야하는가이다.

결합은 느슨한 결합(loose_coupling)과 강한 결합(Tight_coupling)이 있다.

ClassA{
	public void eatBread(){
    	System.out.println("eat Bread");
    }
}
ClassC{
	public void eatRice(){
    	System.out.println("eat Rice");
    }
}
ClassB{
	public void method{
		ClassA obj = new ClassA();
        obj.eatBread();
        
        //ClassC obj = new ClassC();
        //obj.eatRice();
    }
}

위 코드에서 ClassB에서 A가 아닌 C객체를 사용하려면 객체 선언부터 메소드 사용까지 코드를 수정해야 한다. 하지만 결합이 느슨해지면 다음과 같아진다.

Interface InterfaceA{
	public void eat();
}
Class ClassA implements InterfaceA{
	@Override
	public void eat(){
    	System.out.println("eat Bread");
    }
}
Class ClassC implements InterfaceA{
	@Override
	public void eat(){
    	System.out.println("eat Rice");
    }
}
Class ClassB{
	public void method{
		InterfaceA obj = new ClassA();
        //obj = new ClassC();
        obj.eat();
    }
}

느슨한 결합이면 A클래스가 수정되어도 B클래스에서 수정할 코드가 많지 않다.
느슨한 결합이어도 B클래스 코드를 수정하는 건 같은데 왜 느슨한 결합이 더 좋은 것처럼 말한걸까?
지금은 A클래스를 사용하는게 B클래스 하나라고 생각하지만 A클래스를 사용하는게 더 많아진다면? 100개가 된다면 어떤 일이 벌어지게 될까?
이렇게 생각하면 느슨한 결합이 유지보수 측면에서 훨씬 유리하단 것을 알 수 있다.

2. 느슨한 결합 - Factory(+ Assembler)

느슨한 결합을 이루는 방법은 위에서 설명한 Interface뿐만 아니라 Factory를 사용하는 방법도 있다.

  • Factory가 구현 클래스를 생성하기 때문에 클래스는 팩토리를 호출한다.
  • 인터페이스 변경시 팩토리만 수정하면 되고 호출 클래스에는 영향을 미치지 않는다.

    하지만 이 방법도 결국 Factory에 의존하게 된다. 그래서 Assembler를 이용해 결합도를 낮추는 방법이 있다.

    RuntTime시 클래스 간 관계가 형성 된다.
    각 Service의 LifeCycle을 관리하는 Assembler를 사용한다.
    Spring Container가 Assembler의 역할을 한다.

0개의 댓글