Spring

스프링 DB 접근 기술 3 ( JPA | 스프링 데이터 JPA )

보배 진 2022. 1. 28. 23:09

 

 

 

 

 

 

 

JPA

 

JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.

JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.

JPA를 사용하면 개발 생산성을 크게 높일 수 있다

 

 

 

 

 

먼저 jpa를 사용하기 위해 build.gradle에서

1 implementation 'org.springframework.boot:spring-boot-starter-jdbc'
2 implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

1번 jdbc는 이제 주석처리 해주고 data-jpa를 추가해줍니다

 

 

 

 

 

 

 

 

그리고 spplication.properties에서 jpa와 관련된 설정을 추가해줍니다

1 spring.jpa.show-sql=true
2 spring.jpa.hibernate.ddl-auto=none

1 : jpa가 날리는 sql을 볼 수 있습니다

2 : 자동으로 테이블을 생성해주는 auto를 사용합니다

 

 

 

 

package com.ujin.ujinspring.domain;

import javax.persistence.*;

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

@Entity

Member.java에 추가된 @Entity는 jpa가 관리하는 Entity가 된 것입니다

 

 

 

 

 

 

 

 

 

 

JpaMemberRepository를 하나 생성합니다

 

 

 

 

 

 

 

package com.ujin.ujinspring.repository;

import com.ujin.ujinspring.domain.Member;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

@Transactional
public class JpaMemberRepository implements MemberRepository {

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

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

    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }
}

JPA를 사용할 때는 @Transactional이 필요하다

 

 

 

 

 


 

 

 

 

 

 

스프링 데이터 JPA

 

 

 

 

 

 

 

 스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다.

여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다.

그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다.

스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 즐거워집니다.

지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다.

따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다. 실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수 입니다

 

 

 

 

 

 

 

 

 

 

 

 

스프링 데이터 JPA 제공 기능 인터페이스를 통한 기본적인 CRUD findByName() , findByEmail() 처럼 메서드 이름 만으로 조회 기능 제공 페이징 기능 자동 제공