package hello.hellospring.service;
@Transactional
public class MemberService {
/**
* 회원가입
*/
public Long join(Member member) {
long start = System.currentTimeMillis();
try {
// try 내부가 핵심 로직
validateDuplicateMember(member); //중복 회원 검증
memberRepository.save(member);
return member.getId();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join " + timeMs + "ms");
}
}
/**
* 전체 회원 조회
*/
public List<Member> findMembers() {
long start = System.currentTimeMillis();
try {
// try 내부가 핵심 로직
return memberRepository.findAll();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("findMembers " + timeMs + "ms");
}
}
}
AOP는 @Aspect 애노티션을 붙여줘야 스프링 컨테이너가 AOP로 인식한다.
@Component를 붙여서 스프링 컨테이너에 스프링 빈으로 등록해줘야 한다.
스프링 설정 클래스에서 @Bean으로 등록해줘도 된다. Controller나 Serivce와 다르게 특수하므로 AOP가 적용되고 있다는 것을 알 수 있도록 따로 스프링 설정 클래스에 등록하는 것을 추천한다.
@Around는 핵심 로직 메서드 앞뒤로 AOP 로직을 실행하란 의미.
@Before, @After, @Around, @AfterReturning, @AfterThrowing 5개가 있다.
@Aroudn ()내부는 적용 대상을 설정한다.
excution( 접근제어자[생략가능] 리턴타입 패키지경로.클래스.메서드(파라미터))
Ex) execution( hello.hellospring..(..))는 hello.hellospring 패키지 내부 메소드 모두 적용
jointPoint.proceed()는 AOP 적용 대상의 메소드를 실행시킨다.
스프링 컨테이너에서 프록시를 이용해 가짜 memberService를 만든다.
jointPoint.proceed()를 호출하면 진짜 memberSerivce를 호출한다.
AOP 적용 전 전체 그림
AOP 적용 후 전체 그림