💡 JPA(Java Persistent API)란?
- JPA는 자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세를 뜻합니다.
- ORM 기술이란 말 그대로 객체와 관계형 데이터베이스를 매핑해주는 기술을 말합니다.
- 즉, 객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하고, ORM 프레임워크가 중간에서 매핑을 해주는 것을 의미합니다.
- 이러한 JPA는 인터페이스의 모음 즉, 단순한 명세이기 때문에 구현이 없습니다.
- 그저 자바 애플리케이션에서 관계형 데이터베이스를 어떻게 사용할지를 정의하는 하나의 방법일 뿐입니다.
- 따라서 이러한 JPA의 구현체가 있어야 JPA를 사용할 수 있습니다.
💡 JPA를 사용하는 이유
- SQL문이 아닌 메서드를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데에만 집중할 수 있습니다.(내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경 쓰지 않아도 됨)
- Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높일 수 있습니다.
- 객체 지향적인 코드 작성이 가능합니다. 따라서 오직 객체 지향적 접근만 고려하면 되기 때문에 생산성이 증가합니다.
- 매핑하는 정보가 Class로 명시 되어있기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리합니다.
- 예를 들어, 기존 방식에서 MySQL 데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생기게 되는데, 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없어집니다.
💡 Hibernate
- Hibernate는 JPA를 구현한 구현체 중 하나입니다.
- 개발된 지 10년이 넘었으며 대중적으로 많이 이용되는 JPA 구현체입니다.
- JPA의 핵심인
EntityManagerFactory
,EntityManager
,EntityTransaction
등을 상속받아 구현하며, 내부적으로 JDBC를 이용해 관계형 데이터베이스와 커넥션을 맺고 상호작용합니다. - JPA를 구현하는 다른 구현체들로는 EclipseLink나 DataNucleus 등이 있습니다
- 만약 JPA를 구현하는 구현체들이 마음에 들지 않는다면 개발자가 직접 JPA 구현체를 만들어 사용할 수도 있습니다.
💡 Spring Data JPA
- Spring Data JPA는 JPA를 더 쉽게 사용하기 위한 Spring Data 프레임워크의 한 파트로, JPA를 이용한 구현체를 한 단계 더 추상화시켜 더 쉽고 간편하게 JPA를 이용한 프로젝트를 개발할 수 있게 해 주는 Spring 모듈입니다.
- 필자는 Spring으로 개발을 하면서 강의 내용을 따라하는 경우를 빼고는 단 한 번도
EntityManager
를 직접 다뤄본 적이 없습니다. - DB에 접근할 필요가 있는 대부분의 상황에서는 Repository를 정의하여 사용했기 때문입니다. 아마 다른 분들도 다 비슷할 것이라 생각합니다.
- 이 Repository가 바로 Spring Data JPA의 핵심입니다.
- 위에서 Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다고 했습니다.
- 이는 JPA를 한 단계 더 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어지는 것으로, 사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해주는 것입니다.
- Spring Data JPA가 JPA를 추상화했다는 말은, Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것입니다.
- 예를 들어, Repository 인터페이스의 기본 구현체인
SimpleJpaRepository
의 코드를 보면 아래와 같이 내부적으로EntityManager
를 사용하고 있는 것을 볼 수 있습니다.
package org.springframework.data.jpa.repository.support;
import ...
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
private final EntityManager em;
public Optional<T> findById(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
Class<T> domainType = getDomainClass();
if (metadata == null) {
return Optional.ofNullable(em.find(domainType, id));
}
LockModeType type = metadata.getLockModeType();
Map<String, Object> hints = getQueryHints().withFetchGraphs(em).asMap();
return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
}
// Other methods...
}
💡 JPA와 Hibernate 그리고 Spring Data JPA
- 아래 그림은 위의 내용을 요약하여 JPA, Hibernate, 그리고 Spring Data JPA의 전반적인 개념을 표현한 것입니다.
- 아래 그림을 이해하여 셋을 혼동하지 않고 사용하는 것이 중요합니다.
📌 References
'🥑 Web Technoloy' 카테고리의 다른 글
URI와 URL (0) | 2023.06.06 |
---|---|
JPQL과 QueryDSL (0) | 2023.06.04 |
Lombok이란? (1) | 2023.06.04 |
Spring AOP(Aspect Oriented Programming) (0) | 2023.06.03 |
SpringBoot에서 SMTP를 활용한 메일 전송 구현하기 (0) | 2022.11.16 |