Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Strategy Pattern - 2, 익명 내부 클래스 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

Strategy Pattern - 2, 익명 내부 클래스

Seung__ 2021. 11. 22. 20:42

1. 익명 내부 클래스 사용 Test


/**
 * 익명 내부 클래스
 */
@Test
void strategyV2(){
    Strategy strategyLogic1 = new Strategy() {

        @Override
        public void call() {
            log.info("비즈니스 로직1 실행");
        }
    };

    ContextV1 context = new ContextV1(strategyLogic1);
    context.execute();

    Strategy strategyLogic2 = new Strategy() {

        @Override
        public void call() {
            log.info("비즈니스 로직2 실행");
        }
    };

    ContextV1 context2 = new ContextV1(strategyLogic2);
    context2.execute();
}
20:35:01.104 [main] INFO hello.advanced.trace.strategy.ContextV1Tet - 비즈니스 로직1 실행
20:35:01.107 [main] INFO hello.advanced.trace.strategy.code.strategy.ContextV1 - resultTime = 8
20:35:01.118 [main] INFO hello.advanced.trace.strategy.ContextV1Tet - 비즈니스 로직2 실행
20:35:01.118 [main] INFO hello.advanced.trace.strategy.code.strategy.ContextV1 - resultTime = 0

 

 

 

2. 생성자에 바로 넣기.


@Test
void strategyV3(){


    ContextV1 context = new ContextV1(new Strategy() {

        @Override
        public void call() {
            log.info("비즈니스 로직1 실행");
        }
    });

    context.execute();

    ContextV1 context2 = new ContextV1(new Strategy() {

        @Override
        public void call() {
            log.info("비즈니스 로직2 실행");
        }
    });
    context2.execute();
}

 

 

 

3. 람다식 사용하기


  • 람다식은 익명 내부클래스로 구성됨.
@Test
void strategyV4(){

    ContextV1 context = new ContextV1(() -> log.info("비즈니스 로직1 실행"));
    context.execute();

    ContextV1 context2 = new ContextV1(() -> log.info("비즈니스 로직2 실행"));
    context2.execute();
}
  • 익명 내부 클래스를 자바8부터 제공하는 람다로 변경할 수 있다. 
  • 람다로 변경하려면 인터페이스에 메서드가 1개만 있으면 되는데, 
  • 여기에서 제공하는 Strategy 인터페이스는 메서드가 1개만 있으므로 람다로 사용할 수 있다.

 

 

 

4. 정리


  • 지금까지 일반적으로 이야기하는 전략 패턴에 대해서 알아보았다. 
  • 변하지 않는 부분을 Context 에 두고 변하는 부분을 Strategy 를 구현해서 만든다. 
  • 그리고 Context 의 내부 필드에 Strategy 를 주입해서 사용했다.

 

 

 

5. 선 조립 후 실행


  • 여기서 이야기하고 싶은 부분은 Context 의 내부 필드에 Strategy 를 두고 사용하는 부분이다.
  • 이 방식은 Context 와 Strategy 를 실행 전에 원하는 모양으로 조립해두고, 
    그 다음에 Context 를 실행하는 선 조립, 후 실행 방식에서 매우 유용하다.
  • Context 와 Strategy 를 한번 조립하고 나면 이후로는 Context 를 실행하기만 하면 된다. 
  • 우리가 스프링으로 애플리케이션을 개발할 때 애플리케이션 로딩 시점에 
    의존관계 주입을 통해 필요한 의존관계를 모두 맺어두고 난 다음에 실제 요청을 처리하는 것 과 같은 원리이다.
  • 이 방식의 단점은 Context 와 Strategy 를 조립한 이후에는 전략을 변경하기가 번거롭다는 점이다. 
  • 물론 Context 에 setter 를 제공해서 Strategy 를 넘겨 받아 변경하면 되지만, 
  • Context 를 싱글톤으로 사용할 때는 동시성 이슈 등 고려할 점이 많다. 
  • 그래서 전략을 실시간으로 변경해야 하면 차라리 이전에 개발한 테스트 코드 처럼 
    Context 를 하나더 생성하고 그곳에 다른 Strategy 를 주입하는 것이 더 나은 선택일 수 있다.
  • 이렇게 먼저 조립하고 사용하는 방식보다 더 유연하게 전략 패턴을 사용하는 방법을 없을까?

 

6. GitHub : 211122 Strategy Pattern - 2


 

GitHub - bsh6463/Spring_Advanced: initial

initial. Contribute to bsh6463/Spring_Advanced development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글

Template CallBack - 시작  (0) 2021.11.22
Strategy Pattern - 3  (0) 2021.11.22
Strategy Pattern - 1  (0) 2021.11.22
Template Method - 정의  (0) 2021.11.22
Template Method - 적용2  (0) 2021.11.22
Comments