์คํ๋ง AOP๋?
AOP์ ๊ฐ๋
AOP(Aspect-Oriented Programming, ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ)๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํก๋จ ๊ด์ฌ์ฌ(Cross-Cutting Concerns)๋ฅผ ๋ชจ๋ํํ๊ธฐ ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์. ํก๋จ ๊ด์ฌ์ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์์ ๊ณตํต์ ์ผ๋ก ๋ํ๋๋ ๊ธฐ๋ฅ์ผ๋ก, ๋ก๊น , ๋ณด์, ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฑ์ด ํฌํจ๋จ.
AOP์ ์ฅ์
- ์ฝ๋ ์ค๋ณต ๊ฐ์: ๊ณตํต ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋ ์ค๋ณต์ ์ค์ผ ์ ์์.
- ์ ์ง๋ณด์์ฑ ํฅ์: ๊ณตํต ๊ธฐ๋ฅ์ด ๋ณ๊ฒฝ๋ ๋ ํด๋น ๊ธฐ๋ฅ๋ง ์์ ํ๋ฉด ๋๋ฏ๋ก ์ ์ง๋ณด์๊ฐ ์ฉ์ดํจ.
- ๋ชจ๋ํ: ๊ณตํต ๊ธฐ๋ฅ์ ๋ณ๋์ ๋ชจ๋๋ก ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ๋ชจ๋ํ๋ฅผ ํฅ์์ํด.
์คํ๋ง AOP์ ๊ตฌ์ฑ ์์
Aspect
Aspect๋ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋ํํ ๊ฒ์. @Aspect ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ ์ํ ์ ์์.
@Aspect
public class LoggingAspect {
// advice ์ ์
}
Join Point
Join Point๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค์ ํก๋จ ๊ด์ฌ์ฌ๊ฐ ์ ์ฉ๋ ์ ์๋ ์ง์ ์ ์๋ฏธํจ. ๋ฉ์๋ ํธ์ถ, ๊ฐ์ฒด ์์ฑ ๋ฑ์ด Join Point๊ฐ ๋ ์ ์์.
Advice
Advice๋ ํน์ Join Point์์ ์คํ๋๋ ์ฝ๋๋ฅผ ์๋ฏธํจ. @Before, @After, @Around ๋ฑ์ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ ์ํ ์ ์์.
Pointcut
Pointcut์ ํน์ Join Point๋ฅผ ์ ํํ๋ ํํ์์. @Pointcut ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ ์ํ ์ ์์.
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethods() {
}
Weaving
Weaving์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ Aspect๋ฅผ ์ค์ ๊ฐ์ฒด์ ์ ์ฉํ๋ ๊ณผ์ ์. ์คํ๋ง์ ๋ฐํ์ ์๋น์ ์ง์ํจ.
์คํ๋ง AOP ์ค์ ํ๊ธฐ
XML ์ค์
XML ํ์ผ์ ํตํด ์คํ๋ง AOP๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์.
<aop:aspectj-autoproxy/>
<bean id="loggingAspect" class="com.example.aspect.LoggingAspect"/>
Java Config ์ค์
Java Config๋ฅผ ์ฌ์ฉํ์ฌ ์คํ๋ง AOP๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์.
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
@Bean
public LoggingAspect loggingAspect() {
return new LoggingAspect();
}
}
์คํ๋ง AOP์ ์ด๋ ธํ ์ด์
@Aspect
@Aspect ์ด๋ ธํ ์ด์ ์ ํด๋น ํด๋์ค๊ฐ Aspect์์ ๋ํ๋.
@Aspect
public class LoggingAspect {
// advice ์ ์
}
@Before
@Before ์ด๋ ธํ ์ด์ ์ ํน์ Join Point ์ด์ ์ ์คํ๋ ์ฝ๋๋ฅผ ์ ์ํจ.
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore() {
System.out.println("Method execution start");
}
}
@After
@After ์ด๋ ธํ ์ด์ ์ ํน์ Join Point ์ดํ์ ์คํ๋ ์ฝ๋๋ฅผ ์ ์ํจ.
@Aspect
public class LoggingAspect {
@After("execution(* com.example.service.*.*(..))")
public void logAfter() {
System.out.println("Method execution end");
}
}
@Around
@Around ์ด๋ ธํ ์ด์ ์ ํน์ Join Point ์ ํ์ ์คํ๋ ์ฝ๋๋ฅผ ์ ์ํ๋ฉฐ, Join Point์ ์คํ์ ์ ์ดํ ์ ์์.
@Aspect
public class LoggingAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Method execution start");
Object result = joinPoint.proceed();
System.out.println("Method execution end");
return result;
}
}
์คํ๋ง AOP์ ์ฌ์ฉ ์
์๋น์ค ํด๋์ค ์ ์
@Service
public class MyService {
public void performTask() {
System.out.println("Performing task");
}
}
๋ก๊น Aspect ์ ์
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.MyService.performTask(..))")
public void logBefore() {
System.out.println("Method execution start");
}
@After("execution(* com.example.service.MyService.performTask(..))")
public void logAfter() {
System.out.println("Method execution end");
}
}
์ค์ ํด๋์ค ์ ์
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
๋ฉ์ธ ํด๋์ค ์ ์
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService service = context.getBean(MyService.class);
service.performTask();
}
}
์ ๋ฆฌ
์คํ๋ง AOP๋ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋ํํ์ฌ ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ , ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๋๊ตฌ์. Aspect, Join Point, Advice, Pointcut, Weaving ๋ฑ์ ํต์ฌ ๊ฐ๋ ์ ์ดํดํ๊ณ , XML ์ค์ ๋๋ Java Config ์ค์ ์ ํตํด AOP๋ฅผ ์ ์ฉํ ์ ์์. @Before, @After, @Around ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์.
'๐์คํฐ๋ > ์คํ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ์ปดํฌ๋ํธ ์ค์บ ์๋ ๋น ๋ฑ๋ก (0) | 2024.05.19 |
---|---|
์คํ๋ง MVC ๊ธฐ๋ณธ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ํต์ฌ ๊ฐ๋ (0) | 2024.05.19 |
[์คํ๋ง] - ์คํ๋ง ์ปดํฌ๋ํธ ์ค์บ (0) | 2024.04.15 |