스프링 입문

Ch06. 스프링 DB 접근 기술 - JPA

webmaster 2021. 12. 1. 23:17
728x90
  • SQL을 직접 개발자가 작성해야 되는 문제가 있었다
    • JPA를 사용하면 SQL을 개발자가 직접 작성하지 않아도 작성해준다.
  • JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
  • JPA를 사용하면 개발 생산성을 크게 높일 수 있다

JPA dependency 추가
application.properties 설정
ddl-auto 설정 옵션

 

Spring에서 JPA / Hibernate 초기화 전략 · ID PRAVUS

Spring-data-JPA와 DBMS를 연결해서 사용할 때 간편히 개발환경의 변경사항을 적용하여 테스트 할 수 있다. 특히 테스트를 위한 in-memory Database인 H2 Database를 염두에 둔 DB 초기화 전략에서 신경쓸 점을

pravusid.kr

 

  • Member를 JPA가 자동으로 테이블도 만들어주도록 변경

JPA가 관리해주는 Entity

  • JPA가 알아서 테이블 생성해준다.
  • 강의에서는 GenerationType을 Identity로 하였지만 오류가 발생하여 Sequence로 하였다.
    • H2 DB 같은 경우 기본키 전략으로 Sequence 전략을 사용하고, Sequence 전략 사용 시, 시퀀스 번호를 미리 메모리에 가지고 오는 옵션을 사용하여 성능 최적화를 할 수 있다.
    • @SequenceGenerator. allocationSize를 사용하면 된다

기본키 전략

 

[JPA] H2의 @GeneratedValue 문제

개요 프로젝트를 진행하던 도중 아직 User 관련된 기능들이 완성되지 않아서 DB에 초기값을 insert하기 위해 웹 서버를 실행하는 시점에 값을 insert 하기로 결정하였다. 필요한 파일과 설정 준비 우

hyeonic.tistory.com

  • JPA Repository 생성
public class JpaMemberRepository implements MemberRepository{

    private final EntityManager em;

    public JpaMemberRepository(EntityManager em) {
        this.em = em;
        //springboot가 현재 database 설정정보를 보고 알아서 EntityManager를 만들어 준다
    }

    @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();
    }
}
  • config 변경 후 실행

Config 변경

728x90