> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/java_oop_for_spring_framework/undefined/7-..md).

# 7장. 스프링 삼각형과 설정 정보

* 스프링은 거대한 프레임워크지만 단순하게 보면 IoC, AOP, PSA로 이뤄진 형태

## IOC

* IoC를 이해하기 위해선 자바에서의 의존성을 알아야 하는데 (그야 의존성 역전이니까), 단순하게 표현하면 new 키워드가 의존 관계를 나타낸다.~~고 한다 아직 잘 모르겠다.~~
* 즉, 전체가 부분에 의존한다. 단 전체와 부분의 관계에 따라 집합 관계와 구성 관계로 나뉘므로 참고만 하자
* 의존성 주입은 즉, new 키워드를 컨텍스트가 아닌 외부에서 주입한다는 의미와 같다.

## AOP

* 스프링 DI가 의존성에 대한 주입 방식이라면, AOP는 로직을 주입하는 행위라고 볼 수 있다.
* 로깅, 보안, 트랜잭션 등 기능이 다수의 모듈에 반복적으로 나타나는 것을 횡단 관심사라고 하는데 이 부분에서 중복을 제거하고 일관된 동작을 수행하기 위해 AOP를 활용한다.
* 메서드를 주입 가능한 시점은 `Around, Before, After, AfterReturn, AfterThrowing` 으로 총 5군데
* AOP에선 프록시 객체가 이용된다. 다만 사용자는 이를 인지하고 있지 않고 스프링 프레임워크에서 프록시를 관리한다. 낯설 수 있지만 자연스럽기도한게 그게 아니면 무슨 수로 횡단 관심사에 대해 비즈니스 로직을 추가할 수 있겠는가?

***

* 스프링 AOP의 핵심은 다음과 같다.
  * 스프링 AOP는 인터페이스 기반이다.
  * 스프링 AOP는 프록시 기반이다.
  * 스프링 AOP는 런타임 기반이다.

### PointCount → Aspect 적용 위치 지정자

***

### JoinPoint → 연결 가능한 지점

* 스프링 AOP에서 JoinPoint란 스프링 프레임워크가 관리하는 빈의 모든 메서드에 해당한다.
* 코드 상에서 JoinPoint는 호출되는 객체와 메서드에 따라 다르다. A객체의 do()를 호출했다면 A.do()가 JoinPoint가 될 것이고, B객체의 do() 메서드를 호출했다면 B.do()가 될 것이다.

***

### Advice → 언제, 무엇을

* Advice는 pointcut에 적용할 로직과 그것이 언제 수행될 지를 포함한다.
* 코드 상의 @Before와 메서드 정의가 Advice인 셈

### Aspect → Advisor의 집합체

* AOP에서 Aspect는 여러 개의 Advice와 여러 개의 PointCut의 결합체를 의미하기에 결국 다음과 같다.
* `Aspect = Advices + Pointcuts`

### Advisor → 한 개의 Advice + 한 개의 PointCut

* 스프링 버전이 올라가면서 더는 쓰이지 않는 용어다. Aspect가 Advisor를 포용하는 더 큰 개념이기에 알아만두고 넘어가자.

***

## PSA - 일관성 있는 서비스 추상화

* Portable Service Abstraction의 약자로 ORM, 캐시, 트랜잭션 등 다양한 기술에 대해 일관된 추상화 서비스를 제공하는 것을 의미한다.
* 예를 들어 JDBC에서 드라이버만 갈아끼우면 되는 것처럼 다른 서비스에도 일관적인 추상화를 제공하기 때문에 변경에 따른 변화가 크지 않은 것
