스프링 DB 접근 기술(2)

김민석·2021년 2월 7일
0
post-custom-banner

JPA

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

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

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

환경 설정
build.gradle 파일에 JPA 관련 라이브러리를 추가해 준다.

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

jpa 라이브러리 내부에는 jdbc 관련 라이브러리 역시 포함하고 있기 때문에 jdbc 라이브러리는 제거한다.
그리고 gradle 변경 시 reload를 꼭 해준다.

application.properties에 JPA 설정도 추가해 준다.

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

show-sql은 jpa가 생성한 sql을 출력하는 것이고 ddl-auto는 테이블을 자동 생성하는 기능을 제공해 주는 것이다. none으로 하면 생성을 하지 않는 것이고 create로 하면 엔티티 정보를 바탕으로 테이블을 생성해 준다.

Entity 매핑

  • JPA를 사용해서 테이블과 매핑할 클래스에는 @Entity 어노테이션을 붙인다.
  • 기본 키(pk)를 매핑해 주기 위해 @Id 어노테이션을 사용한다.
  • 기본 키 할당 시 @GeneratedValue를 활용해 DB에서 자동으로 기본 키 생성을 하도록 해 준다.
  • (키 생성 전략에는 identity 외에도 다양한 것들이 있다.)

    JPA 회원 리포지토리
    JPA는 EntityManager를 통해 동작하는데, EntityManager는 엔티티를 관리하는 클래스이다.
    다음과 같이 클래스 및 변수 설정을 해 준다.

    save에서는 persist()를 사용하여 엔티티를 저장한다.

    다음은 조회하는 기능을 가진 메서드들이다.

    find()의 경우 식별자(pk)를 통해서만 데이터를 조회하기 때문에 기본 키가 아닌 다른 값을 통해 조회하기 위해서는 JPQL을 활용해야 한다.
    즉, JPQL은 테이블이 아닌 객체를 검색하는 쿼리로 JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회하는 것이다.

    서비스
    스프링은 해당 클래스의 메서드를 실행할 때 트랜잭션을 시작하고, 메서드가 정상 종료되면 트랜잭션을 커밋한다. 만약 런타임 예외가 발생하면 롤백한다.
    JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.
    따라서 서비스에 트랜잭션을 추가해 준다.

    JPA를 사용하도록 config 변경

    그림과 같이 엔티티 매니저를 추가해 주고 JpaMemberRepository를 빈에 등록한다.

    테스트 코드를 통해 실행시켜 보면 잘 돌아가는 것을 확인할 수 있다.

    스프링 데이터 JPA

    스프링 데이터 JPA는 스프링에서 JPA를 편리하게 사용할 수 있도록 지원해 주는 프로젝트이다.
    리포지토리에 구현 클래스 없이 인터페이스 만으로도 개발을 완료할 수 있다.
    또한 CRUD역시 제공한다.

    환경 설정은 JPA와 동일하다.

    스프링 데이터 JPA 회원 리포지토리

    그림과 같이 인터페이스를 생성해 준다.
    스프링 데이터 JPA는 자동으로 구현체를 생성하여 빈에 등록해 준다. 기본적인 공통 구현체들은 다 생성새 주기 때문에 웬만한 것들을 다 사용할 수 있다.
    추가적으로 공통 구현체가 아닌 것들을 활용하고 싶을 때는 메소드 이름만으로 쿼리를 생성할 수 있다.
    (findByEmail 등 스프링 데이터 JPA가 자동으로 JPQL을 생성해 준다.)

    config 설정

    그림과 같이 간단하게 할 수 있는데, 이는 스프링 데이터 JPA가 스프링 빈으로 자동 등록해 주기 때문이다.

    마찬가지로 테스트 코드를 통해 실행시켜 보면 잘 되는 것을 확인할 수 있다.

    실제로도 jdbctemplate, jpa, spring data jpa 모두 많이 활용되는 것들이기 때문에 좀 더 공부가 필요하다.

    출처 : 인프런 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
    https://www.inflearn.com/course/스프링-입문-스프링부트/lecture/49598?tab=curriculum

    profile
    김민석의 학습 정리 블로그
    post-custom-banner

    0개의 댓글