AOP๋ ์ธ์ ์ฌ์ฉํ๋ ์ง ์๋ฉด ์ ~ํ ์ด๋ ค์ด ๊ฐ๋ ์ด ์๋๋ค!
๊ทธ๋ผ ๋์ฒด ์ธ์ ์ฌ์ฉํ๋์ง โ
-> ๋ชจ๋ ๋ฉ์๋์ ํธ์ถ ์๊ฐ์ ์ธก์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
main/java/hello.hellospring/service/MemberService.java
์ฝ๋ ์์ ํ๊ธฐ
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
@Transactional
public class MemberService {
// private final MemberRepository memberRepository = new MemoryMemberRepository();
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// ํ์ ๊ฐ์
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");
}
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
});
}
// ์ ์ฒด ํ์ ์กฐํ
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");
}
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
โ๏ธ ํตํฉ ํ
์คํธ๋ก ํ์๊ฐ์
๋๋ ค๋ณด๊ธฐ
โ๏ธ findMembers๋ฅผ ํ์ธํ๊ธฐ ์ํด localhost:8080
์ ์ํ๊ธฐ
์ฌ๊ธฐ์ ๋ฐ์ํ๋ ๋ฌธ์ ๐ค๐ป
- ํ์๊ฐ์ , ํ์์กฐํ์ ์๊ฐ์ ์ธก์ ํ๋ ๊ฒ์ ํต์ฌ ๊ธฐ๋ฅ์ด ์๋! ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง์ ๊ณตํต ๊ด์ฌ ์ฌํญ์ผ ๋ฟ, ์ฐ๋ฆฌ์ ๊ด์ฌ์ฌ(=ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง)๋ try ์์ ๋ด์ฉ์ด๋ค!
- ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง๊ณผ ํต์ฌ ๋น์ฆ๋์ค์ ๋ก์ง์ด ์์ฌ์ ์ ์ง๋ณด์๊ฐ ๊ฒ๋ ๊ท์ฐฎ๊ณ ์ด๋ ต๋ค.
- ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง์ ๋ณ๋์ ๊ณตํต ๋ก์ง์ผ๋ก ๋ง๋ค๊ธฐ ๋งค์ฐ ์ด๋ ต๋ค.
- ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง์ ๋ณ๊ฒฝํ ๋ ๋ชจ๋ ๋ก์ง์ ์ฐพ์๊ฐ๋ฉด์ ํ๋ํ๋ ๋ณ๊ฒฝํด์ผ ํ๋ค.
๋๋จํ ๊ณ ๋ ์ฐ๋ฆฌ์ ๊ฐ๋ฐ์๋ถ๋ค...^^ ์ฌ๋ฌ ๊ณ ๋ฏผ์ ํ๋ค ๋์จ ๊ฒฐ๊ณผ!
main/java/hello.hellospring/aop/TimeTraceAop.java
ํ์ผ ์์ฑ
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๋ก ๊ฑธ์ด์ค๋ ๋๊ณ ,
// SpringConfig.java ํ์ผ์ ์ง์ ๋ฑ๋กํด์ค๋ ๋จ
@Component
// AOP๋ @Aspect๋ฅผ ์ ์ด์ค์ผ ํจ
@Aspect
public class TimeTraceAop {
// @Around - ์ด๋์ ์ ์ฉํ ๊ฒ์ธ์ง ํ๊ฒํ
ํ๋ ๊ฒ
// hello.hellospring ์ด๋ผ๋ ํจํค์ง์ ํ์์ ๋ชจ๋ ๋ค ์ ์ฉํ๋ผ๋ ๋ป
@Around("execution(* hello.hellospring..*(..))")
// joinPoint๊ฐ ๊ฐ์ง ๋ฉ์๋๋ก ์กฐ์ํ ์ ์์.
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
// ์คํํธ ๋ผ์ธ ์ฐ์ด๋ณด๊ธฐ(์ด๋ค ๋ฉ์๋๊ฐ ์งํ๋๋์ง ๋ค ์๋ ค์ค)
System.out.println("START: " + joinPoint.toString());
try {
// joinPoint.proceed(): ๋ค์ ๋ฉ์๋๋ก ์งํ์ด ๋จ, ์ด ์ค๋ธ์ ํธ๋ฅผ ๋ฆฌํด
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
๐ก ์ด๋ ์คํ๋ง ๋น์ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ฑ๋กํ ์ ์์
1) main/java/hello.hellospring/aop/TimeTraceAop.java
ํ์ผ์์ @Component
์ฌ์ฉ
2) main/java/hello.hellospring/SpringConfig.java
ํ์ผ์ ์ง์ ๋ฑ๋ก (๋งจ ์๋ ์ฃผ์ ๋ถ๋ถ)
โ๏ธ ์ด์ ์คํ์์ผ๋ณด์ !
๊น๋ํ๊ฒ ํ์ธํ ์ ์๋ค๐
์์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ AOP ์ฌ์ฉ์ผ๋ก ํด๊ฒฐ๐ก
- ํ์๊ฐ์ , ํ์ ์กฐํ๋ฑ ํต์ฌ ๊ด์ฌ์ฌํญ๊ณผ ์๊ฐ์ ์ธก์ ํ๋ ๊ณตํต ๊ด์ฌ ์ฌํญ์ ๋ถ๋ฆฌํ๋ค.
- ์๊ฐ์ ์ธก์ ํ๋ ๋ก์ง์ ๋ณ๋์ ๊ณตํต ๋ก์ง์ผ๋ก ๋ง๋ค์๋ค.
- ํต์ฌ ๊ด์ฌ ์ฌํญ์ ๊น๋ํ๊ฒ ์ ์งํ ์ ์๋ค.
- ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด ์ด ๋ก์ง๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
- ์ํ๋ ์ ์ฉ ๋์์ ์ ํํ ์ ์๋ค.(
@Around
)
1) AOP ์ ์ฉ ์ ์์กด๊ด๊ณ
2) AOP ์ ์ฉ ํ ์์กด๊ด๊ณ
joinPoint.proceed()
๋ฅผ ์คํํ๊ณ ์ด ๋ ์ง์ง ์คํ๋ง ๋น์ ํธ์ถํจ!3) AOP ์ ์ฉ ์ ์ ์ฒด ๊ทธ๋ฆผ
4) AOP ์ ์ฉ ํ ์ ์ฒด ๊ทธ๋ฆผ
๋๋์ด ์ ๋ฌธ์ฉ ๊ฐ์๋ฅผ ... ๋ง์ณค๋ค .... !!!!!!!!!!!!!!!!!!!
์ฒซ ๋จ์ถ๋ฅผ ๋จ๋จํ ์ ๋ผ์๋ณด์! ๋ผ๋ ๋ง์๊ฐ์ง์ผ๋ก ๋ณด๋ค ๋ ์์ธํ๊ณ ๋น ์ง์์ด ๊ธฐ๋กํ๋ ค๊ณ ํ๋๋ ์๊ฐ๋ณด๋ค ์๊ฐ์ด ๋ ๋ง์ด ๊ฑธ๋ ธ๋ ๊ฑฐ ๊ฐ๋ค๐
๋ค์ ๋ก๋๋งต๋ถํฐ๋, ํต์ฌ๋ง ๊ฐ๋จํ ์ถ๋ ค์ ๊ธฐ๋กํ๊ณ ์ฝ๋์ ๊ดํ ์ค๋ช
์ ์ฃผ์์ผ๋ก ๋ฌ ์์ ์ด๋ค๐ (+ ๊ฒฐ๊ณผ ํ๋ฉด ์บก์ณ๋ ์ต์ํ!)
์ด์ ํฌ์คํ
์์ ๋งํ๋ฏ, ๋ก๋๋งต1๋ก ๋์ด๊ฐ๊ธฐ ์ ์
๋ฌธ์ฉ ๊ฐ์๋ฅผ ๋ค์ ํ ๋ฒ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค! ์ง๊ธ์ ๋จธ๋ฆฌ์์ด ์กฐ๊ธ ๋ค์ฃฝ๋ฐ์ฃฝ์ด๋ผ์ ํคํค
์๋ฌดํผ ํ์ดํ
ํ์ดํ
๐๐