[SpringBoot] 7_AOP(κ΄μ μ§ν₯ νλ‘κ·Έλλ°)
AOPκ° νμν μν©
- λͺ¨λ λ©μλμ νΈμΆ μκ°μ μΈ‘μ νκ³ μΆλ€λ©΄?
- '곡ν΅' κ΄μ¬ μ¬ν vs 'ν΅μ¬' κ΄μ¬ μ¬ν
- νμ κ°μ μκ°, νμ μ‘°ν μκ°μ μΈ‘μ νκ³ μΆλ€λ©΄?
package hello.hello_spring.service;
import hello.hello_spring.domain.Member;
import hello.hello_spring.repository.MemberRepository;
import hello.hello_spring.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();
// DI (μμ‘΄μ± μ£Όμ
) ν¨ν΄μΌλ‘ λ°κΎΈκΈ°
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
/*
* νμκ°μ
* */
public long join(Member member) {
// AOP
// ** κ³΅ν΅ κ΄μ¬ λ‘μ§ (κ° λ©μλλ§λ€ μκ°μ μΈ‘μ νλ μ½λ μΆκ°.. μΈμ λ€νλ)
long start = System.currentTimeMillis();
try {
//--------------------------------------
// ** ν΅μ¬ κ΄μ¬ λ‘μ§
//κ°μ μ΄λ¦μ΄ μλ μ€λ³΅ νμ X
validateDuplicateMember(member); // μ€λ³΅ νμ κ²μ¦
memberRepository.save(member);
return member.getId(); //longνμ
μ idκ° λ¦¬ν΄λ¨
//--------------------------------------
} 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() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
* μ¬κΈ°μ λ¬Έμ μ !!
- νμκ°μ , νμ μ‘°νμ μκ°μ μΈ‘μ νλ κΈ°λ₯μ ν΅μ¬ κ΄μ¬ μ¬νμ΄ μλλ€.
- μκ°μ μΈ‘μ νλ λ‘μ§μ κ³΅ν΅ κ΄μ¬ μ¬νμ΄λ€.
- μκ°μ μΈ‘μ νλ λ‘μ§κ³Ό ν΅μ¬ λΉμ¦λμ€μ λ‘μ§μ΄ μμ¬μ μ μ§λ³΄μκ° μ΄λ ΅λ€.
- μκ°μ μΈ‘μ νλ λ‘μ§μ λ³κ²½ν λ λͺ¨λ λ‘μ§μ μ°Ύμκ°λ©΄μ λ³κ²½ν΄μΌ νλ€.
AOP μ μ© (AOP: Aspect Oriented Programming)
: κ³΅ν΅ κ΄μ¬ μ¬ν vs ν΅μ¬ κ΄μ¬ μ¬ν λΆλ¦¬!!
- κ³΅ν΅ κ΄μ¬ λ‘μ§μ TimeTraceAop.java ν΄λμ€μ λ°λ‘ μμ±νμ¬ λΆλ¦¬ (MemberService.java ν΄λμ€μλ ν΅μ¬ κ΄μ¬ λ‘μ§λ§ μμ±)
package hello.hello_spring.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.hello_spring..*(..))") //AOP μ€μ ν κ²½λ‘
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" );
}
}
}
- ν μ€νΈ μ€ν μ μλμ κ°μ΄ μ½μμ°½μ μΆλ ₯λ¨

* ν΄κ²°
- νμκ°μ
, νμ μ‘°νλ± ν΅μ¬ κ΄μ¬μ¬νκ³Ό μκ°μ μΈ‘μ νλ κ³΅ν΅ κ΄μ¬ μ¬νμ λΆλ¦¬νλ€.
- μκ°μ μΈ‘μ νλ λ‘μ§μ λ³λμ κ³΅ν΅ λ‘μ§μΌλ‘ λ§λ€μλ€.
- ν΅μ¬ κ΄μ¬ μ¬νμ κΉλνκ² μ μ§ν μ μλ€.
- λ³κ²½μ΄ νμνλ©΄ μ΄ λ‘μ§λ§ λ³κ²½νλ©΄ λλ€.
- μνλ μ μ© λμμ μ νν μ μλ€.