indexOf(str.charAt(i)) // 맞다면 해당 인덱스 리턴 아니면 -1 리턴
Character.getNumericValue(i) // 숫자 형태의 char형을 int 형으로 변환
Math.round()
핵심 기능(Core Concerns) : 업무 로직을 포함하는 기능
부가 기능(CROSS-CUTTING CONCERNS): 핵심 기능을 도와주는 부가적인 기능
Aspect : 부가 기능을 정의한 코드인 어드바이스와 어드바이스를 어디에 적용할 지 결정하는 포인트컷을 합친 말 (Advise + PointCut = Aspect)
OOP 관심사 분리에 대한 한계적인 부분을 해결하고자 AOP가 등장
AOP모듈화의 핵심 단위는 관점
핵심 기능인 OO로직과 부가기능인 로그 추적 로직이 하나의 객체로 들어간다.
org.springframework.core.annotation.@Order
애너테이션 적용 ( 하나의 클래스 단위로 적용 )
- Before
- 조인 포인트 실행 이전에 실행
- 타겟 메서드가 실행되기 전에 처리해야할 필요가 있는 부가 기능을 호출 전에 공통 기능 실행
- Before Advice 구현한 메서드는 리턴타입이 void
- 메서드에서 예외를 발생시킬 경우 대상 객체의 메서드가 호출되지 않게 된다.
@Before("hello.aop.order.aop.Pointcuts.orederAndSerice()") public void doBefore(JoinPoint joinPoint) { log.info("[before] {}", joinpoint.getSignature()); }
- 작업 흐름 변경 x 메서드 종료시 자동으로 다음 타켓 호출 (예외 발생 시 다음 호출x)
- After returning
- 조인포인트가 정상 완료 후 실행
- 메서드가 예외 없이 실행된 이후에 공통 기능을 실행
@AfterReturning(value = "hello.aop.order.aop.Pointcuts.orderAndService()", returning = "result") public void doReturn(JoinPoint joinPoint, Object result) { log.info("[return] {} return={}", joinPoint.getSignature(), result); }
- 메서드 실행이 정상적으로 반환될 때 실행
- After throwing
- 메서드가 예외를 던지는 경우에 실행
- 메서드를 실행하는 도중 예외가 발생한 경우 공통 기능을 실행
@AfterThrowing(value = "hello.aop.order.aop.Pointcuts.orderAndService()", throwing = "ex") public void doThrowing(JoinPoint joinPoint, Exception ex) { log.info("[ex] {} message={}", joinPoint.getSignature(), ex.getMessage()); }
- 메서드 실행이 예외를 던져서 종료될 때 실행한다.
- After(finally)
- 조인포인트의 동작(정상/예외) 과 상관 없이 실행
- 일반적으로 리소스 해제에 사용
- Around
- 메서드 호출 전후에 수행하며 가장 강력한 어드바이스
- 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등 가능
- 조인 포인트 실행 여부 선택 - joinpoint.proceed()
- 전달 값 변환 - joinPoint.proceed(args[])
- try~catch ~ finally 가 들어가는 구문 처리 가능
- 어드바이스의 첫 번째 파라미터는 ProceedingJoinPoint를 사용
- proceed()를 통해 대상을 실행하며 여러번 실행할 수 있다.