AOP가 필요한 상황을 알아보자
위의 상황 중 메서드의 호출 시간을 측정하고 싶다면 아래 코드처럼 메서드들의 코드를 하나하나 다 적어줘야 한다.
@Transactional
public class MemberService { // 핵심 비즈니스 로직 구현 (비즈니스에 가까운 용어들을 사용하는것이 일반적 repository와 반대)
private final MemberRepository memberRepository;
//@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public Long join(Member member) { // 회원가입
long start = System.currentTimeMillis();
try {
validateDuplicateMember(member); // 중복 회원 검증
memberRepository.save(member); // save 호출
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");
}
}
이러한 코드는 아래와 같은 문제점이 있다.
다음 시간에 AOP를 적용시켜보자.