Template Method Pattern

Jaeuk Ko·2023년 5월 11일
0

최근 네이버 카페 검색 결과 크롤링 프로그램을 개발했다. 나름 머리를 굴려가며 범용성과 확장성을 생각하며 개발을 했지만, 아무래도 구력이 부족하다보니 부족한부분이 많았고 이 부분을 회사 동료가 rebase를 해주었다. Template Method Pattern에 대해 알아보자.

템플릿 메서드 패턴이란

객체지향 디자인 패턴 중 하나, 기능의 뼈대(템플릿)과 실제 구현을 분리하는 패턴이다. 스프링으로 개발할때 몇번 공부했던 기본적인 패턴 중 하나로, 스프링에서는 보통 공통되는 기능에 대해 interface를 만든 뒤, 이를 구현하는 구현 클래스들을 여럿 생성한다. 실제 객체를 생성하는 부분에서는 코드 상 호출은 인터페이스를 호출하지만 실제 생성되는 객체는 여러 구현 클래스 중 필요한 클래스를 기반으로 객체를 생성한다.

상위 클래스와 하위 클래스로 나뉘는데, 이때 하위 클래스는 상위 클래스가 정의한 메서드만을 구현하게된다. 즉 어떤것을 구현하는지는 상위클래스에서 지정된다.

실제 내가 개발했던 코드를 보자.

이런 식으로 구현이 돼있다. 기존의 다른 코드의 모양새를 참고한 부분이고, 아직 네이버 외에는 개발이 안되어 있어서 if 문으로 naver의 경우에만 처리를 하고 다른 포탈의 경우에는 pass 하도록 되어있다.

생각해보면, 다른 포탈이 개발되어 else에 해당 포탈을 추가하게 되면 위의 코드를 똑같이 붙여넣기 해야하고 따라서 코드 중복의 문제가 생긴다. 이 때문에, 아직 개발이 되었든 되지 않았든 동일한 코드만 사용하도록 변경이 필요하다.

다음은 동료가 수정해준 코드이다.

MAPPER를 통해 어떤 포탈인지 가져오도록 하였다. 다른 포탈이 추가가 되면 이 mapper만 수정해주면 되며, 어떤 포탈이든 동일한 코드를 타게 됨으로써 코드의 중복이 확연하게 줄었다.

다음을 보자

NaverSearchingGateway는 KeywordSearchingBaseGateway를 상속한다. 상속을 통해 NaverSearchingGateway 객체가 생성된 곳에서 필요한 경우 KeywordSearchingBaseGateway의 메서드를 갖다 쓰는 방식으로 구현을 했는데.. 잘 보면 NaverSearchingGateway와 KeywordSearchingBaseGateway에 동일한 메서드가 전무하다. 즉 오버라이딩이 일절 되어있지 않다는것.

위에서 말했다시피 템플릿 메서드 패턴은 하위클래스는 상위클래스가 정의한 메서드를 쓰게 함으로써 상위클래스를 상속받는 다른 하위 클래스가 있을 경우 그 "템플릿"을 동일하게 가져가는것을 말하는데, 이것이 전혀 지켜지지 않은 구조라는 것.

수정된 코드를 보자

KeywordSearchingBaseGateway

NaverSearchingGateway

상위 클래스인 KeywordSearchingBaseGateway에서 선언만 되어있는 fetch_keyword_results,_get_header, _get_params 메서드를, 하위 클래스인 NaverSearchingGateway에서 구현을 해주었다.

이를 통해 하위클래스는 상위 클래스가 정의한 메서드를 쓰도록 구현을 해주었으며, 이후 이 상위클래스를 상속받는 하위클래스에서도 반드시 이 메서드들을 구현하도록 강제할 수 있다.

개인적으로 하나를 가지고 이리저리 짜맞추는걸 좋아해서 객체지향을 좋아하는게 있었는데...아직 한참 멀었구나 하는 생각이 들었다. 이게 다 피가되고 살이 되는거지

profile
망원동 개발자

0개의 댓글