반응형
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를 사용하면 된다.)
반응형
'Java > Spring Boot' 카테고리의 다른 글
스프링(Spring) DB 접근 기술(순수 JDBC, 스프링 JdbcTemplate) - 1 (0) | 2021.05.21 |
---|---|
스프링 컨테이너(Spring Container)에 객체 등록하기 (0) | 2021.05.18 |
스프링 의존성 주입(Spring Dependency Injection) 방법 (0) | 2021.05.17 |
스프링 부트(Spring Boot) 빌드(Build)하기 (1) | 2021.05.16 |
스프링 부트(Spring Boot) 프로젝트 생성(Project Generate)하기 (0) | 2021.05.15 |