본문 바로가기
Back End/Spring

Spring - DB접근5 (JPA)

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

 

JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다.
그 말은 즉, 실제적으로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.
JPA를 구현한 대표적인 오픈소스로는 Hibernate가 있다.

 

ORM(Object-Relational Mapping)

우리가 일반 적으로 알고 있는 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.

 

왜 JPA를 사용해야 할까?

JPA는 반복적인 CRUD SQL을 처리해준다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만하면 되고, 예측도 쉽게 할 수 있다. 추가적으로 JPA는 네이티브 SQL이란 기능을 제공해주는데 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 SQL을 직접 작성하여 사용할 수 있다.

출처: https://dbjh.tistory.com/77#recentComments


 

application.properties

 

  • show-sql : JPA가 생성하는 SQL을 출력한다.
  • ddl-auto : JPA는 테이블을 자동으로 생성하는 기능을 제공하는데 none 를 사용하면 해당 기능을 끈다.

 

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{

    //jpa는 EntityManager를 통해 모든 동작을 수행함
    private  final EntityManager em;

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

    @Override
    public Member save(Member member) {
        //persist는 영구저장하다 라는 뜻
        em.persist(member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        // id를 토대로 Member class에서 찾아서 member에 저장
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member); //값이 있으면 반환, 없으면 null 반환
    }


    //id와 같이 pk 기반이 아닌것들은 jpql을 작성해줘야함(createQuery)
    @Override
    public Optional<Member> findByName(String name) {
        //쿼리를 만들어서 name과 일치하는 객체를 찾아서 조회
        List<Member> result = em.createQuery("select m from Member as m Where m.name = :name", Member.class)
                .setParameter("name", name)
                .getResultList();

        return result.stream().findAny();
    }

    @Override
    public List<Member> findAll() {
        //member entity를 조회해서 객체 자체를 select함
        return em.createQuery("select m from Member as m", Member.class).getResultList();
    }
}

jpa를 기반으로 만든 멤버 레포지토리이다.

jdbc에서는 datasource를 이용했다면, JPA에서는 EntityManager을 이용했다.

'Back End > Spring' 카테고리의 다른 글

Spring - AOP  (0) 2023.07.05
Spring - DB접근6 (스프링 데이터 JPA)  (0) 2023.07.05
Spring - DB접근4 (JdbcTemplete)  (0) 2023.07.04
Spring - DB접근3 (스프링 통합 테스트)  (0) 2023.07.04
Spring - DB접근2 (고전 jdbc 이용)  (0) 2023.07.04