Spring Triangle
- Inversion Of Control (IOC)
- Aspect Oriented Programming (AOP)
- Portable Service Abstraction (PSA)
흩어진 AAAA와 BBBB -> 모아놓은 AAAA와 BBBB
- 다양한 메소드에 공통 코드가 흩어져 있을 때!
- 일일이 수정하긴 어렵다!
- 공통코드를 별도 클래스의 별도 메소드로 분리
EX) 처리시간을 재는 메소드
- StopWatch 인스턴스 생성
- stopWatch.start( );
- 코드
- stopWatch.stop( );
- System.out.println(stopWatch.prettyPrint( ));
AOP 구현1 ~ 컴파일 단계
- A.java를 A.class로 컴파일하는 단계에서 원하는 코드를 끼워넣는다.
- 소스에는 해당 코드가 없지만, 컴파일하면서 원하는 코드가 들어간다
- AspectJ 사용
AOP 구현2 ~ 런타임 단계
- A.class를 클래스로더가 메모리에 적재할 때 원하는 코드를 끼워넣는다.
- 컴파일한 A.class 파일도 소스코드랑 동일하지만, 클래스 로딩 시점에 달라진다.
- 클래스로더에 특별한 옵션을 붙여서 구현한다.
- AspectJ 사용
AOP 구현3 ~ 프록시 패턴
- Spring AOP가 사용하는 방법
- 디자인 패턴 중 하나를 사용해서 AOP와 같은 효과
- https://kkambi.tistory.com/88 (프록시 패턴의 이해)
Spring이 자동으로 프록시 객체 등록
- Bean이 등록될 때, 원하는 코드가 추가된 프록시 객체를 대신 등록
- 이 과정은 자동으로!
- Ex) @Transactional이 붙은 객체에 대해, Proxy object를 대신 등록
@Transactional
- 다수의 SQL쿼리문을 Transaction 단위로 묶음
- SQL문 앞에서 커넥션에 Set Autocommit = false;
- SQL문 뒤에서 Commit || Rollback
- 트랜젝션을 위한 추가 코드가 삽입된 Proxy object를 대신 등록!
참고
인프런-예제로 배우는 스프링 입문 (백기선)
9~11강 (스프링 AOC 및 프록시 패턴)을 들으며 정리한 내용입니다.
'학습 > Spring' 카테고리의 다른 글
[spring] 스프링부트 프로젝트 초기 생성 및 구조 (gradle) (0) | 2020.03.23 |
---|---|
[spring] 핵심3_Portable Service Abstraction (0) | 2020.03.22 |
[spring] 핵심1_Inversion Of Control / Bean / Dependency Injection (0) | 2020.03.21 |
[spring] @RequestParam과 @PathVariable (0) | 2020.02.15 |
[spring] DAO와 Repository / DTO / VO (0) | 2020.02.02 |
댓글