강의 출처-김영한 강사님
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8
Before Reading:
This post is just for taking notes on what I learned today.
public class JpaMemberRepository implements MemberRepository {
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
@Override
public Member save(Member member) {
em.persist(member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
// should write jpql query string for command not based on P.K
@Override
public Optional<Member> findByName(String name) {
List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class) // query already mapped instances.
.getResultList();
}
}
/**
* SpringDataJpa finds interface which extends JpaRepository and automatically registers it as spring bean.
*/
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
/* JPQL : "select m from Member m where m.name = ?"
this is translated as SQL and executed. */
@Override
Optional<Member> findByName(String name);
/* JPQL : "select m from Member m where m.name =?,
where m.id =?" */
/* @Override
Optional<Member> findByNameAndId(String name); */
}
If app is started, virtual instance(virtual MemberService, MemberController, MemberRepository) is made by proxy, and right before when the actual method is called, it executes joinPoint.proceed().
Thus, in this case(TimeTraceAop), it will give us the execution time of each method.
Around("execution(/path/to/package or class)") annotation makes method of the path and subdirectories inside of the path as AOP class injected.
@Aspect
@Component
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");
}
}
}
public interface MemberRepository {
/* when using Spring-data-jpa, there are methods with same names
like below inside JpaRepository interface. */
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}