본문 바로가기

Java/@Transaction 구현

2. Aspect Oriented Programming

@Transactional 구현 - 목차

2021.12.02 - [Java/@Transaction 구현] - 1. 배경설명, 구현 동기 및 목표

2021.12.02 - [Java/@Transaction 구현] - 2. Aspect Oriented Programming (현재 글)

2021.12.02 - [Java/@Transaction 구현] - 3. Proxy 패턴

2021.12.02 - [Java/@Transaction 구현] - 4. JDK Dynamic Proxy

2021.12.02 - [Java/@Transaction 구현] - 5. 애너테이션 적용

 

Cell 의 동작방식

우선 Cell 이 어떻게 동작하는지 알아본다.

Node.java

public class Node {
    private final Cell cell;

    public Node(Cell cell){
        this.cell = cell;
    }

    public void execute() {
        cell.canEdit();
        cell.getValue();
        cell.setValue("test");
    }
}

Node 클래스는 Cell 을 주입받아서 canEdit(), getValue(), setValue() 를 차례로 실행한다.

RealCell.java

public class ExampleCell implements Cell {
    @Override
    public boolean canEdit() {
        System.out.println("=== Authentication ===");

        System.out.println("real canEdit\n");
        return false;
    }

    @Override
    public Object getValue() {
        System.out.println("=== Authentication ===");

        System.out.println("real getValue()\n");
        return null;
    }

    @Override
    public void setValue(Object value) {
        System.out.println("=== Authentication ===");

        System.out.println("=== Transaction in ===");
        System.out.println("real setValue() : " + value);
        System.out.println("=== Transaction out ===");
    }
}

RealCell 클래스는 Cell 인터페이스를 상속받아 구현한다.

canEdit(), getValue(), setValue() 메소드를 실행할 때, 인증되었는지 확인하고, setValue() 에서는 비즈니스 로직이 트랜잭션 안에서 실행된다.

RealCell 클래스에서는 Console 출력으로 인증과 트랜잭션 진입을 대신한다.

그림으로 정리하면 다음과 같다.

  setValue() getValue() canEdit()
역할 값을 설정한다. 값을 읽는다. 수정 여부를 결정한다.
프로세스 인증을 받는다. 트랜잭션을 얻는다. 핵심로직을 실행한다. 트랜잭션을 반환한다. 인증을 받는다. 핵심 로직을 실행한다. 인증을 받는다. 핵심로직을 실행한다.

 

구현해야 할 Cell의 갯수가 적었다면, 중복을 크게 고려하지 않았을 것이다.

 

위 사진은 만드는 제품 페이지의 극히 일부분이다. 위 테이블에는 중복을 제외하고도 Cell 이 총 23개 이다.

여기서 부가기능을 추가해야하는 요구사항이 발생한다면, 개발자가 구현한 Cell을 모두 돌아다니며 일일히 추가해야한다. Ctrl + C, V 를 이용한다 해도 여간 귀찮은 작업이 아닐 수 없다. 그리고 흔히 말하는 Fat Finger, Human Error, FingerException 이 발생할 가능성이 높다.

public class ExampleCell implements Cell {
    ...
    @Override
    public void setValue(Object value) {
        System.out.println("=== Logging ===");
        System.out.println("=== Authentication ===");

        System.out.println("=== Transaction in ===");
        System.out.println("real setValue() : " + value);
        System.out.println("=== Transaction out ===");
    }
}

Logging 을 호출하는 메소드만 추가해도 세 줄이 늘어난다.

그리고 변경한 것들이 제대로 동작하는지 언제 테스트 할까....

기능을 Cell 단위로 보기보다 메소드를 가로로 배치해서 메소드 내부로직에서 실행되는 부가기능 단위로 바라볼 필요가 있다.

Aspect Oriented Programming (AOP, 관점 지향 프로그래밍)

관점 지향 프로그래밍은 애플리케이션을 바라보는 관점을 모듈단위의 기능에서 횡단 관심사 관점으로 보고, 횡단 관심사의 기능을 모듈화하여 중복을 최소화해서, 핵심기능에 집중할 수 있는 프로그래밍 기법이다.

 

 

Cell 의 메소드를 다시 보면, 핵심로직을 실행하기전에 접근 권한 인증 을 한다. 접근 권한 인증과 같이 여러 모듈에 공통적으로 적용되는 기능을 횡단관심사 라 한다.

AOP 는 횡단 관심사를 깔끔하게 처리하기 어려운 OOP를 보조하는 목적으로 사용한다. 코드 자체를 수정하지 않고, 메소드의 이름이나 애너테이션과 같은 특정 표시가 있는 경우, 추가로 어떤 동작을 수행하도록 한다.

AOP를 이용하면, 개발자가 작성하는 핵심로직과 모든 모듈에 공통적으로 적용해야 하는 부가기능을 나눠서 구현할 수 있다.

'Java > @Transaction 구현' 카테고리의 다른 글

5. 애너테이션 적용  (0) 2021.12.02
4. JDK Dynamic Proxy  (0) 2021.12.02
3. Proxy 패턴  (0) 2021.12.02
1. 배경설명, 구현 동기 및 목표  (0) 2021.12.02