[asp.net] 느슨하게 결한된 구성요소 작성
느슨하게 결한된 구성요소 작성하기.
MVC 패턴의 가장 중요한 특징 중 하나는 관심사의 분리가 가능하다는 점이다.
응용프로그램의 각 구성 요소들은 최대한 독립성을 유지하고 제어가 가능한 수준에서 최소한 상호의존성을 가지는 게 좋다.
이상적인 상황에서 각각의 구성요소는 다른 구성요소들에 관해서 전혀 알지 못한 채, 오직 추상 인터페이스만을 통해서 응용프로그램의 다른 영역들과 연계되어야 한다. 이런 상태를 느슨한 결합(Loose Coupling)이라 하며 앱의 테스트와 수정을 쉽게 만들어줌.
ex)
전자 메일 메세지를 전송하기
email 전송을 위한 MyEmailController 구성요소 작성, 메일 전송에 필요한 모든 public 함수들을 정의하는 IEmailSender라는 이름의 인터페이스를 구현한다고 가정할 때..
'전자메일을 발송해야 하는 응용프로그램 내의 다른 모든 구성 요소들', 예시로 PasswordResetHelper라는 이름의 비밀번호 초기화 헬퍼 클래스는 이 인터페이스의 메서들들을 이용해서만 전자메일을 전송할 수 있다.
이 경우 PasswordResetHelper 클래스와 MyEmailController클래스 간에 직접적인 의존성은 존재하지 않는다.
PasswordResetHelper -> IEmailSender -> MyEmailController
(인터페이스를 이용해서 구성요소 분리하기)
이렇게 IEmailSender 인터페이스를 도입함으로서 PasswordResetHelper 클래스와 MyEmailController 클래스 간에 직접적인 의존성이 존재하지 않도록 보장할 수 있게 됐다.
그 결과 PasswordResetHelper 클래스를 전혀 변경하지 않고도, MyEmailController 클래스를 다른 전자메일 공급자로 대체한다거나 심지어 테스트를 위해 Mock 구현을 사용할 수도 있게 된다(추후 Mock를 알아볼 것임.)
의존선 주입(Dependency Injection) 사용하기
그러나 인터페이스를 이용해서 구성요소를 분리할 수는 있지만 문제점은 남아있다.
C#은 new 키워드로 실제 구성요소의 인스턴스를 생성하는 방법 외에는 손쉽게 인터페이스의 구현 개체를 생성할 수 있는 다른 기본적인 방법을 제공해주지 않는다.