TypeORM 에서 findOne method 를 호출할 때 input 이 DeepPartial<T> 인지, Entity<T> 인지 따라 동적으로 다르게 정의된 method 들이 호출되는 게 overloading 의 대표적인 예시이다. 04부모 클래스에 기본적인 알고리즘의 흐름을 구현하고, 중간에 필요한 처리를 자식 클래스에 위임하는 디자인 패턴을
template method pattern이라고 한다
abstract class 로 만들었다AbstractDiscountPolicy → AmountDiscountPolicy 로 흐름이 넘어간다