목차

Spring Boot; 훑어보기#4 – JPA

🗓️

JPA (Java Persistent API)

  • JPA → 인터페이스 (자바 표준)
  • hibernate → 구현체 (여러 벤더들이 있음)
  • 쿼리도 JPA가 직접 만들어서 실행해준다.
  • 객체를 메모리에 넣듯 DB에 넣을 수 있게 해준다.
  • SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.
  • build.gradle
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  • application.properties
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
  • spring.jpa.show-sql: JPA가 날리는 쿼리를 볼 수 있다.
  • spring.jpa.hibernate.ddl-auto: 테이블을 자동으로 만들어주는 기능이다. (none/create)

ORM; Object-Releated Mapping

// Member
@Entity
public class Member {

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

    //...
  • @Id : 인식하는 값
  • @GeneratedValue : DB에서 자동으로 생성해주는 값 strategy = GenerationType.IDENTITY

Repository 구현

public class JpaMemberRepository implements MemberRepository {

    private final EntityManager em;

    public JpaMemberRepository(EntityManager em) {
        this.em = em;
    }
  • EntityManager: JPA는 EntityManager로 동작한다. 스프링부트다 EntityManger를 자동으로 생성해주고 코드만 구현하면 된다. (DataSource 포함)

구현

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

@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();
}
  • persist: 객체를 DB에 저장한다.
  • find: 객체를 DB에서 찾는다.
  • createQuery: 객체를 대상으로 쿼리를 날린다.

서비스 코드에 @Transactional 추가

//MemberService
@Transactional
public class MemberService {
    //...
  • 구현코드들이 모두 transaction을 타야한다.