๐๏ธ Spring AOP ์ฌ์ฉํ๊ธฐ
๋ฉ์๋ ์คํ ์๊ฐ์ ์ธก์ ํ๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. long startTime = (System.currentTimeMillis()); //YOUR LOGICAL CODE long executionTime = (System.currentTimeMillis() - startTime) / 1000; LOGGER.info("Time taken for calculation is : {} seconds", executionTime); ์ด ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ๋ชจ๋ ๋ฉ์๋์ ์ถ๊ฐํ๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ทธ๋ผ, ๋ฉ์๋ ์์ ์ด๋ ธํ ์ด์ ์ ๋ค๋ ๊ฒ๋ง์ผ๋ก๋ ์ด ์ฝ๋๋ฅผ ๋ชจ๋ ํฌํจํ ์ ์๋ค๊ณ ๋ง์๋๋ฆฌ๋ฉด ์ด๋จ๊น์? ๋จผ์ , Spring AOP๊ฐ ๊ฐ๋ฅํ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด ์ฃผ์ธ์. org.springframework.boot spring-boot-starter-aop ์ด์ ExecutionTimeLogger๋ผ๋ ์ด๋ฆ์ผ๋ก ์คํ๋ง ๋ถํธ์์ ์ปค์คํ ์ด๋ ธํ ์ด์ ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๋ณด์๋ค์ํผ ์ด๋ ธํ ์ด์ ์ ๋ฐํ์์ ์๋ํ๋ฉฐ ๋ฉ์๋ ์์ค์์ ์ ์ฉํ ์ ์์ต๋๋ค. @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface ExecutionTimeLogger { } ์ด์ Aspect๋ก ๋์ํ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด ํด๋์ค๋ ๋ฉ์๋ ์คํ ์๊ฐ์ ๊ณ์ฐํ ์ ์๋ ๋ก์ง์ ๊ฐ๊ณ ์์ต๋๋ค. Aspect๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๊ณ , @Before, @After, @Around, @Pointcut ๋ฑ์ ์ด๋ ธํ ์ด์ ์ ์ํฉ์ ๋ฐ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ ์ฝ๋์ ๊ฐ์ด ํด๋์ค ExecutionTimeLoggerAspect๋ฅผ ์์ฑํ๊ณ @Aspect๋ก ์ด๋ ธํ ์ด์ ์ ๋ฌ์์ต๋๋ค. @Aspect @Component public class ExecutionTimeLoggerAspect { @Around("@annotation(ExecutionTimeLogger)") public Object executionTimeLogger(ProceedingJoinPoint joinPoint) { // ์คํ ์๊ฐ ๊ณ์ฐํ๋ ๋ก์ง } } ํ์ํ ๊ตฌ์ฑ์ ๋ชจ๋ ์๋ฃ ๋์์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ ๋ฉ์๋ ์คํ ์๊ฐ์ ์บก์ฒํ๊ณ ์ถ์ ๊ณณ์ด๋ฉด ์ด๋๋ ์ง ์ด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋ฉ์๋์ ์คํ ์๊ฐ์ ์ธก์ ํ๊ณ ์ถ๋ค๋ฉด, ์๋ ์ฝ๋์ ๊ฐ์ด ๋ฉ์๋ ์์ ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํด ์ฃผ์ธ์! public class CustomLoggingService { @ExecutionTimeLogger public void myMethod() { //YOUR LOGICAL CODE } } ์ฝ์ง ์๋์? ์ผ๋ง๋ ๋ง์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ด ์ ์ฝ๋๋์ง ์์ํด ๋ด ์๋ค. ์์ฝํ์๋ฉด, ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. 1. ์ปค์คํ ์ด๋ ธํ ์ด์ ์์ฑ 2. @Aspect ํด๋์ค ์์ฑ ํ ์คํ ์๊ฐ์ ๊ณ์ฐํ๋ ๋ฉ์๋ ํฌํจํ๊ธฐ 3. ์ด ๋ฉ์๋๋ฅผ @Around๋ก ์ ์ธ 4. ์คํ ์๊ฐ์ ๊ธฐ๋กํ ๋ฉ์๋์ ์ด ์ด๋ ธํ ์ด์ ๋ฌ๊ธฐ