JPA는 Java Persistence API의 약자로, 자바 어플리케이션에서 데이터베이스와 상호작용하기 위한 표준이다.
ORM 기술을 기반으로 동작하며, 자바 객체와 데이터베이스 테이블 간의 매핑을 간단히 처리할 수 있도록 도와준다.
Spring Data JPA는 JPA 위에서 동작하며, 레포지토리 인터페이스를 통해 데이터 접근 계층을 쉽게 구현할 수 있도록 도와준다.
JPA의 기본은 Entity이다. 엔티티는 데이터베이스 테이블과 1:1로 매핑되는 자바 클래스이다. 그럼 @Entity, @Column 어노테이션을 이용해 엔티티 클래스를 정의해보자.
@Entity 어노테이션은 해당 클래스가 JPA에서 관리되는 엔티티임을 명시한다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String name;
@Column(unique = true, nullable = false)
private String email;
// 기본 생성자
protected User() {}
public User(String name, String email) {
this.name = name;
this.email = email;
}
}
@Column 어노테이션은 데이터베이스 컬럼의 속성을 설정한다. (생략하면 기본 설정이 적용)
Spring Data JPA는 JpaRepository 인터페이스를 통해 데이터 접근 계층을 간단히 구현할 수 있도록 도와준다.
Repository는 데이터베이스에 접근하는 로직을 추상화한 인터페이스이다.
JpaRepository는 CRUD 메서드를 기본으로 제공하며, 복잡한 쿼리도 메서드 이름만으로 작성할 수 있다.
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
복잡한 조건이 필요하면 @Query를 활용해 커스텀 쿼리를 작성할 수 있다.
@Query("SELECT u FROM User u WHERE u.email = :email AND u.name = :name")
Optional<User> findByEmailAndName(@Param("email") String email, @Param("name") String name);