[JPA] JPA란? - JPA, Hibernate, Spring Data JPA

koline·2024년 1월 8일

JPA

목록 보기
1/11

JPA


JPA는 Java 애플리케이션이 관계형 데이터베이스(RDBMS)를 사용하는 방식을 정의한 인터페이스이다. 여기서 인터페이스라는 말은 JPA 라이브러리 자체는 특정한 기능을 하는 것이 아닌 ORM을 사용하기 위한 인터페이스를 모아둔 것이라는 뜻이다.

그러므로 순수 JPA만을 사용해 개발을 한다면 JPA의 핵심 기능을 모아둔 객체인 EntityManager를 사용해 쿼리를 생성하고 실행하는 메서드를 구현해야 한다.

그래서 JPA를 구현한 구체 라이브러리(ORM 프레임워크)를 많이 사용하는데 대표적으로 Hibernate를 주로 사용한다. 또는 Hibernate와 유사하지만 JPA의 구체 클래스가 아닌 Repository 인터페이스를 제공하는 Spring Data JPA를 사용한다.




ORM (Object-Relational Mapping)


ORM 기술은 말 그대로 객체와 관계형 데이터 베이스를 매핑해 주는 기술이다.객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하고, ORM 프레임워크가 중간에서 매핑을 해준다.

SQL 문법을 개발자가 직접 작성하는 MyBatis를 사용할 때의 가장 큰 문제는 코드가 Database에 의존적이게 된다는 점이다.

예를 들어, 특정 테이블의 칼럼명을 변경했다고 가정해보자. 개발자는 해당 칼럼에 해당하는 객체의 속성을 수정해야하고, 해당 칼럼이 사용되는 쿼리를 하나하나 찾아서 수정해야한다.

ORM을 사용할 때 가장 큰 장점은 Database를 객체들이 저장된 저장소로 보고 제어권을 애플리케이션이 가진다는 점이다. 위의 예시와 동일한 경우에 개발자는 심지어 DB의 추가 작업도 필요없이 객체의 속성만 변경함으로써 필요한 작업이 완료되게 된다.

물론 실제로 ORM은 이 설명보다 훨씬 복잡한 작동방식을 가지고 설계단계에서 어떤 기술을 사용할지 결정할 때는 훨씬 많은 점을 고려해야 하겠지만, 이러한 ORM의 특징은 개발자의 생산성과 유지보수성, 코드의 가독성을 상당히 증가시킨다.




Hibernate

가장 대표적인 JPA의 구현체이다. 인터페이스인 JPA를 구현하여 실제로 ORM기능을 할 수 있도록 구현되어 있으며, 개발자는 Hibernate의 메소드를 사용하여 쿼리를 실행할 수 있다.

간단히 말하자면 JPA가 interface이고 HibernateJPA를 실행(implements)하는 class이다.

JPA의 인터페이스들을 직접 구현하기 보다 구현체 라이브러리인 Hibernate를 사용함으로써 생산성과 유지보수성을 높일 수 있고 DB의 종류에 종속적이지 않게 된다. 또한 Java의 객체지향성을 살릴 수 있다 (ORM의 장점)

Spring Data JPA

Spring Data JPAJPA를 쉽게 다룰 수 있도록 Spring에서 제공하는 모듈 중 하나로, Hibernate와 달리 JPA를 한단계 더 추상화 시킨 Repository 인터페이스를 제공한다.

Spring Data JPAGenericDao라는 커스텀 구현체를 제공하는데 이것의 메소드의 명칭으로 JPA 쿼리들을 생성할 수 있다.

@Repository
public interface TestRepository extends JpaRepository<Test, Long> {
	public void findBySeq(long seq);
	
    public int countByRegisterIdAndMode(String registerId, String mode);
    
	List<Test> findBySomethingAndAnotherThingAndDeleted(String something, String anotherThing, String deleted);
	
}

위와 같이 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.


profile
개발공부를해보자

2개의 댓글

comment-user-thumbnail
2024년 5월 9일

정말 도움됬어요

1개의 답글