본문 바로가기

Spring/Dependency Injection

[Spring Framework] 느슨한 결합력과 인터페이스

728x90
반응형

'뉴렉처' 님의 채널(www.youtube.com/user/newlec1)을 바탕으로 제작한 블로그 글입니다:)

 

 

이번 시간에는 느슨한 결합력과 인터페이스에 대해서 알아보도록 하겠습니다.

 

 

먼저 아래와 같은 구조를 가진 어플리케이션이 있다고 가정해봅시다.

 

 

우선 Service Layer는 사용자의 요구에 맞는 서비스를 제공하기 위한 계층입니다. 내부적인 부분이나 구현 기술에 대한 것들은 숨긴 채로, 데이터를 받아 그것을 어떻게 사용자에게 줄지 구현하기 위한 부분입니다.

 

Dao Layer는 서비스가 업무 로직에 필요한 데이터를 요청하면 그에 알맞은 데이터를 제공하는 부분입니다.

Data Access Object의 약어로, 실질적으로 DB에 접근하는 부분이라고 볼 수 있습니다.

 

 

 

 

우리는 프로그램을 만드는 순간부터, 늘 이 프로그램을 수정한다는 것을 염두에 두어야합니다.

그러면 위의 구조를 가진 어플리케이션의 Dao 부분을 수정하고자 한다면 어떻게 해야할까요?

서비스의 일부분 변경 등의 이유로 B1의 일부분을 바꿔야 한다고 가정해봅시다.

 

 

우선 크게 두 가지 방법을 떠올릴 수 있습니다.

 

첫째, 기존의 B1 코드 일부분을 수정한다 (코드 변경)

둘째, B2라는 새로운 코드를 만들고 B1을 대체한다 (덮어쓰기, 코드 추가)

 

 

두번째 방법을 사용하게 되면, 코드를 변경하지 않고 새로운 코드를 추가하는 것이기 때문에 재배포를 하지 않아도 된다는 이점을 얻게 됩니다.

 

 

하지만 두번째 방법을 사용하기 위해서는 Dao에 B2라는 코드를 추가하는 것 뿐만 아니라

Service의 코드로 수정해야는 일이 생기게 됩니다.

바로 아래처럼 말이죠.

 

private B1 b = new B1();
=> private B2 b = new B2();

 

그러면 코드를 수정하지 않고 추가했기 때문에 재배포를 하지 않아도 된다는 이점때문에 두번째 방법을 택했지만,

결국 Serivce의 코드를 변경함으로써 다시 재배포를 하게 되는 일이 생기고 맙니다.

 

 

이런것이 바로 '결합력'입니다.

즉, 내가 Dao Layer측에서 무언가를 바꾸고자 할 때 Service Layer또한 변경해야하는 경우가 바로 결합력이 높은 경우라고 할 수 있는 것입니다.

 

 

 

따라서 우리는 최대한 Dao에는 코드 추가를 하되, Service측의 코드는 수정하지 않는 아래와 같은 방식을 생각해내게 됩니다.

 

Dao가 변경된 것이지 Service 자체가 변경된 것이 아니기 때문에, 위처럼 interface를 사용하여 하나의 class로 객체를 받는 방식으로 구현할 수 있습니다.

그렇다면 코드는 아래와 같은 방식으로 변경할 수 있습니다.

 

private B b = new B1();
=> private B b = new B2();

 

 

위와 같이 참조형 부분은 하나의 class로 받음으로써 결합력을 일차적으로 낮춰줍니다.

하지만 그래도 오른쪽 부분은 여전히 B1, B2로 남아있게 됩니다.

따라서 우리는 Service에서 Service와 Dao를 연결해주지 않고, 아래의 소스코드와 같이 UI측에서 Service와 Dao를 결합해주게 됩니다. (Service의 소스코드를 우리가 받을 필요가 없도록 하기 위함)

 

 

private B b = new B1();
service.setB(b);

 

 

이 때, 위의 B1()부분의 객체 생성을 B2()로 변경할 때에 소스 코드를 이용해 변경하지 않고 외부 파일이나 설정에 의해 변경할 수 있도록 합니다.

즉, 객체 생성과 조립을 위한 외부 설정을 구현해 놓고 B1() 부분을 외부 파일 또는 설정(XML, Annotation)에 의해서 변경될 수 있도록 들어내는 것입니다.

 

 

 

이러한 방식으로 만들어진 구조가 바로 '느슨한 결합력'을 가진 구조라고 할 수 있습니다.

바로 Spring Framework가 이러한 느슨한 결합력을 위한 외부 파일 및 설정을 제공하고 객체를 결합해주는 역할을 하게 됩니다.

728x90
반응형