* AOP (Aspect Oriented Programming)
- 관점 지향 프로그래밍
- OOP(객체지향 프로그래밍)는 대규모 프로그래밍 개발에 적합하기는 했지만 여전히 중복 작성되는 코드가 생길 수 밖에 없는 구조
-> 이를 해소하기 위해 AOP라는 개념이 스프링에 도입. 아래의 예를 살펴보자.
예시 1)
class Log {
public void log() {
system.out.println("접속 완료");
}
} // log() 메서드를 가진 Log() 클래스
이 클래스의 메서드를 다른 클래스에서 사용하려면, 상속을 통해 구현해줘야 함.
class Start1 extends Log {
public void log() {
log(); // 메서드를 따로 호출하지 않아도 상속만 하면 자동으로 실행되도록 해보자
system.out.println("start1 시작했습니다.");
}
}
class Start2 extends Log {
public void log() {
log(); // 메서드를 따로 호출하지 않아도 상속만 하면 자동으로 실행되도록 해보자
system.out.println("start2 시작했습니다.");
}
}
상속이 이루어질 때마다 log();라는 반복적인 코드의 수행이 일어남.
어차피 클래스를 만들 때마다 계속 log(); 불러줘야 하는데 Log 클래스만 상속해두면 알아서 log()라는 메서드가 실행되도록 할 수 없을까?
중복된 코드를 더더 없애보자!라는 개념에서 나온 것이 AOP. 관점 지향 프로그래밍.
예시 2)
'출근하기' 라는 메서드를 구현하기 위해서는 '일어나기, 씻기, 버스타기'가 필요하다. 주된 목적은 '출근하기'이다.
그리고, '친구만나기' , '여행가기' 메서드를 구현할 때도 똑같이 '일어나기, 씻기, 버스타기'가 필요하다.
객체 지향에서는 '출근하기, 친구만나기, 여행가기' 세 가지 메서드를 구현하려면,
각각의 메서드에 '일어나기, 씻기, 버스타기'를 각각 구현해줘야한다. (중복이 일어난다고 볼 수 있다.)
그러나 관점 지향에서는 '일어나기, 씻기, 버스타기'와 같이 계속 사용하는 기능들을 한 번만 작성해두면 (=디폴트로 설정해두면)
그 뒤부터는 AOP 설정을 통해 만들어내는 메서드마다 설정을 적용하여 메서드마다 각각 구현하던 중복을 줄일 수 있다.
* AOP의 용어정리
Joinpoint
- AOP 적용의 대상이 될 수 있는 모든 메서드
- 모든 메서드들 , sayHello() , sayGoodbye(), 후보들
Aspect
- AOP 적용을 위해 준비한 공통 기능
- 공통 기능, '일어나기, 씻기, 버스타기' 같은 공통적인 기능들
Advice
- 언제 AOP 실행할지 정해줘
- AOP의 실행 시점 (before, after, after-throwing, after-returning, around가 존재)
- before : 메서드 실행하기 전에 이거 먼저 실행해줘
- after : 메서드 실행하고 나서 실행해줘
- after-throwing : 오류가 나면 실행해줘 (경고 메시지)
- after-returning : 리턴이 끝나면 실행해줘
- around : 메서드 실행하는 내내 같이 실행해줘
Pointcut
- Joinpoint 중 실제로 AOP를 적용받을 후보 메서드
- 후보들 중에 쓰겠다고 정한 메서드, 나 sayHello()에만 쓸거야
* sayGoodBye()는 JoinPoint로만 남아있게 됨
Weaving
- Pointcut에 실제로 AOP를 적용하는것
- 실제로 AOP를 적용하는 행위
Target Object
- AOP를 적용받은 메서드를 하나 이상 가지고 있는 클래스
'SPRING' 카테고리의 다른 글
트랜잭션이란? (0) | 2020.09.14 |
---|---|
AOP - 어노테이션을 이용한 예제 (0) | 2020.09.14 |
게시판 - 게시글 수정 (0) | 2020.09.11 |
게시판 - 게시글 삭제 (0) | 2020.09.10 |
게시판 - 게시글 조회 (0) | 2020.09.10 |