jpa는 기존 반복 코드도 제거하고 sql도 직접 만들어서 실행. (java orm)
개발 생산성 크게 높일 수 있음.
jpa가 인터페이스, hibernate가 구현체
public class JpaMemberRepository implements MemberRepository {
// jpa는 EntityManager로 모든 것 동작
// 스프링 부트가 자동으로 EntityManager 생성하고
// db와 연결 알아서 다 해줌
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);
}
@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(); // result를 stream으로 변환해서
}
@Override
public List<Member> findAll() {
// jpql: sql은 테이블 대상으로 쿼리 날림. jpql은 객체(엔티티) 대상.
// 객체 자체를 select. (m)
List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
return result;
}
}
// jpa 사용 시 주의할 점: 항상 transaction 있어야 함.
// 데이터 저장, 변경할 때 항상 transaction 있어야 함.
@Transactional
public class MemberService {
...
@Configuration
public class SpringConfig {
// private DataSource dataSource;
//
// @Autowired
// public SpringConfig(DataSource dataSource) {
// this.dataSource = dataSource;
// }
private EntityManager em;
@Autowired
public SpringConfig(EntityManager em) {
this.em = em;
}
...
@Bean
public MemberRepository memberRepository() {
//return new MemoryMemberRepository(); // MemberRepository는 인터페이스. 인터페이스는 new가 안됨
//return new JdbcMemberRepository(dataSource);
//return new JdbcTemplateMemberRepository(dataSource);
return new JpaMemberRepository(em);
}
}