애플리케이션에서 객체 데이터를 DB에 저장해서 관리해야할 경우, DB로 직접 접속해서 SQL을 호출하고 JDBC를 사용하여 SQL을 직접 실행한 뒤 SQL 결과를 객체로 직접 만들어주어야 한다. 이는 SQL에 의존적이라 변경에 취약해진다.
반복적이고 번거로운 애플리케이션 단에서의 SQL 작업을 줄여주기 위해 ORM 기술들이 등장하게 된다.
ORM(Object-Relational Mapping)은 객체와 DB의 관계를 매핑해주는 도구이다. 자바의 클래스와 DB의 데이터를 매핑하는 과정을 자동으로 처리해준다.
JPA(Java Persistence API)는 자바 ORM 기술에 대한 표준 명세이다. 애플리케이션과 JDBC 사이에서 동작하며 객체를 통해 간접적으로 DB 데이터를 다룰 수 있기 때문에 매우 쉽게 DB 작업을 처리할 수 있다.
스프링 부트에서는 EntityManagerFactory와 EntityManager를 자동으로 생성해준다. application.properties에 DB 정보를 전달해주면 이를 토대로 EntityManagerFactory가 생성된다.
@Transactional
애너테이션을 클래스나 메서드 추가하면 DB 트랜잭션 개념을 적용할 수 있다. 메서드가 호출되면 해당 메서드 내의 모든 DB 연산이 하나의 트랜잭션으로 묶이고 해당 메서드가 정상적으로 수행되면 커밋, 예외가 발생되면 롤백된다.
Spring Data JPA는 JPA를 쉽게 사용할 수 있게 만들어놓은 하나의 모듈이다. JPA를 추상화 시킨 JpaRepository 인터페이스를 구현하는 클래스를 자동으로 생성하여 빈으로 등록해준다. 따라서 인터페이스 구현 클래스를 직접 작성하지 않아도 JPA 기능을 사용할 수 있다.
Spring Data JPA 사용 방법
JpaRepository<"Entity 클래스", "ID의 데이터 타입">을 상속 받는 인터페이스로 선언한다.
public interface UserRepository extends JpaRepository<User, Long>{}