JPA

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

  • SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.

  • 개발 생산성을 크게 높일 수 있다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // implementation 'org.springframework.boot:spring-boot-starter-jdbc' 
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'  // jpa에 jdbc도 포함되어 있다.
    runtimeOnly 'com.h2database:h2'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

JPA를 사용하려면 일단 Entity를 매핑해야 한다. jpa는 인터페이스고 구현체로 hibernate가 있다. 따라서 hibernate 라이브러리가 필요하다.

JPA는 ORM(Object Relational Mapping) 즉, 객체와 데이터베이스 테이블을 매핑해주는 것이다.

// 테이블을 매핑해주는 애너테이션 = JPA가 관리하는 Entity라는 표시 
@Entity
public class Member {

  // PK 매핑
  @Id
  // 아이디를 디비에서 자동으로 만들어주는 전략을 설정한다.
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String name;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

스프링 데이터 JPA

repository에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있다. 기본 CRUD 기능도 모두 제공한다. 스프링 부트와 JPA 위에 스프링 데이터 JPA라는 프레임워크를 더하면 핵심 비즈니스 개발에 집중할 수 있다.

스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술이다. 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 한다.

// Entity와 Id 타입을 맞춰 JpaRepository를 상속한 인터페이스를 만들어야 한다. 
// 그럼 스프링 데이터 JPA가 SpringDataJpaMemberRepository 빈을 자동으로 만들어준다.
// 우리가 만들었던 MemberRepository도 상속한다.
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>,
    MemberRepository {
  // 이렇게만 선언해주면 구현할 필요없이 쓸 수 있다.
  Optional<Member> findByName(String name);
}

스프링 데이터 JPA 기본 기능

인터페이스를 통해 기본적인 CRUD와 페이징 기능을 쓸 수 있다. 하지만 name, email처럼 비즈니스 로직에 따라 다양해지는 내용은 인터페이스가 공통으로 제공할 수가 없다. 그래서 스프링 데이터 JPA는 findByName(), findByEmail()처럼 규칙에 따라 작성하면 JPQL로 select m from MEmber m where m.name = ?이라는 쿼리를 날려준다.

실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 QueryDsl이라는 라이브러리를 사용한다. QueryDsl을 사용하면 쿼리를 자바 코드로 안전하게 작성할 수 있다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나 JdbcTemplate을 사용하면 된다.

Last updated