JPA, Spring-data-jpa, AOP tutorial

전승원·2020년 12월 14일
0

강의 출처-김영한 강사님
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.

JpaMemberRepository

  • using EntityManager instance, we can use things like
    em.persist(entityName), es.find(Entity.class, param)
  • And for command not based on P.K, we could use 'createQuery' method. we can get the result with 'getResultList' or 'getSingleResult()'. In this case, getResultList() is used because of the return type.
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();
    }
}

SpringDataJpaMemberRepository

  • SpringDataJpa finds interface which extends JpaRepository and automatically registers it as spring bean.
  • We can use JpaRepository's basic crudRepository method, and in case of methods which are not provided, if we override methods like below, JPQL is made according to the method's name, translated as SQL and executed.
/**
 * 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); */


}

TimeTraceAop.java

  • 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");
        }
    }


}

MemberRepository Interface

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();
}
profile
No pleasure, No gain

0개의 댓글