Community

๐Ÿ•Š๏ธ 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. ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•  ๋ฉ”์„œ๋“œ์— ์ด ์–ด๋…ธํ…Œ์ด์…˜ ๋‹ฌ๊ธฐ

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค