본문 바로가기

프로그래밍/- Spring

[ 스프링 DB 접근 기술 ] JPA

 

 

JPA

 

 

➡️ 반복코드는 물론이고 기본적인 SQL도 JPA가 직접 만들어서 실행

 

➡️ SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임 전환

 

➡️ 개발 생산성을 크게 증가시킴

 

➡️ jpa dependencies 추가

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

 

 

 

➡️ application.properties에 jpa관련 설정 추가

 

  🔸jpa가 날리는 sql을 볼 수 있음

spring.jpa.show-sql=true

 

   🔸자동 테이블 생성 기능은 이미 테이블을 만들었기 때문에 none으로 끄고 시작

spring.jpa.hibernate.ddl-auto=none

 

 

 

➡️JPA는 ORM 표준 ( Object Relational Mapping )

  🔸어노테이션으로 엔티티, PK등을 맵핑

 

package hello.hellospring.domain;


import jakarta.persistence.*;

@Entity // jpa가 관리하는 엔티티로 만들어주기
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    // PK값으로 지정한 후 해당 값을 지정하는 방식이 아닌 DB에서 값을 하나씩 올리면서 생성해 줌 > 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 리포지토리 추가 >> 기본적인 쿼리는 SQL 사용할 필요x / 기본 메서드에 존재

package hello.hellospring.repository;

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

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

public class JpaMemberRepository implements MemberRepository {

    private final EntityManager em;
    // 스프링부트가 자동으로 EntityManager 생성 > injection 받아서 사용 >> jpa를 사용하기 위한 기본 장치

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

    @Override
    public Member save(Member member) {
        em.persist(member); // 쿼리 생성 후 DB에 넣고 setId 까지 모두 실행
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id);  // find( 조회 타입, 식별자pk ) >> 조회
        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();
    }

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

    }
}

 

 

➡️ Service 계층에 트랜잭션 생성

 

➡️ SpringConfig를 JpaMemberRepository로 갈아끼워주고 EntityManager 맵핑해서 실행

 

 

➡️ 테스트 실행해보면(join 메서드 실행) Hibernate 구현체가 쿼리를 생성한 것 확인 가능