Spring(기초) - Spring DB 접근 기술(2)

Kwon Yongho·2023년 3월 30일
0

Spring

목록 보기
5/37
post-thumbnail

Spring DB 접근 기술

  1. 순수 Jdbc
  2. 스프링 통합 테스트
  3. 스프링 JdbcTemplate
  4. JPA
  5. 스프링 JPA

4. JPA

  • JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
  • JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
  • JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

JPA 엔티티 매핑
java/hello/spring/domain/Member.java

package hello.spring.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

JPA 회원 리포지토리
java/hello/spring/repository/JpaMemberRepository.java

package hello.spring.repository;

import hello.spring.domain.Member;
import jakarta.persistence.EntityManager;

import java.util.List;
import java.util.Optional;

public class JpaMemberRepository implements MemberRepository {

    private final EntityManager em;

    public JpaMemberRepository(EntityManager em) {
        this.em = em;
    }
    
    public Member save(Member member) {
        em.persist(member);
        return member;
    }

    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }
    
    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class).getResultList();
    }
    
    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();
    }
}

테스트 케이스 결과

5. 스프링 JPA

  • 리포지토리에 구현 클래스 없이 인터페이스만으로 개발 완료 가능
  • 기본 CRUD 기능도 스프링 데이터 JPA가 제공
  • 개발 생산성 향상
  • 페이징 기능 자동 제공

스프링 데이터 JPA 회원 리포지토리
java/hello/spring/repository/SpringDataJpaMemberRepository.java

package hello.spring.repository;

import hello.spring.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
    Optional<Member> findByName(String name);
}
  • 스피링 데이터JPA가 SpringDataJpaMemberRepository를 Spring Bean으로 자동 등록해준다.

SpringConfig 설정 변경
java/hello/SpringConfig.java

package hello;

import hello.spring.repository.*;
import hello.spring.service.MemberService;
import jakarta.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class SpringConfig {
    private final MemberRepository memberRepository;

    @Autowired
    public SpringConfig(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

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

테스트 케이스 결과

참고: JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl이라는
라이브러리를 사용하면 된다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적
쿼리도 편리하게 작성할 수 있다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를
사용하거나, 앞서 학습한 스프링 JdbcTemplate를 사용하면 된다.

참고
김영한: 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(인프런)
Github - https://github.com/b2b2004/spring-ex

0개의 댓글