본문 바로가기

Dev Story/아키텍처

실무에 적용한 전략패턴 (C# 기준)

안녕하세요 구독자 여러분 오늘은 

디자인 패턴의 하나인 전략 패턴을 활용해

실무에서 사용한 엑셀 파싱 하는 프로그램 소스를 설명 할가 합니다.


전략 패턴은 하나의 목적을 위해 다양한 전략(방법) 을 활용해

만드는 패턴을 말합니다. 


조금더 세부적으로 말하면 단위별로 문제 해결을 위한 알고리즘들을 정의하고

각각의 알고리즘을 캡슐화 합니다


캡슐화된 알고리즘을 조합해 해결 하고자 하는 목적을 완성 시키는 전략을 말합니다.


위 패턴을 어떻게 적용 했는지 설명 하겠습니다.



아래 그림은 엑셀파일 하나를 로드 하여 각각의 탭에 있는 내용을 파싱해서 매출액을 

출력 하는 프로그램을 짠 다고 가정 해봅시다.





첫번째 그림은 탭 마다 같은 내용에 매출액을 구하는 공식이 똑같기 때문에

하나의 클래스 혹은 함수로 처리를 다 할 수가 있습니다.


하지만 두번째 그림은 첫번째 그림처럼 처리를 했다간 

스파게티 처럼 소스가 복잡하게 늘어 질게 분명 합니다.


 예를 들어 컬러명의 순서가 달라서 각 탭 마다 if 문 으로 분기를 해야 하고

각 탭마다 매출액 계산이 틀리므로 if 문을 분기를 해야 합니다.

그리고 수정사항이 변경 될때 마다 늘어나는 if 문 때문에

문제가 발생 하면 어디서 디버깅 해야 할지 난감한 경험을 할 것 입니다.


이런 문제를 해결하기 위해 전략패턴을 적용 했습니다. 그로 인한 장점은

소스를 만들지 않은 제3자가 보았을 때도 이해하기 쉽고 if문의 뎁스를 줄일수 있습니다.


아이텍처는 아래 그림을 보시면 참고 하면됩니다.




부가적인UML 관련 내용 연관,집합 관계에 대해 명확히 알려면 아래 사이트를 참고 해주세요.

https://geniusduck.tistory.com/entry/UML-%EA%B8%B0%EB%B3%B8%ED%8E%B8-%EA%B8%B0%EB%B3%B8-%ED%91%9C%EA%B8%B0-%ED%98%95%EC%8B%9D-%EB%B0%8F-%EA%B4%80%EA%B3%84%ED%91%9C%ED%98%84%EB%B2%95



클라이언트 코드 단 입니다. 해당 탭 명에 따라 case문으로 분기 처리 했습니다.

(패턴 적용 하지 않은 소스라면 여기서부터 if 의 향연을 맛볼 수 있습니다.)



아키텍처 그림의 ParserContext 에 해당 하는 부분이며 캡슐화된 전략들의 연관 관계에 해당하는 부분입니다.




텍처 그림의 ITemplateParser 를 상속받아 실체를 구현한 구상 클레스 입니다.




아키텍처 그림의 IColInfoMaker 를 상속받아 실체를 구현한 구상 클레스 입니다.



인터페이스 그림은 생략 하겠습니다...


이상 전략패턴 글을 읽어주셔서 감사 합니다 ~

문의 사항있으시면 댓글 남겨 주세요.