| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 순환문
- 무결성 제약조건
- 별 찍기
- ORA-01407
- while
- 백준문제풀이
- Ajax
- 백준문제
- 오라클
- 깃허브 블로그
- MSI
- 백준
- 파워서플라이
- 이클립스
- 스프링
- 환경설정
- 오류
- 티스토리 블로그
- 설정
- spring
- 공부
- jsp
- 오류모음
- 자바
- Oracle
- 전화번호부
- 이클립스단축기
- ORA-02292
- for문
- 인터페이스
Archives
- Today
- Total
danDevlog
[Spring Boot] AOP(Aspect Oriented Programming) 본문
728x90
성능(시간)을 알아보기 위해 모든 메소드의 호출 시간을 측정하고 싶다면?
package hello.hellospring.service;
@Transactional
public class MemberService {
/**
* 회원가입
*/
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");
}
}
/**
* 전체 회원 조회
*/
public List<Member> findMembers() {
long start = System.currentTimeMillis();
try {
return memberRepository.findAll();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("findMembers " + timeMs + "ms");
}
}
}
위에 시간을 측정하는 코드들을 모든 함수에 일일이 적어줘야한다.
함수가 적으면 할만하겠지만, 함수가 수 천개이며, 밀리초 단위가아니라 다른 단위로 재야한다면?
일일이 적는데도 엄청난 시간이 소요되고, 수정도 일일이 다 해줘야한다.
그렇기에, 공통 관심 사항 과 핵심 관심 사항으로 분리해준다.
aop패키지를 생성한 후, TimeTraceAop클래스를 생성해준다.
package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class TimeTraceAop {
// 경로(주소)를 지정해서 특정 패키지만 사용할수도 있다.
// ex)execution(* hello.hellospring.service..*(..))")
@Around("execution(* 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");
}
}
}
AOP를 사용하면 이 로직만 변경해주면 되고, 모든 함수에 추가할 필요 없이 이 클래스 하나로 모든 함수가 실행될 때마다 적용된다.
스프링 컨테이너에서 memberController, memberService, memberRepository 각각이 실행되기 전에
프록시 ~xx 가 실행된다. 즉 복제파일이라고 할수 있다.
실제로 proxy가 주입되는지 콘솔에 출력해서 확인해보면 복제된 객체의 주소값이 출력된다.
'Spring 입문' 카테고리의 다른 글
| [Spring Boot] 스프링 DB 접근 기술 - JPA / 스프링 데이터 JPA (0) | 2022.03.27 |
|---|---|
| [Spring Boot] 스프링 통합 테스트 / JdbcTemplate (0) | 2022.03.27 |
| [Spring Boot] 스프링 DB 접근 기술 - H2 데이터베이스 / 순수JDBC (0) | 2022.03.27 |
| [Spring Boot] 회원 관리 예제 - 회원 웹 기능(홈 화면, 등록, 조회 기능) (0) | 2022.03.26 |
| [Spring Boot] 자바 코드로 직접 스프링 빈 등록하기 (0) | 2022.03.26 |
Comments