TIL(03.15)

roach·2021년 3월 15일
0

TIL

목록 보기
6/8

프록시 패턴

  • 프록시는 대신 해주는 주체(?) 를 프록시라고 한다. 한국어로는 아마 저게 제일 맞는 표현이 아닐까 싶은데 여하튼 네트워크의 프록시 서버를 생각하면 아마 쉽지 않을까 싶다.
  • 뭐 여하튼 원래 인터페이스를 구현하여 실행하는 클래스가 Iservice 라는 클래스 였다면 이녀석을 대신해서 Proxy 를 투입하여 클라이언트에서는 Proxy 를 통해서 메서드를 호출하고 반환값을 받는지 전혀 모르도록 처리하는 것입니다.
  • 제일 중요한 키포인트는 흐름제어만 하는 것 뿐이지 결과값을 조작하거나 변형하는 일이 일어나서는 안된다는 것이다.

내가 간략하게 짠 코드는

package com.example.Proxy;

public interface Service {

    public String printSomething();

}
  • Service 라는 특정 인터페이스를 만든다. 우리가 원하는 작업을 추상화 시켜놓은 인터페이스 이다.
  • 이제 HelloJava 라는 것을 리턴해주는 IService 를 만들어보자
public class IService implements Service{

    @Override
    public String printSomething() {
        return "Hello Java";
    }

}
  • 그런데 우리는 Service 의 실행 전에 Service 를 실행중입니다.. 라는 걸 넣어주고 싶다.
  • 그러면 아래처럼 코드를 계속 바꾸게 되면 너무 비효율적이다..
public class IService implements Service{

    @Override
    public String printSomething() {
				System.out.println("Service 를 실행중입니다");
        return "Hello Java";
    }

}
  • 그러니 우리는 Proxy 에서 간단하게 하나를 더 나오게 해보자.
  • 로직 자체에는 영향을 끼치 않으면서 Proxy 자체에서 Service 를 호출하는 하나의 흐름을 갖도록 말이다
public class Proxy implements Service {

    Service service;

    public Proxy(Service service) {
        this.service = service;
    }

    @Override
    public String printSomething() {
        System.out.println("Service Loading...");
        return service.printSomething();
    }

}

이제 Service 가 실행되기전 Proxy 를 거쳐 작업한다면 Service 전 후에서 무언가 처리하는 나만의 로직도 만들수 있다.

public class Main {

    public static void main(String[] args) {
        Service proxy = new Proxy(new IService());
        System.out.println(proxy.printSomething());
    }

}

이걸 공부한 이유?

  • 자바의 트랜잭션이 어떤식으로 이루어지는지 궁금했다.
  • 아래는 실제로 존재하지 않는 코드들이 많다. 사실 리플렉션으로 구현가능한데, 많이 까먹었고 컨셉만 이해해도 된다고 생각하기에 아래에 대략적인 컨셉을 적었다. 사실상 자바코드가 아니라 컨셉을 적은 의사코드이다.
  • 이렇게 Proxy 패턴을 이용한다고 생각해봤을때 아래와 같이 구성하지 않았을까 싶다..?
//Method 저거는 없는것인데 그냥 그 설명을 위해 적은것이다.
//뭐 아래처럼 되지 않을까 싶다..?

public class TransactionHandler {

		Class transactionTargetClass;
		TransactionManager transactionManager;

		public TransactionHandler(Class transactionTargetClass) {
				this.transactionTargetClass = transactionTargetClass;
		}
		
		Method[] methods = transactionTargetClass.getMethods();

		// Transaction 이 선언된 타겟 메소드들의 배열
		Method[] transactionMethods = methods.filter(transaction);

		// transactionMethods 안에 있는 메소드들을 아래 excute 로 실행시킴
		public void excute(Method method) {
				transactionManager.begin();
				try{
						method.invoke();
				}catch(Exception e) {
						transactionManager.rollback(); 
				}
				transactionManager.commit();
		}

}
  • 이렇게 위처럼 구성되어 있다면 내 코드는 바뀌지 않고, Transaction 기능을 이용할 수 있을 테니 말이다.

데코레이터 패턴

  • 이건 코드로 짰는데... 내가 설명하는 것보다 아래 링크에 진짜 설명이 잘되어 있으니, 아래 링크를 보는게 더 좋을듯 하다.

https://johngrib.github.io/wiki/decorator-pattern/

profile
모든 기술에는 고민을

0개의 댓글