Spring/additional

[Spring] 스프링 삼각형2_AOP, PSA

sujin7837 2021. 2. 28. 19:36
반응형

스프링 삼각형

-스프링 삼각형은 스프링의 3대 프로그래밍 모델(IoC/DI, AOP, PSA)을 의미합니다.

-스프링을 이해하기 위해서는 POJO(Plain Old Java Object)를 기반으로 스프링 삼각형에 대한 이해가 필수입니다.

 

 

1. IoC(Inversion of Control)/DI(Dependency Injection)-제어의 역전/의존성 주입

2. AOP(Aspect-Oriented Programming)-관점 지향 프로그래밍

3. PSA(Portable Service Abstraction)-일관성 있는 서비스 추상화

 

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

-스프링 DI가 의존성(new)에 대한 주입이라면 스프링 AOP는 로직(code) 주입이라고 할 수 있습니다.

-코드: 핵심 관심사+횡단 관심사

  • 횡단 관심사(cross-cutting concern): 다수의 모듈에 공통적으로 나타나는 부분을 말합니다.
  • 핵심 관심사: 모듈별로 다르게 나타나는 부분입니다.
try {
	DB 커넥션 연결
    Statement 객체 세팅
    insert/update/delete/select 실행	//핵심 관심사
} catch ... {
	예외 처리
} catch ... {
	예외 처리
} finally {
	DB 자원 반납
}

위 코드에서 'insert/update/delete/select 실행'을 제외한 부분이 횡단 관심사에 해당됩니다.

 

메소드에서 로직(코드)을 주입할 수 있는 곳

1. Around

2. Before

3. After

4. AfterReturning

5. AfterThrowing 

 

<의사 코드>

 

남자용 의사 코드

열쇠로 문을 열고 집에 들어간다.

컴퓨터로 게임을 한다.

소등하고 잔다.

자물쇠를 잠그고 집을 나선다.

 

예외상황처리: 집에 불남-119에 신고한다.

 

여자용 의사 코드

열쇠로 문을 열고 집에 들어간다.

요리를 한다.

소등하고 잔다.

자물쇠를 잠그고 집을 나선다.

 

예외상황처리: 집에 불남-119에 신고한다.

 

 

<AOP 적용 전>

//Boy.java

public class Boy {
	public void runSomething() {
    	System.out.println("열쇠로 문을 열고 집에 들어간다.");
        
        try {
        	System.out.println("컴퓨터로 게임을 한다.");
        } catch (Exception ex) {
        	if(ex.getMessage().equals("집에 불남")) {
            	System.out.println("119에 신고한다.");
            }
        } finally {
        	System.out.println("소등하고 잔다.");
        }
        
        System.out.println("자물쇠를 잠그고 집을 나선다.");
    }
}
//Girl.java

public class Boy {
	public void runSomething() {
    	System.out.println("열쇠로 문을 열고 집에 들어간다.");
        
        try {
        	System.out.println("요리를 한다.");
        } catch (Exception ex) {
        	if(ex.getMessage().equals("집에 불남")) {
            	System.out.println("119에 신고한다.");
            }
        } finally {
        	System.out.println("소등하고 잔다.");
        }
        
        System.out.println("자물쇠를 잠그고 집을 나선다.");
    }
}
//Start.java

public class Start {
	public static void main(String[] args) {
    	Boy romeo=new Boy();
        Girl juliet=new Girl();
        
        romeo.runSomething();
        juliet.runSomething();
    }
}

 

<AOP 적용 후>

//Person.java

public interface Person {
	void runSomething();
}
//Boy.java

public class Boy implements Person {
	public void runSomething() {
    	System.out.println("컴퓨터로 게임을 한다.");
    }
}

Boy 클래스에 핵심 관심사만 남았습니다.

 

//Girl.java

public class Girl implements Person {
	public void runSomething() {
    	System.out.println("요리를 한다.");
    }
}

Girl 클래스에 핵심 관심사만 남았습니다.

 

//Start.java

public class Start {
	public static void main(String[] args) {
    	ApplicationContext context=new ClassPathXmlApplicationContext("aop002.xml", Start.class);
        
    	Person romeo=context.getBean("boy", Person.class);
        Person juliet=context.getBean("girl", Person.class);
        
        romeo.runSomething();
        juliet.runSomething();
    }
}
//MyAspect.java

@Aspect
public class MyAspect {
	//@Before("execution(public void aop.Boy.runSomething())")
	@Before("execution(* runSomething())")
    public void before(JoinPoint joinPoint) {
    	System.out.println("얼굴 인식 확인: 문을 개방하라");
        //System.out.println("열쇠로 문을 열고 집에 들어간다.");
    }
}

@Aspect: 이 클래스를 이제 AOP에서 사용하겠다는 의미입니다.

@Before: 대상 메소드 실행 전에 이 메소드를 실행하겠다는 의미입니다.

MyAspect 클래스가 Boy와 Girl 클래스에서 공통적으로 나타나는 횡단 관심사를 처리하고 있습니다.

 

 

//aop.xml

<aop:aspectj-autoproxy />: 스프링 프레임워크에게  자동으로 AOP 프록시를 사용하라고 알려주는 지시자입니다.

 

스프링 AOP의 핵심

  • 스프링 AOP는 인터페이스(interface) 기반입니다.
  • 스프링 AOP는 프록시(proxy) 기반입니다.
  • 스프링 AOP는 런타임(runtime) 기반입니다.

스프링 AOP 관련 용어

 

[Spring] 스프링 AOP 5대 용어

스프링 AOP 1. Aspect-관점, 측면, 양상 Aspect는 클래스를 AOP에서 사용하겠다는 것을 알려주는 지정자입니다. 2. Pointcut-자르는 점 -Pointcut은 Aspect 적용 위치 지정자입니다. -Pointcut은 횡단 관심사를..

sujin7837.tistory.com

 

PSA(Portable Service Abstraction)-일관성 있는 서비스 추상화

PSA의 필요성

-서비스 추상화: 어댑터 패턴을 적용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한 것을 말합니다.

-스프링 프레임워크에서는 서비스 추상화를 위해 다양한 어댑터를 제공합니다.

    ex) OXM(Object XML Mapping: 객체와 XML 매핑) 기술: Castor, JAXB, XMLBeans, JiBX, XStream 등

 

PSA의 특징

-스프링은 제각각인 API를 위한 어댑터를 제공함으로써 실제로 어떤 OXM 기술을 쓰든 일관된 방식으로 코드를 작성할 수 있게 지원합니다. 

-하나의 OXM 기술에서 다른 OXM 기술로 변경할 때 큰 변화 없이 세부 기술을 교체해서 사용할 수 있게 해줍니다.

-스프링은 OXM뿐만 아니라 ORM, 캐시, 트랜잭션 등 다양한 기술에 대한 PSA를 제공합니다.

 

이처럼 서비스 추상화를 해주면서 그것도 일관성 있는 방식을 제공한다고 해서 이를 PSA(일관성 있는 추상화)라고 합니다.

반응형