
현재 PaliPay 라는 외국인 관광객 대상 가상 지갑 서비스를 진행중이다. 우리가 사용하는 페이서비스처럼 가상 지갑이 있고, 내가 가진 은행의 계좌를 등록시켜 거기서 돈을 빼오는 형식이다.
이러한 과정을 보여주기 위해 World Bank 라는 다국적 금융 서비스도 함께 개발한다.
나는 이번 프로젝트에서 World Bank와 PaliPay의 유저 백엔드, 프론트 역할을 맡아 진행중이다.
이번 블로그 내용은 World Bank의 User 서비스를 구현하면서 배운
Strategy + Factory Patten에 대해 작성해보려고 한다.
핵심 : '무엇을 하는가' 와 '어떻게 하는가' 를 분리한 것.
장점 : 새로운 기능(전략)이 추가되어도 기존의 본체 코드를 수정할 필요가 없어 유지보수가 매우 유연하다.
핵심 : 객체 생성의 책임과 사용의 책임 분리
장점 : userservice는 그냥 factory.getStrategy(국적) 한 줄만 호출하면 국적이 추가되던말던 수정될 필요가 없다. 팩토리 내부나 새로운 전략 클래스만 만들면 된다.
만약 팩토리(StrategyFactory)가 없다면, 유저 가입 서비스 코드 안에
if (국적 == 한국) { new KoreaStrategy() } ... 같은 지저분한 코드가 들어갔을 텐데, 팩토리를 만듦으로써 그 선택 로직마저 깔끔하게 분리

각 국적별 Bank Entity 가 유저, 거래 내역과 1:1 관계로 연결되어 있다.
사용자는 하나의 국적을 가지고, 그 국적에 해당하는 전용 은행 계좌와 연결된다.
나라마다 계좌 번호 체계, 통화 단위가 모두 다르기 때문에 이를 하나의 service에서 if 혹은 switch 를 사용해 처리했다면 끝도 없이 길어졌을 것이다 ..
| '확장성'과 '일관성'
내가 만드는 유저 서비스도 결국 국적별 Bank Entity와 1:1 로 매핑되어야 했기 때문에, 시스템 전체의 코드 일관성을 위해 동일한 설계 철학을 가져가기로 했다.
분기 처리가 데이터가 아닌 로직일 때
- 단순한 값 비교가 아니라 조건에 따라 실행되어야 하는 알고리즘 자체가 완전히 다를 때
요구사항 확장이 빈번할 때
- 지금의 국적처럼 앞으로 어떤 케이스가 추가될지 모르는 가변적인 상황일 때
코드의 가독성을 높이고 싶을 때
- 복잡한 if 문, switch 문을 사용하지 않고 각 로직을 명확한 이름을 가진 클래스로 캡슐화 하고 싶을 때