AOP Design Pattern 고민

Developer:Bird·2021년 11월 3일
0

Spring

목록 보기
17/17

핵심로직과 부가로직을 구분하기 위해서, 혹은 변하는 부분, 변하지 않는 부분을 나눠서 보기 위해서 AOP를 사용하는데 이를 구현하기 위한 여러가지 디자인패턴과 방법들이 있다. 파이썬에서는 일급함수를 이용하는 방법도 있고, 자바 계열에서는 상속의 방식을 이용한 탬플릿 메서드 방식, 변하는 부분에 관해서 의존성을 필드 주입 받는 전략 패턴 , 변하는 부분에 관해서 실행코드를 넘겨주는 방식인 탬플릿 콜백 등이 있다. 해당 방법들의 장단점에 대해서 다이브 해보자.

1. 탬플릿 메서드 방식

설명: abstract class를 선언하고 공통부분에 관해서는 미리 선언하고, 핵심로직에 관해서는 상속받아 직접 구현하는 형태로 구현
코드:

public abstract class AbstractTemplate {public abstract class AbstractTemplate {
    public void execute() {
        log.info("부가기능");
        call(); //상속
        log.info("부가기능");
    }
    protected abstract void call(); //핵심 비즈니스 로직
}

public class SubClassLogic extends AbstractTemplate {
    @Override
    protected void call() {
        log.info("비즈니스 로직 실행");
    }
}

장점: 공통된 부분에 관해서 사용할 클래스마다 다시 재정의 하지 않아도 되기에, 가독성이 증가한다.

단점: 상속을 이용하기에 부모클래스와의 강한결합관계를 맺게 되고, 부모 클래스가 가지고 있는 기능을 사용하든 안하든 강한결합관계를 맺게된다.

2. 전략 패턴 및 탬플릿 콜백 패턴

설명: 변하지 않는 부분에 관해서, 상속 방식이 아닌 인터페이스를 주입받는 방식이다. 이때 스프링과 같이 필드를 통해서 구체를 주입받는 방식과, 콜백으로 던져주는 방식이 있다. 이때 후자를 스프링에서 탬플릿 콜백 패턴이라고 부르기도 한다. 두 방법다 구체를 주입 받는게 아니기 때문에 약한 결합관계에 있다.

코드:

public interface Strategy {
    void call();
}
// 구체를 필드에 주입
public class ContextV1{ 
    private Strategy strategy;
    public ContextV1(Strategy strategy) {
        this.strategy = strategy;
    }
    public void execute() {
        log.info('부가기능');
        call();
        log.info('부가기능');
    }
}
// call back pattern
public class ContextV2{ 
    public void execute(Stragety stragety) {
        log.info('부가기능');
        stragety.call();
        log.info('부가기능');
    }
}

공통 장점: 두 방법다 인터페이스에서만 의존하기에 약한결합성을 뛴다. 기존의 스프링 주입과 같은 깔끔한 방식이다.

필드 주입 방식
단점: 변경되기가 쉽지가 않다. Setter를 통해서 주입에 대해서 변경하게 된다면, 동시성의 문제가 생길 수 있고, 락을 걸게 된다면, 속도의 문제가 생겨 차라리, 기존의 탬플릿 메서드 방식이 나을 수 있다.

탬플릿 콜백 패턴
장점: 실행마다 stragety를 던져주기 때문에 유연하고, 동시성의 문제가 생기지도 않는 유연한 방식이다.

profile
끈임없이 발전하자.

0개의 댓글