목적 : 객체간의 응집도(chohesion)는 높이고, 결합도(coupling)는 낮추는 것
SOLID는 객체지향 프로그램을 구성하는 속성, 메서드, 클래스, 객체, 패키지, 모듈, 라이브러리, 프레임워크, 아키텍처 등 다양한곳에 적용 된다. 막상 SOLID가 적용되었는지 아닌지 애매모호하거나 보는 사람의 관점에 따라 다르게 해석이 될 수 있는 소지가 있다.

객체를 생성하고, 연관관계를 맺어주는 별도의 조립장치 역할
예제)
추상화에 의존하지 않은 경우
예시로 결제수단 서비스를 호출하는 컨트롤러이다. 결제 서비스 호출 시 PaymentController는 ShinhanCardPaymentService에 강하게 의존한다.
동일한 로직의 다른 카드사의 호출이 필요할 경우 아래 코드는 확장성이 떨어지게 된다.
class PaymentController {
@RequestMapping(value = "/dip/anti/payment", method = RequestMethod.POST)
public void pay(@RequestBody ShinhanCardDto.PaymentRequest req){
shinhanCardPaymentService.pay(req);
}
}
class ShinhanCardPaymentService {
public void pay(ShinhanCardDto.PaymentRequest req) {
shinhanCardApi.pay(req);
}
}
컴파일 단계에서는 PaymentController는 CardPaymentService를 바라보지만 런타임에서는 getType으로 얻은 객체 CardPaymentService의 구현체 ShinhanCardPaymentService를 바라보게된다.
class PaymentController {
@RequestMapping(value = "/payment", method = RequestMethod.POST)
public void pay(@RequestBody CardPaymentDto.PaymentRequest req) {
final CardPaymentService cardPaymentService = cardPaymentFactory.getType(req.getType());
cardPaymentService.pay(req);
}
}
public interface CardPaymentService {
void pay(CardPaymentDto.PaymentRequest req);
}
public class ShinhanCardPaymentService implements CardPaymentService {
@Override
public void pay(CardPaymentDto.PaymentRequest req) {
shinhanCardApi.pay(req);
}
}
참고
좋은 글 감사합니다!