반응형

JPA

build.gradle 스프링 부트 관련 라이브러리 추가.

  • JPA, h2

resource/application.properties 스프링 부트 데이터베이스 연결, JPA 설정 추가

Repository 구현 형태

public class JpaMemberRepository implements MemberRepository {

    //JPA를 사용하기 위해서는 EntityManager가 필요하다.
    private final EntityManager em;

    public JpaMemberRepository(EntityManager em) {
        this.em = em;
    }

    @Override
    public Member save(Member member) {
        //JPA가 insert 구문 만들어서 실행하고 setter까지 자동으로 셋팅해줌
        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) {
        //PK가 아닌 컬럼은 JPQL을 사용하여 일반적인 SQL 사용하듯이 쿼리를 실행 시킬 수 있다.
        //다만 일반적인 SQL은 테이블을 대상으로 쿼리를 날리지만 JPQL은 객체를 대상으로 쿼리를 날린다.
        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)
                .getResultList();
    }
}

 

EntityManager 객체는 data-jpa 라이브러리를 받으면 스프링 부트가 데이터베이스와 연결하고 JPA 설정 값을 참고하여 해당 객체를 직접 생성하여 컨테이너에 넣어준다.

@Configuration
public class SpringConfig {

    private EntityManager em;

    @Autowired
    public SpringConfig(EntityManager em) {
        this.em = em;
    }

    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new JpaMemberRepository(em);
    }

}
  • JPA를 사용하면 Jdbc에서 봤던 반복 코드의 제거와 더불어 기본적인 SQL도 개발자가 직접 작성하지 않고 JPA가 직접 만들어서 실행해주는 효과를 얻을 수 있다.
  • JPA를 사용하면 SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.
  • JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

 

또한 JPA를 사용하게 되면 트랜잭션과 관련하여 Service에 @Transactional 어노테이션 추가가 필요하다.

 


스프링 데이터 JPA

build.gradle 스프링 부트 관련 라이브러리 추가.

  • JPA, h2

resource/application.properties 스프링 부트 데이터베이스 연결, JPA 설정 추가

Repository 구현 형태

public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {

    @Override
    Optional<Member> findByName(String name);
}
  • JPA를 편리하게 사용하도록 도와주는 기술로 스프링에서 제공하는 프레임워크
  • 스프링 데이터 JPA는 JPA를 스프링으로 한 번 감싸서 한 단계 추상화 시킨 것이다.
  • 인터페이스 만으로 개발할 수 있다.(인터페이스를 통한 기본적인 CRUD 제공)
  • 단순 반복 개발 코드들이 확연하게 줄어들고 핵심 비즈니스 로직을 개발하는데 집중할 수 있다.

 

해당 SpringDataJpaMemberRepository 인터페이스의 구현체는 만들지 않았지만 CRUD가 동작한다.

그 이유는 JpaRepository 내부에 상속하는 인터페이스를 보면 이미 CRUD와 같은 기능들을 제공하고 있고 페이징 기능도 자동으로 제공한다.

 

하지만 키가 아닌 값들로 처리하는 CRUD 들은 공통으로 제공되지 않기 때문에 해당 컬럼으로 CRUD할 수 있도록 인터페이스 재정의가 필요하다.

  • 인터페이스 메소드 이름을 정해진 규칙대로 작성하는 것만으로도 SQL이 만들어져 실행된다.

 


 

복잡한 동적 쿼리는 Querydsl이라는 라이브러리를 사용하면 좋다.

Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적 쿼리도 편리하게 작성할 수 있다. (JPA, 스프링 데이터 JPA, Querydsl 조합으로도 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 이용하거나 JdbcTemplate를 사용하면 된다.)

반응형

+ Recent posts