JPA, 하이버네이트(Hibernate), Spring Data JPA

Jobmania·2023년 5월 15일
0

JPA (Baeldung 실습)

목록 보기
2/3

JPA(Java Persistence API)

  • JPA는 단순한 기술 명세서이다.
  • JPA는 말 그대로 인터페이스라는 점. JPA는 특정 기능을 하는 라이브러리가 아니다.
package javax.persistence;

import ...

public interface EntityManager {

    public void persist(Object entity);

    public <T> T merge(T entity);

    public void remove(Object entity);

    public <T> T find(Class<T> entityClass, Object primaryKey);

    // More interface methods...
}

JDBC

  • 자바 프로그래밍 언어와 다양한 데이터베이스 SQL 또는 테이블 형태의 데이터 사이에 독립적인 연결을 지원하는 표준, DB 작업을 위한 표준이
  • DBMS 회사들이 JDBC 인터페이스를 구현하여 제공하며 이를 JDBC 드라이버라고 한다.
  • 결국 JDBC 드라이버란 DBMS 회사들이 자신들의 데이터베이스 시스템에 접근 할 수 있도록 표준 JDBC 인터페이스에 명시된 메소드들을 구현한 것이라 볼 수 있다.
  • 따라서 JDBC API를 사용할 경우 하나의 자바 응용 프로그램만으로 JDBC 드라이버를 제공하는 어떤 종류의 관계형 DBMS에도 접근이 가능하고, 사용자들은 특정 회사의 데이터베이스의 정확한 사용 방법을 몰라도 JDBC API만 알면 데이터베이스 조작이 가능함.

    즉 데이터베이스에 의존적인 개발을 피할 수 있다.(데이터 베이스 갈아 끼우기 가능)

하이버네이트(Hibernate)

  • 하이버네이트가 ORM(Object Relational Mapping) 프레임워크의 한 종류이다.
  • JPA의 구현체로, JPA 인터페이스를 구현하며, 내부적으로 JDBC API를 사용한다
  • 마치 JPA, 하이버네이트의 관계는 interface와 interface를 구현한 class
  • Hibernate의 작동 방식이 마음에 들지 않는다면 언제든지 DataNucleus, EclipseLink 등 다른 JPA 구현체를 사용해도 되고, 심지어 본인이 직접 JPA를 구현해서 사용할 수도 있다.

ORM의 장점

  • 생산성
    SQL을 직접 사용하지 않고, 메서드 호출만으로 쿼리가 수행되며 SQL 반복 작업을 하지 않음.
  • 유지보수
    테이블 컬럼이 변경되었을 때, 테이블과 관련된 DAO의 파라미터, 결과, SQL 등을 대신 수행하여. 이로 인해 유지보수 측면에서 높아짐.
  • 패러다임 불일치 해결
    상속, 연관 관계, 객체 그래프 탐색, 비교 등 객체와 관계형 데이터베이스와의 패러다임 불일치를 해결할 수 있음.
  • 특정 벤더에 종속적이지 않음
    JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지를 알려주기만 하면 얼마든지 DB를 바꿀 수 있음.

ORM의 단점

  • 성능
    SQL을 직접 작성하는 것보다 메서드 호출만으로 쿼리를 수행한다는 것은 성능이 떨어질 수 있으나 지속적으로 개선 중
  • 세밀성
    메서드 호출로 DB 데이터를 조작 하기 때문에 세밀함이 떨어집니다.복잡한 통계 분석 쿼리를 메서드만으로 해결하는 것은 힘든 일입니다.이것을 보완하기 위해 SQL과 유사한 기술인 JPQL을 지원 -> 즉 매핑도구를 안쓰고 쿼리를 날리는 Native Query
  • 러닝커브
    JPA를 잘 사용하기 위해서는 알아야 할 것이 많다.

Spring Data JPA

  • Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다. 이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다. 사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.
  • Spring Data JPA가 JPA를 추상화했다는 말은, Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것이다.

간단한 설정

# 콘솔창에 출력되는 쿼리를 가독성 좋게 포맷팅
spring.jpa.properties.hibernate.format_sql= true

# 데이터베이스 초기화 전략 - (none, create, create-drop, update, validate)
# validate - 정상적인 매핑관계만 확인
spring.jpa.hibernate.ddl-auto = validate 

# sql 방언설정, 오라클db사용한다면 oracle 로 변경하면됨
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

# 쿼리에 물음표로 출력되는 바인드 파라미터 출력,
#  즉, Query 출력 시 데이터 값도 출력
logging.level.org.hibernate.type.descriptor.sql

none - 엔티티가 변경되더라도 데이터베이스를 변경하지 않는다.
update - 엔티티의 변경된 부분만 적용한다.
validate - 변경사항이 있는지 검사만 한다.
create - 스프링부트 서버가 시작될때 모두 drop하고 다시 생성한다.
create-drop - create와 동일하다. 하지만 종료시에도 모두 drop 한다.
🎆개발 환경에서는 보통 update 모드를 사용하고 운영환경에서는 none 또는 validate 모드를 사용한다.

참고1
참고2
참고3
참고4

profile
HelloWorld에서 RealWorld로

0개의 댓글