ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 상속보다 구성을 이용한 재사용 [1편]
    실무에서 배운 내용 정리 2018. 12. 21. 05:24

    상속보다 구성을 이용하자 => 장점 : 클래스 수를 줄일 수 있음


    <예시를 위해, 임의로 가정한 상황>


    => 주니어, 시니어 별로 연봉을 계산해주는 연봉 계산기가 있다. 

    그런데 여기에는 문제가 하나 존재한다. 만약 중간 급을 위한 연봉 계산기가 추가된다면 클래스 수가 증가하기 때문이다.

    이것은 자바에서 상속을 사용하면 어쩔 수 없이 발생하는 부분이다.


    클래스 다이어그램은 다음과 같다.



    그럼 직급이 추가될 때마다 클래스 수가 증가하는 부분은 어쩔 수 없는 부분일까?

    => 결론부터 말하면, 해결할 수 있다. [2편을 기대해주세요.]


    그 전에 왜 이러한 구조가 나왔냐하면, 

    => API를 사용하는 쪽에서는 AbstractSalaryCalculator#public int paySalary(int career)만 사용하면 

    연봉을 계산해주도록 만들고 싶었기 때문이다.

    (내부적으로 어떤 연봉 계산기가 사용 되는지는 굳이 알 필요 없이)


    즉, API를 사용하는 쪽에서 Resolver에게 파라미터로 경력을 던져 적절한 연봉 계산기를 리턴 받고,  AbstractSalaryCalculator#public int paySalary(int career)만 사용하면 연봉 계산은 끝나는 거다. 


    코드는 다음과 같다.

    @Service
    public class SalesService {

    private SalesCalculatorResolver salesCalculatorResolver;

    @Autowired
    public SalesService(SalesCalculatorResolver salesCalculatorResolver) {
    this.salesCalculatorResolver = salesCalculatorResolver;
    }

    public void paySales(int career) {
    AbstractSalaryCalculator salaryCalculator = salesCalculatorResolver.resolve(career);
    salaryCalculator.paySalary(career);
    }
    }


    연봉 계산기를 결정해주는 Resolver의 코드는 다음과 같다.

    @Component
    public class SalesCalculatorResolver {

    private List<AbstractSalaryCalculator> salaryCalculators;

    @Autowired
    public SalesCalculatorResolver(List<AbstractSalaryCalculator> salaryCalculators) {
    this.salaryCalculators = salaryCalculators;
    }

    public AbstractSalaryCalculator resolve(int career) {

    for (AbstractSalaryCalculator salaryCalculator : salaryCalculators) {
    if (salaryCalculator.isApplied(career)) {
    return salaryCalculator;
    }
    }

    String messageFormat = "{}년 경력의 연봉을 계산할 수 있는 계산기가 없습니다.";
    String message = MessageFormatter.format(messageFormat, career).getMessage();
    throw new IllegalStateException(message);
    }
    }


    사실 기능 구현만 보자면, 위의 방법으로도 충분하다.

    하지만, 직급이 추가될 때마다 클래스가 추가되는 부분이 걸린다.


    이러한 문제(?)의 해결책은 2편에서 진행하겠다.



    P.S. 

    1. 혹시 잘못된 부분이나 질문하고 싶은 내용이 있다면 댓글로 남겨주시면 감사하겠습니다.

    2. 빠른 시일 내에, 해당 코드도 github에 올려 두도록 하겠습니다.


    '실무에서 배운 내용 정리' 카테고리의 다른 글

    Redis  (0) 2019.08.09
    Guava Cache 란 [1편]  (0) 2018.12.24
    실행 계획  (0) 2018.12.19
    Clustered Index & Non-Clustered Index 차이  (0) 2018.12.17
    프록시 객체를 만드는 2가지 방법  (0) 2018.12.12

    댓글

Designed by Tistory.