AOP(Aspect Oriented Programming)
관점 지향 프로그래밍
개념,예시
https://engkimbs.tistory.com/746
메소드의 호출시간을 측정하고 싶다면?
public Long join(Member member) {//같은 이름이 있는 회원은 안됨 (중복방지-> 임의로 지정한 규칙)
long start = System.currentTimeMillis(); //시작시간
try{
validateDuplicateMember(member); //중복회원 검증 메소드
memberRepository.save(member);
return member.getId();
}finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join = " + timeMs + "ms");
}
}
대부분 System.currentTimeMillis()를 이용하여 걸리는 시간을 측정할 것이다.
이렇게 일일이 모든 메소드에 시간측정코드를 넣기는 힘들것이다.(메소드화 하기도 힘들어서)
여기서 시간측정하는 부분은 핵심비지니스 로직이 아니며 (시간 측정 로직은 공통 관심사항이다.)
try안에 들어있는 코드들이 핵심 비지니스 로직이 될것이다.(=핵심관심사항)
AOP적용
하지만 AOP를 적용한다면?
TimeTraceAop.java
@Aspect //AOP는 해당 어노테이션을 붙여줘야한다.
@Component //이렇게해서 해당 클래스를 스프링 빈 등록할수있다.(컴포넌트 어노테이션을 쓰면 컴포넌트스캔에 걸리게되서 스프링빈등록됨)
// 또는 SpringConfig에 빈등록해서 사용가능.
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))") //어디다가 적용할것인지를 적는곳,해당 예시는 hello.hellospring하위에는 전부적용을 의미
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START " + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
이렇게 작성후 서버를 켜서 회원목록을 클릭해보면
어디서 어떤 메소드를 실행했는지, 끝났을때 시간은 얼마걸렸는지 다 뜨게된다.
나중에 돌아가는방식을 수정하고싶다면 Proceedingjoinpoint 관련 공부를 진행하면된다
맨처음 작성한 시간측정 로직을 모든 메소드에 추가하지않아도 되므로
핵심 관심 사항의 코드를 깔끔하게 유지할 수 있다.
스프링의 AOP 동작 방식
AOP 적용 전 의존관계
멤버 컨트롤러가 멤버 서비스를 의존하고 있고
멤버컨트롤러가 메소드를 호출하면 멤버서비스에서 메소드 호출함.
AOP 적용 후 의존관계
가정) 멤버서비스가 AOP에 적용 대상에 포함된다.
그렇다면 스프링은 가짜 멤버서비스를 만든다. (프록시라는)
스프링빈을 등록할때 가짜 멤버서비스(스프링빈)을 세워놓고 joinPoint.proceed()를 실행시 그때 진짜 스프링빈(실제 멤버서비스)를 호출 해준다. (가짜 멤버서비스는 실제 멤버서비스를 의존하는 관계)
멤버컨트롤러가 호출하는것은 프록시 기술로 인한 가짜 멤버서비스이다.
프록시라는 기술은 다른 강좌에서 한다.
진짜 가짜멤버서비스가 스프링빈에 등록되는건지 확인해보자
멤버 서비스라고 깔끔하게 끝나는게 아니라 Enhance~~와 같은 문자들이 더 붙어있다. (가짜 멤버서비스라는뜻)
AOP 적용 전 전체그림
AOP 적용 후 전체 그림
가짜는 실제를 의존하고 ( 화살표)
의존성 주입할떄 필요한 스프링빈은 가짜를 의존하게 되고 joinPoint.proceed()를 실행시 그때 진짜 스프링빈(실제 멤버서비스)를 호출 해준다.
[프록시 방식의 AOP]
의존성주입이 가능하므로 이런기술이 가능하다.
이번 강좌에서 배운 부분
'인프런 > 스프링 입문' 카테고리의 다른 글
12) 스프링 데이터 JPA (0) | 2022.11.28 |
---|---|
11) JPA (0) | 2022.11.28 |
10) 스프링 JdbcTemplate,RowMapper,lambda (0) | 2022.11.28 |
9)순수 JDBC, DI(dependency injection)과 다형성의 장점 , 스프링통합테스트 (0) | 2022.11.27 |
8)스프링 DB 접근기술(H2 데이터베이스 설치), 테이블생성,데이터생성,DDL SQL 관리 (0) | 2022.11.27 |
댓글