본문 바로가기
코딩 공부/web & Java

[Spring] JPA

by 현장 2023. 10. 17.

JPA(Java Persistence API)

자바의 ORM을 위한 표준 기술로 Hibernate, Spring JPA, EcliplseLink 등 과 같은 구현체가 있고 이것의 표준 인터페이스가 JPA 입니다.

ORM(Object-Relational Mapping)
객체와 RDBMS를 자동으로 매핑해주는 것을 말한다. (객체 ↔ 관계형 데이터베이스)
기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.

장점

  • QL문이 아닌 Method를 통해 DB를 조작할 수 있어,비즈니스 로직을 구성하는데만 집중할 수 있습니다.
  • Query와 같이 필요한 부수적인 코드가 줄어들어 코드의 가독성이 높아집니다.
  • 객체지향적인 코드 작성이 가능하면 되기때문에 생산성 증가합니다.
  • 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있습니다.
  • 유지보수 및 리팩토링에 유리합니다. (ex. DB를 바꿔도 코드 수정을 하지 않아도 됩니다.)

단점

  • 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있습니다.
  • 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있습니다.
  • 학습비용이 높습니다.

예시코드

// Entity

@Entity
public class Course {

    @Id
    private long id;
    private String name;
    private String author;
	
    // 생략
}
// Repository

@Repository
@Transactional
public class CourseJpaRepository {

    @PersistenceContext
    private EntityManager entityManager;

    public void insert(Course course) {
        entityManager.merge(course);
    }

    public Course findById(long id) {
        return entityManager.find(Course.class, id);
    }

    public void deleteById(long id) {
        Course course = entityManager.find(Course.class, id);
        entityManager.remove(course);
    }
}

Spring Data JPA

Spring Data JPA는 JPA를 쓰기 편하게 만들어놓은 모듈입니다.

public interface CourseSpringDataJpaRepository extends JpaRepository<Course, Long> {

    List<Course> findByAuthor(String author);

    List<Course> findByName(String name);

}

위와 같이 사용하며 자동으로 findById 등등 메서드가 이미 만들어져 있고 다른 값으로 찾고 싶은경우 위와 같이 findBy(값)이라는 규칙과 매개 변수를 실제 테이블과 맞춰줘야 합니다.

 

Hibernate

JPA는 기술 명세를 정의하고 인터페이스입니다. 엔티티를 정의하는 방식을 정의하며 이를 정의할때 @Entity를 사용합니다. 즉 jakarta.persistence.Entity를 사용하는데 JPA  API를 사용한 것입니다. JPA를 이용하면 엔터티 정의, 속성 매핑 그리고 EntityManager를 활용하는 것까지 가능해집니다. 그리고 Hibernate는 JPA에서 인기가 많은 구현체로 javax.persistence.EntityManager 와 같이 구현한 인터페이스로 이를 통해 JPA는 객체를 테이블로 매핑하는 방식을 정의하고 Hibernate는 그걸 구현하게 됩니다.

 

따라서 JPA를 구현하는 구현체 중 하나므로 반드시 사용해야 되는 것이아니라 사용을 해도되고 다른 구현체를 사용해도 됩니다.