๐ป ์คํ๋ง ์ ๋ฌธ - ์ฝ๋๋ก ๋ฐฐ์ฐ๋ ์คํ๋ง ๋ถํธ, ์น MVC, DB ์ ๊ทผ ๊ธฐ์
์ค์ ๊ฐ์ ๋งํฌ
AOP ๋ Aspect Oriented Programming์ ์ฝ์๋ก ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ
์ฝ๊ฒ ์ค๋ช
ํ๋ฉด ํต์ฌ ๋ก์ง, ๊ณตํต ๋ก์ง์ ๋ถ๋ฆฌํด์ ๋ชจ๋ํ ํ๋ ๊ฒ์ด๋ค.
์์๋ฅผ ๋ค์ด๋ณด์๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ณ์ ๋ง๋ ํ์ ๊ฐ์
, ์กฐํ ๋ก์ง์ ๋ํ ํธ์ถ ์๊ฐ์ ์ธก์ ํ๊ณ ์ถ๋ค
์ด๋ด๋ ํต์ฌ ์ฌํญ์ ํ์ ๊ฐ์
์๋น์ค, ๊ณตํต ๊ด์ฌ ์ฌํญ์ด ํธ์ถ ์๊ฐ ์ธก์ ์ด๋ค.
ํต์ฌ ์ฌํญ๊ณผ ๊ณตํต ์ฌํญ์ด ๋ถ๋ฆฌ๋์ง ์์ ์ฑ๋ก ์๊ฐ ์ธก์ ํ๋ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์
public Long join(Member member) {
long start = System.currentTimeMillis();
try {
validateDuplicateMember(member); //์ค๋ณต ํ์ ๊ฒ์ฆ
memberRepository.save(member);
return member.getId();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join " + timeMs + "ms");
}
}
์ ์ฝ๋์ฒ๋ผ try ๋ฅผ ํตํด์ ๋ด๊ฐ ์ฌ์ฉํ ๋ชจ๋ ๋ฉ์๋์ ์์๊ณผ ๋์ ์๊ฐ์ ์ธก์ ํด์ผํ๋ค.
์ฌ๊ธฐ์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์๊ฐ ์ธก์ ์ ํต์ฌ ๊ด์ฌ ์ฌํญ์ด ์๋
- ์๊ฐ ์ธก์ ๋ก์ง์ ๊ณตํต ๊ด์ฌ ์ฌํญ์
- ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง๊ณผ ํต์ฌ ๋น์ง๋์ค ๋ก์ง์ ํผํฉ์ผ๋ก ์ ์ง ๋ณด์ ์ด๋ ค์
- ์๊ฐ ์ธก์ ๋ก์ง์ ๋ณ๋์ ๊ณต๋ ๋ก์ง์ผ๋ก ๋ง๋ค๊ธฐ ์ด๋ ค์
- ์๊ฐ ์ธก์ ๋ก์ง ๋ณ๊ฒฝ์ ๋ชจ๋ ๋ก์ง์ ์ฐพ์๊ฐ๋ฉด ๋ณ๊ฒฝ ํด์ผํจ
์๋ฅผ ๋ค์ด์ 100๊ฐ์ ๋ฉ์๋์ ์๊ฐ ์ธก์ ์ ์ํด์ 100๊ฐ์ ๋ฉ์๋์ ์๊ฐ ์ธก์ ๋ก์ง์ ์ถ๊ฐํด์ผํ๊ณ ms ์ s ๋ก ๋ณ๊ฒฝ์ ๋ค์ 100๊ฐ๋ฅผ ๋ชจ๋ ๋ณ๊ฒฝํด์ผํจ
๊ณตํต ๊ด์ฌ ์ฌํญ๊ณผ ํต์ฌ ๊ด์ฌ ์ฌํญ์ ๋ถ๋ฆฌํด์ ๊ฐ๋ฐํ๋ค.
์๋ ๊ทธ๋ฆผ ์ฒ๋ผ ๊ธฐ์กด ์๋น์ค ๋ก์ง์ ๊ทธ๋๋ก ๋๊ณ ์๋กญ๊ฒ ๊ณตํต ์ฌํญ์ ๊ฐ๋ฐํด์ ์ฐ๊ฒฐํ๋๊ฒ ์ค์'
์๊ฐ ์ธก์ ์ ํ๋ AOP ์์ค ์ฝ๋์ด๋ค.
@Around("execution( hello.hellospring..(..))") ๋ฅผ ํตํด์ ์ด AOP ๊ฐ ์ ์ฉ๋ ํด๋์ค ๋ฒ์๋ฅผ ์ ํ๋ค.
๊ทธ ์ด์ธ์ ๋ก์ง์ ๋์ผํ๋ฐ joinPoint.proceed()๋ฅผ ํตํด์ ์คํ์ ์ํจ๋ค๊ณ ํ๋ค.
package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object excute(ProceedingJoinPoint joinPoint) throws Throwable{
long start = System.currentTimeMillis();
System.out.println("START : " + joinPoint.toString());
try{
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END : " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
์ด๋ ๊ฒ AOP๋ฅผ ํตํด์ ๋ถ๋ฆฌ์ ์ป๋ ์ด์ ์ ๋ฌด์์ธ๊ฐ??
- ๊ด์ฌ ์ฌํญ ๋ถ๋ฆฌ ๊ฐ๋ฅ
- ์๊ฐ ์ธก์ ๋ก์ง์ ๋ณ๋์ ๊ณตํต ๋ก์ง์ผ๋ก ๋ง๋ฌ
- ํต์ฌ ๊ด๋ฆฌ ์ฌํญ ๊ฐ๋ ์ฑ, ๊ฐ๊ฒฐ์ฑ ์ ์ง
- ๋ณ๊ฒฝ ํ์ํ๋ฉด ์๊ฐ ์ธก์ ๋ก์ง๋ง ๋ถ๋ฆฌ
- ์ํ๋ ์ ์ฉ ๋์ ์ค์ ๊ฐ๋ฅ
๊ธฐ์กด์ ์คํ๋ง ์ปจํ
์ด๋๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์๋ฐ ์ฌ๊ธฐ์ ํ๋ก์๋ก ๊ฐ์ง ๋ฉค๋ฒ ์๋น์ค๊ฐ ์์ฑ๋๋ค,
๊ฐ์ง ๋ฉค๋ฒ ์๋น์ค๊ฐ ์ปจํธ๋กค๋ฌ์ ์์ฒญ์ ๋จผ์ ๋ฐ๊ณ ์ดํ ์ค์ ๋ฉค๋ฒ ์๋น์ค๋ฅผ ์คํํ๋ค.
AOP ์ ์ฉ๋ ์ ์ฒด ์คํ๋ง ์ปจํ
์ด๋์ ๋ชจ์ต์ด๋ค.
์ ์ด๋ ๊ฒ ๋๋์ง ์๋ฆฌ, ์ถ๊ฐ ์์ ๋ฑ ๋ค๋ฅธ ๋ฌธ์ ๋ ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ฐ์์์ ์ถ๊ฐ ์ค๋ช
์์ ์ด๋ค.