프로그래밍 언어/Python

파이썬(PYTHON) 클린코드 #9_ SOLID, 인터페이스 분리 원칙(ISP)

Tigercow.Door 2020. 11. 4. 23:47
728x90


안녕하세요. 문범우입니다.

이번 포스팅에서는 SOLID 원칙 중, 인터페이스 분리 원칙(ISP)에 대해서 알아보도록 하겠습니다.



1. ISP(Interface Segregation Principle)


인터페이스 분리 원칙(ISP)은, 클라이언트가 자신이 이용하지 않는 메소드에 의존하면 안된다라는 원칙이다.

다른 방향으로 해석해보자면, 하나의 인터페이스는그 책임에 맞는 메소드만 가지고 있어야 한다는 의미이다. 책임이라는 용어, 매우 익숙할 것이라고 생각한다.


SOLID에 대해서 알아보며 첫번째로 다루었던 SRP원칙과 매우 유사하게 느껴질 것이다. 물론 SOLID 원칙 모두가 상호 연관 관계가 있고, 좋은 코드를 목표로 하고 있기 때문에 더욱 그렇게 느껴질 수 있다.

이번에 다뤄볼 ISP와 이전에 학습한 SRP의 차이점을 생각해본다면, ISP는 보다 직접적으로 인터페이스에 대해서 이야기하고 있는 것이다. 


인터페이스가 다양한 책임을 가지고 있거나, 자신의 책임과 걸맞지 않는 메서드를 가지고 있게되면, 해당 인터페이스를 구현하는 클래스 모두에게 영향을 미치게 된다.

아래와 같은 코드를 살펴보자.


1
2
3
4
5
6
7
8
9
10
11
12
# ISP를 지키지 못한 예제
from abc import *
 
class EventParser(metaclass=ABCMeta):
    """Interface: EventParser class"""
    @abstractmethod
    def from_json(self, event_data):
        pass
    
    @abstractmethod
    def from_xml(self, event_data):
        pass    
cs

code: https://github.com/doorBW/python_clean_code


위 코드에서 사용한 abc라이브러리를 통해 EventParser 인터페이스를 구현하였다.

EventParser 내부에 정의된 2개의 추상메서드를 살펴보자. fron_json()과 from_xml()이 모두 정의되어있다. 그렇다면 해당 EventParser를 구현하는 클래스는 json, xml 필요한 것만 구현하는 것이 아니라, 처리하는 데이터와 무관하게 두가지 함수를 모두 구현해야 한다.

즉, 자신이 이용하지 않는 메서드에 의존하게 되는 것이다.


이러한 것이 ISP원칙을 위반한 사례라고 볼 수 있다.

이를 해결하려면 어떻게 할까? 간단하게 생각해서, 그 책임을 분할시켜주면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ISP를 적용한 예제
from abc import *
 
class JsonEventParser(metaclass=ABCMeta):
    """Interface: JsonEventParser class"""
    @abstractmethod
    def from_json(self, event_data):
        pass    
    
class XmlEventParser(metaclass=ABCMeta):
    """Interface: XmlEventParser class"""
    @abstractmethod
    def from_xml(self, event_data):
        pass    
cs

code: https://github.com/doorBW/python_clean_code


위의 코드는 기존의 EventParser를 분리하여 JsonEventParser와 XmlEventParser로 분리하였다. 이렇게 인터페이스를 분리함에 따라서, 인터페이스를 구현하는 클래스가 자신이 이용하지 않는 메서드에 의존하게 되는 문제를 해결한 것이다.


하지만, 위와 같이 고려하다보면 "하나의 인터페이스는 하나의 메서드만 가져야하는 것일까?" 라는 생각에 부딪힐 수 있다. 

물론 그렇지 않다.

앞에서의 예제들은 설명을 위해 간략하게 작성한 예제라서 그렇지만, 결국 말하고자 하는 것은 하나의 인터페이스에서 하나의 일만 해야한다는 것이다.

하나의 메서드만 있어야 한다는 것이 아니라, 하나의 일을 담당해야 한다는 것은 동일한 맥락의 책임이라면 이를 처리하기 위해 여러개의 메서드가 존재할 수 있다는 것이다.


예를 들어, XmlEventParser 클래스에서 비즈니스 로직과, 데이터 검토 결과 동일한 데이터 전처리가 필요하다고 판단되면 해당 메서드를 추가할 수 있는 것이다.


이는 ISP 뿐만 아니라 모든 SOLID원칙에도 적용된다. 

SOLID 원칙은 기본적인 것을 이야기 할 뿐이지, SOLID 원칙에서 언급되는 예제에 대해서는 실제 업무와 환경, 비즈니스 로직, 다양한 변수들에 의해 조금씩은 다르게 구현될 수 있다.