Java/Spring

[Spring] 01. DI / IoC 강결합 약결합

담크 2021. 6. 9. 23:27

오늘은 DI / IoC 중에 DI에서의 강결합약결합의 뜻과 함께 실제 사용하는 코드를 작성해서 비교해보려고 합니다.

 

 

그 전에 잠깐 앞서 저번 포스팅에 <dependencies> 안에 가져온 spring-core, spirng-context에 대해 간단히 설명하자면

현재 스프링구성입니다.

그림에서 보는것과 같이 스프링 구성으로 되어있는데, 이 모듈들을 가져와서 스프링 프레임워크를 가져다 쓰겠다! 하는 의미로 가져와서 사용하는것이라고 알고계시면 됩니다 앞으로 많이 쓰게될거에요 ㅎㅎㅎ

 

 

 

자 이제 그럼 다시 본문으로 와서 실습을 위해 Eclipse를 켜고 Spring_Hello라는 자바 패키지를 만든 후 저번과 동일하게 설정을 마쳐주겠습니다 (당연히 pom.xml에 <dependencies>에 core, context를  추가해줘야겠죠? ㅎㅎ)

설정을 다 마쳤다면 Spring_Hello를 열어 src라는 폴더에 com.test01이라는 패키지를 하나 만들고 패키지 안에 MessageBean, MTest라는 클래스를 하나씩 더 만들어 줍니다.

다 만드셨다면 이렇게 나올겁니다.

MessageBean.java

package com.test01;

public class MessageBean {
	
	public void hello(String name) {
		System.out.println("Hello, " + name);
	}

}

MTest.java

package com.test01;

public class MTest {
	
	public static void main(String[] args) {
		MessageBean bean = new MessageBean();
		bean.hello("Spring");
	}

}

이렇게 입력하고 결과값을 보면

이런 결과값이 나오는 것을 알 수 있습니다.

그렇다면 여기서 MessageBean이 바뀐다면 MTest의 결과는 어떻게 될까요??

MessageBean의 Hello를 안녕으로 바꿔보면

이렇게 결과값이 바로 바뀌어서 출력됩니다. 이 같이 MessageBean가 바뀜에 따라 MTest의 출력결과가 바로 달라지게 되는 이런것을 강결합이라고 합니다.

 

그럼 다음 예제를 한번 살펴보겠습니다.

이번엔 com.test02라는 패키지를 하나 더 만들어 그 안에 Interface인 MessageBean과 MessageBeanKo, MessageBeanEn, MTest 이렇게 4개의 클래스를 만들어 줍니다.

MessageBean.java (Interface)

package com.test02;

public interface MessageBean {
	
	public void hello(String name);

}

MessageBeanKo.java

package com.test02;

public class MessageBeanKo implements MessageBean {

	@Override
	public void hello(String name) {
		System.out.println("안녕하세요, " + name);
		
	}
}

MessageBeanEn.java

package com.test02;

public class MessageBeanEn implements MessageBean {

	@Override
	public void hello(String name) {
		System.out.println("Hello, " + name);
		
	}
}

MTest.java

package com.test02;

public class MTest {
	
	public static void main(String[] args) {
		MessageBean korean = new MessageBeanKo();
		korean.hello("스프링");
		
		MessageBean english = new MessageBeanEn();
		english.hello("Spring");
	}
}

 

이렇게 작성된 코드를 실행시켜보면  

이러한 결과값을 가지게 됩니다.

그렇다면 여기서 MessageBeanKo의 값을 바꾼다고 MessageBeanEn의 출력결과도 바뀔까요?? 위와 같이 바꿔보면

이렇게 나옵니다. Ko의 결과값은 바꼈지만 En의 결과값은 바뀌지않았죠 이렇게 Class와 Class사이에 Interface가 들어가서 서로 영향을 많이 주고 받지 않는 결합을 약결합이라고 합니다.

 

 

간단히 정리해본다면

  • 강결합 : 객체 간 결합도가 강한 프로그램
  • 약결합 : 인터페이스를 이용하여 객체간 결합도를 낮춰 수정이나 확장을 좀더 용이하게 해주는 프로그램

 

 

 

** 왜 Interface가 중간에 들어갔나

Interface '변수' = new Class( ) => 이걸 생각해본다면 다형성에 속하는데 다형성을 통해서 결합도가 낮아진다 라고 생각하시면 됩니다.