스프링 삼각형
-스프링 삼각형은 스프링의 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) 기반입니다.
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(일관성 있는 추상화)라고 합니다.
'Spring > additional' 카테고리의 다른 글
[Spring] 스프링 AOP 5대 용어 (0) | 2021.02.28 |
---|---|
[Spring] 스프링 삼각형1_IoC/DI (0) | 2021.02.28 |
[Spring] 스프링을 통한 의존성 주입 (0) | 2021.02.28 |
[디자인 패턴] Decorator Pattern(데코레이터 패턴) (0) | 2021.02.21 |
[디자인 패턴] Proxy Pattern(프록시 패턴) (0) | 2021.02.21 |