JPA는 개발자가 직접 SQL을 작성하지 않고, JPA API를 활용해 데이터베이스를 저장하고 관리할 수 있게 도와준다. JPA는 스프링에서 많이 활용되지만, 스프링이 제공하는 API가 아닌 자바에서 제공하는 API다. 자바 ORM 기술에 대한 표준 명세로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
ORM 프레임워크는 자바 객체와 관계형 데이터베이스를 매핑해준다. 즉, 객체가 DB 테이블로 매핑되어 SQL을 작성하지 않고도 데이터를 조작할 수 있는 방식이다. 이를 통해 개발자는 복잡한 SQL 대신 직관적인 메소드로 데이터베이스 작업을 수행할 수 있어 생산성을 높일 수 있다.
ORM 프레임워크의 종류로는 Hibernate, EclipseLink, DataNucleus 등이 있으며, 스프링 부트에서는 spring-boot-starter-data-jpa
패키지를 사용하여 Hibernate를 활용한다.
JPA는 애플리케이션과 JDBC 사이에서 동작하며, JPA를 사용하면 JDBC API를 통해 SQL이 호출되어 데이터베이스와 상호작용한다. 즉, JPA를 익히면 DB 쿼리 작성 없이도 데이터베이스를 관리할 수 있다.
SQL 중심의 개발은 CRUD 작업이 반복적으로 이루어진다. 하나의 테이블을 생성할 때마다 이에 해당하는 CRUD를 전부 만들어야 하고, 이후 컬럼이 추가되면 관련 SQL도 전부 수정해야 하는 번거로움이 있다. 반면 JPA를 사용하면 객체 중심으로 개발이 가능해, 이러한 번거로움을 줄일 수 있다.
개발자가 직접 SQL 쿼리를 작성하지 않아도 되기 때문에, JPA 메소드만으로 데이터를 다루는 것이 가능하다. 이로 인해 개발자에게 높은 생산성을 제공해준다.
기존의 SQL 방식은 쿼리가 변경되면 관련된 DTO 필드도 함께 수정해야 하지만, JPA에서는 엔티티 클래스 정보만 변경하면 되므로 유지보수가 더 쉽다.
JPA는 동일한 쿼리에 대해 캐시 기능을 지원한다. 이를 통해 SQL을 직접 작성하는 것보다 성능 효율을 높일 수 있다.
JPA는 실시간 쿼리에 최적화되어 있지만, 통계 처리와 같이 복잡한 쿼리가 필요할 경우 MyBatis와 같은 Mapper 방식을 사용하는 것이 더 효율적일 수 있다.
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// 기본 생성자
public User() {}
// 생성자
public User(String name, String email) {
this.name = name;
this.email = email;
}
// Getter와 Setter
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
위 코드는 JPA를 사용해 User 엔티티 클래스를 정의한 것이다. 이 클래스는 데이터베이스의 테이블과 매핑되어 데이터를 다룬다.
JPA는 객체 중심의 개발을 가능하게 하고, 생산성을 높여주며 유지보수에도 용이하다. 다만, 복잡한 쿼리 작업에는 기존 SQL Mapper 방식이 더 효율적일 수 있으므로 상황에 따라 적절한 도구를 사용하는 것이 중요하다.