๋ฐ์ํ
๐ AOP
๐ AOP๊ฐ ํ์ํ ์ํฉ
- ๋ชจ๋ ๋ฉ์๋์ ํธ์ถ ์๊ฐ์ ์ธก์ ํ๊ณ ์ถ๋ค๋ฉด?
- ๊ณตํต ๊ด์ฌ ์ฌํญ(cross-cutting concern) vs ํต์ฌ ๊ด์ฌ ์ฌํญ(core concern)
- ํ์ ๊ฐ์ ์๊ฐ, ํ์ ์กฐํ ์๊ฐ์ ์ธก์ ํ๊ณ ์ถ๋ค๋ฉด?
package hello.hellospring.service;
@Transactional
public class MemberService {
/**
* ํ์๊ฐ์
*/
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");
}
}
/**
* ์ ์ฒด ํ์ ์กฐํ
*/
public List<Member> findMembers() {
long start = System.currentTimeMillis();
try {
return memberRepository.findAll();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("findMembers " + timeMs + "ms");
}
}
}
- long start = System.currentTimeMillis(); : ์๊ฐ ํจ์ (์์ ์ง์ )
- long finish = System.currentTimeMillis(); : ์๊ฐ ํจ์ ( ์ข ๋ฃ ์ง์ )
- long timeMs = finish - start; : ๊ฑธ๋ฆฐ์๊ฐ
๐ ๋ฌธ์ ์
- ํ์๊ฐ์ , ํ์ ์กฐํ์ ์๊ฐ์ ์ธก์ ํ๋ ๊ธฐ๋ฅ์ ํต์ฌ ๊ด์ฌ ์ฌํญ์ด ์๋๋ค.
- ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง์ ๊ณตํต ๊ด์ฌ ์ฌํญ์ด๋ค.
- ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง๊ณผ ํต์ฌ ๋น์ฆ๋์ค์ ๋ก์ง์ด ์์ฌ์ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค.
- ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง์ ๋ณ๋์ ๊ณตํต ๋ก์ง์ผ๋ก ๋ง๋ค๊ธฐ ๋งค์ฐ ์ด๋ ต๋ค.
- ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง์ ๋ณ๊ฒฝํ ๋ ๋ชจ๋ ๋ก์ง์ ์ฐพ์๊ฐ๋ฉด์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
๐ AOP ์ ์ฉ
AOP : Aspect Oriented Programming
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;
@Component
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object execute(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 ์ ์ฉ ์ ์์กด๊ด๊ณ
-AOP ์ ์ฉ ์ ์ ์ฒด ๊ทธ๋ฆผ
-AOP ์ ์ฉ ํ ์์กด๊ด๊ณ
-AOP ์ ์ฉ ํ ์ ์ฒด ๊ทธ๋ฆผ
๋ฐ์ํ
'WINK-(Web & App) > Spring Boot ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[2025 1ํ๊ธฐ ์คํ๋ง ๋ถํธ ์คํฐ๋] ๋จ์ค์ฐฌ #7์ฃผ์ฐจ (0) | 2025.05.27 |
---|---|
[2025 1ํ๊ธฐ ์คํ๋ง ๋ถํธ ์คํฐ๋] ์ฌ๋ฏผํธ #7์ฃผ์ฐจ (1) | 2025.05.26 |
[2025 1ํ๊ธฐ ์คํ๋ง๋ถํธ ์คํฐ๋] ๊ณ ์ค์ #7์ฃผ์ฐจ (0) | 2025.05.24 |
[2025 1ํ๊ธฐ ์คํ๋ง๋ถํธ ์คํฐ๋] ๊น๋ฏผ์ #7์ฃผ์ฐจ (0) | 2025.05.24 |
[2025 1ํ๊ธฐ ์คํ๋ง ๋ถํธ ์คํฐ๋] ์ ๋ค์ #7์ฃผ์ฐจ (0) | 2025.05.24 |