JPA

Haechan Kim·2022년 7월 9일
0

Spring

목록 보기
11/69

jpa는 기존 반복 코드도 제거하고 sql도 직접 만들어서 실행. (java orm)
개발 생산성 크게 높일 수 있음.

jpa가 인터페이스, hibernate가 구현체

  • JpaMemberRepository.java
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;
    }
}
  • MemberService.java
// jpa 사용 시 주의할 점: 항상 transaction 있어야 함.
// 데이터 저장, 변경할 때 항상 transaction 있어야 함.
@Transactional
public class MemberService {
	...
  • SpringConfig.java

@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);
    }
}

0개의 댓글