자바

[자바] 함수형 인터페이스와 AOP..?

qkwi 2024. 11. 9. 18:00
728x90

 

 

코드리뷰는 함수형 인터페이스에 대한 의문점이 생겼다.

바로 AOP와  함수형 인터페이스의 영향도였다.

 

특정 메소드에서 함수형 인터페이스를 파라미터로 받게 된다면 구현체는 외부에서 만들어져서 들어오지만 실제 실행 구간은

파라미터로 받은 해당 메소드에서 실행하게 된다. 

이렇게 된다면 특이점이 생기게 된다. 

인터페이스로 구현된 작업이 '디비에 쓰기 작업을 진행하는 행위'이고  메소드는 읽기 작업을 진행하는 ReadOnly트랜잭션이

적용된 메소드라고 생각한다면 해당 작업은 실패하게 된다.

이유는 간단하다. 

 

실제 쓰기작업의 함수형 인터페이스의 호출되는 부분은  읽기 전용 트랜잭션이 적용된 메소드에서 호출되고 있다. 

이렇게 된다면 상위에서 호출하게된 메소드에는 트랜잭션의 속성이 ReadOnly이기 때문에 정상적으로 Write작업을 수행 할 수 없게 된다.

 

아래는 간단하게 로그를 이용하여 호출순서를 표기한 방식이다. 

process라는 메소드를 실행하게 되면 process에 잇는 Hello World1 이 먼저 호출하게 되고 그다음에 

Member 생성자에 적용된 Log가 호출하게 된다. 

간단하게 이 순서만 기억해도  함수형 인터페이스가 어떻게 AOP에 적용되는지 알 수 있다.

 

// Process 메소드에서 실행된 로그가 먼저 출력되고 Member 클래스의 로그가 그다음 출력된다. 
// 함수형 인터페이스는 호출부 클래스의 영향을 받을 수 있다는 의미이다.
    @Test
    void name() {
        process(false, () -> new Member("Member"));
    }

    public void process(Boolean test, Supplier<Member> memberSupplier) {
        if (!test) {
		        log.info("Hello World1");		       
            memberSupplier.get();
        }

    }

    public class Member {
        String name;

        public Member(String name) {
            log.info("Hello World2");
            this.name = name;
        }
    }
728x90