๐ฅ TIL - Day 83 Spring AOP๋ฅผ ์ด์ฉํ ์์ธ๋ฐ์ ์ ์ฌ์๋ ๊ตฌํ
Exception
์ด ๋ฐ์ํ์ ๋ ์๋์ผ๋ก ํด๋น ๋ฉ์๋๋ฅผ ๋ค์ ํธ์ถํด์ฃผ๋ ํ๋ก์๋ฅผ Spring AOP๋ฅผ ์ด์ฉํด์ ๊ตฌํํ๋ค.
ํน์ ์์ฒญ์ด ์ฌ์๋์ ์ํด ์์ธ๋ฅผ ํผํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด ์๋ฒ ์ธก์์ ์ ํด์ง ํ์๋ก ์ฌ์๋ํ๋ ๊ฒ์ ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ๋์์ง ์์ ๋ฐฉ์์ด๋ค.
์๋ณธ ์ฝ๋๋ฅผ ๊ฑด๋ค์ง ์๊ณ ์ ์ฉํ๊ณ ์ ํ๋ ๋ฉ์๋์ @Retry
๋ฅผ ๋ถ์ฌ์ฃผ๋ ๊ฒ๋ง์ผ๋ก ์ ์ฉ๋๋๋ก ํ ๊ฒ์ด๋ค.
์๋ณธ ์ฝ๋๋ฅผ ๊ฑด๋ค์ง ์๊ณ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ์ฌ์๋ ๋ก์ง์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ฏ๋ก ํ๋ก์ ํจํด
์ด ์ ๋นํ๊ณ ํ๋ก์ ํจํด
์ Spring์์ ๋ณด๋ค ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด Spring AOP
๋ฅผ ์ฌ์ฉํ๋ค.
๐ ์์กด์ฑ ์ถ๊ฐ
[ Spring AOP ]
implementation 'org.springframework.boot:spring-boot-starter-aop'
๐ ์ฌ์๋ ๋์์ด ๋ ํ ์คํธ ํด๋์ค ๋ฐ ๋ฉ์๋ ์์ฑ
repository
์ save
๋ฉ์๋๋ 5๋ฒ์งธ ์ ๊ทผ๋ง๋ค ์์ธ๊ฐ ๋ฐ์ํ๋ค.
@Repository
public class ExamRepository {
private static int sequence = 0;
// 5๋ฒ์งธ ์์ฒญ๋ง๋ค ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
public String save(String itemId) {
++sequence;
if (sequence%5 == 0) {
throw new IllegalStateException("์์ธ ๋ฐ์");
}
return "ok";
}
}
์๋๋ 5๋ฒ์งธ ์์ฒญ๋ง๋ค ์์ธ๊ฐ ๋ฆฌํด๋์ง๋ง ์์ธ๋ฐ์ ์ ์ฌ์๋๋ฅผ ํตํด ์์ธ๋ฅผ ํํผํ๋๋ก ํ ๊ฒ์ด๋ค.
๐ JoinPoint๊ฐ ๋ ๋งํน์ฉ Annotation ์์ฑ
@Retry
๊ฐ ๋ถ์ ๋ฉ์๋์ ์ฌ์๋ Advice๊ฐ ์ ์ฉ๋๋๋ก ํ ๊ฒ์ด๋ค.
์ฑ๊ณตํ ๋๊น์ง ๋ฌดํ์ ์ผ๋ก ์ฌ์๋๊ฐ ๋์ง ์๋๋ก ํ๊ณ , ์ ์ฉ๋ ๋ฉ์๋๋ง๋ค ์ต๋ ์ฌ์๋ ํ์๋ฅผ ๋ฌ๋ฆฌํ๊ธฐ ์ํด ์์ฑ์ผ๋ก value
๋ฅผ ํฌํจํ๋ค.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Retry {
int value() default 3;
}
๐ Aspect ์์ฑ
-
JoinPoint
์ ํ๋ก ์์ธ์ ๋ํ ์ฒ๋ฆฌ ๋ฑ ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์@Around
๋ฅผ ์ฌ์ฉํ๋ค. -
@annotation(์ด๋ ธํ ์ด์ _์ด๋ฆ)
์ด๋ ธํ ์ด์ ์ ์ด๋ฆ์ ์ง์ ํ๊ณ ํด๋น ํ์ ์ ์ธ์๋ก ๋ฐ์ผ๋ฏ๋ก PointCut์ ์ง์ ํ๊ณ ์๋ค.๋ง์ฝ ์ด๋ ธํ ์ด์ ์ ์ธ์๋ก ๋ฐ์ง ์๋๋ค๋ฉด @annotation() ์๋ ์ด๋ ธํ ์ด์ ์ ํจํค์ง ๊ฒฝ๋ก์ ํ์ ์ด ๋ค์ด๊ฐ์ผ ํ๋ค.
-
Retry
์ด๋ ธํ ์ด์ ์์ ์ต๋ ์ฌ์๋ ํ์๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ฌ์๋ ํ์๋งํผJoinPoint
๋ฅผ ํธ์ถํ๋ค. (proceed()
); -
์์ฒญ ์ค ์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๋ฐ๋ก ์์ธ๋ฅผ ๋์ง์ง ์๊ณ ์ผ์์ ์ผ๋ก ์ ์ฅํ ๋ค์ ์ต๋ ์ฌ์๋ ํ์๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ ์์ ์ ์ฅํ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
@Aspect
@Slf4j
public class RetryAspect {
@Around("@annotation(retry)")
public Object doRetry(ProceedingJoinPoint joinPoint, Retry retry) throws Throwable {
log.info("[Retry] {} retry={}", joinPoint.getSignature(), retry);
int maxRetry = retry.value();
Exception exceptionHolder = null;
for (int retryCnt=1; retryCnt<=maxRetry; retryCnt++) { // ์ฌ์๋
if (retryCnt > 1) {
log.info("{} ๋ฒ์งธ ์ฌ์๋", retryCnt-1);
}
try {
return joinPoint.proceed(); // target ํธ์ถ์ ์์ธ๊ฐ ์๋ค๋ฉด ๊ทธ๋๋ก ๋ฐํ
} catch (Exception e) {
exceptionHolder = e; // ์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๋ฐ์ํ ์์ธ๋ฅผ ๋ณด๊ด
}
}
throw exceptionHolder; // ์ต๋ ์ฌ์๋ ํ์๋ฅผ ๋์ด์ ๊ฒฝ์ฐ ์์ธ๋ฐ์
}
}
๐ ์ด๋ ธํ ์ด์ ์ ์ฉ ์ ํ ์คํธ
์ฌ์๋๋ฅผ ์ํ ์ด๋ ธํ ์ด์ ์ ๋ถ์ด๊ธฐ ์ ํ ์คํธ์ด๋ค.
@Slf4j
@SpringBootTest
public class RetryTest {
@Autowired
ExamRepository examRepository;
@Test
void test() {
for (int i=1;i<=5;i++) {
String result = examRepository.save(String.valueOf(i));
log.info("result={}, itemId={}", result, i);
}
}
}
1~5๊น์ง ์ด 5๋ฒ์ ์์ฒญ์ ํ๋๋ฐ 4๋ฒ์งธ ์์ฒญ ์ดํ ์์ธ๊ฐ ํฐ์ง๋ ๊ฒ์ ํ์ธํ๋ค.
๐ ์ด๋ ธํ ์ด์ ์ ์ฉ ํ ํ ์คํธ
์ฌ์๋ ๋ก์ง์ ์ ์ฉํ๊ณ ์ ํ๋ ๋ฉ์๋์ @Retry
๋ฅผ ๋ถ์ฌ์ฃผ๋ฏ๋ก AOP๋ฅผ ์ ์ฉํ๋ค.
@Repository
public class ExamRepository {
private static int sequence = 0;
// 5๋ฒ์งธ ์์ฒญ๋ง๋ค ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
@Retry
public String save(String itemId) {
++sequence;
if (sequence%5 == 0) {
throw new IllegalStateException("์์ธ ๋ฐ์");
}
return "ok";
}
}
์คํ๋ง ์ปจํ
์ด๋์ ์ฌ์๋ Aspect๋ฅผ ์ฌ๋ ค์ค์ผ ํ๋ฏ๋ก @Import
๋ฅผ ์ฌ์ฉํด์ ๋ฑ๋กํ๋ค.
@Import(RetryAspect.class)
@Slf4j
@SpringBootTest
public class RetryTest {
...
}
์ด์ 5๋ฒ์งธ ์์ฒญ๋ง๋ค ์ฌ์๋๊ฐ ๋ฐ์ํ๊ณ ์ฌ์๋์ ์ํด ์์ฒญ์ด ์ ์์ ์ผ๋ก ์๋ต๋ ๊ฒ์ด๋ค.
4๋ฒ์งธ ์์ฒญ์์ ํ ๋ฒ์ผ๋ก ์ฌ์๋๊ฐ ๋ฐ์ํ๊ณ 5๋ฒ์งธ ์์ฒญ์ด ์ฑ๊ณตํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ ์ฐธ๊ณ
์๋ ๊ฐ์๋ฅผ 100% ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
๊ฐ์์๋ฃ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์จ ๊ฒ์ ์๋๋ ๋ณด๋ค ์ ํํ ์ ๋ณด๋ฅผ ์ํ๋ค๋ฉด ๊ฐ์๋ฅผ ๋ค์ด์ฃผ์ธ์. (๊ฐ์ถ!)
์ธํ๋ฐ - ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ณ ๊ธํธ (๊น์ํ ๋)
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ฅ TIL - Day 83 Spring AOP๋ฅผ ์ด์ฉํ ์์ธ๋ฐ์ ์ ์ฌ์๋ ๊ตฌํ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@dhk22/TIL-Day-83-Spring-AOP๋ฅผ-์ด์ฉํ-์์ธ๋ฐ์-์-์ฌ์๋-๊ตฌํ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค