Java - JPA (Java Persistence API)

idkwhattodo·2022년 8월 29일
0

Java 개념

목록 보기
17/19
post-thumbnail

1. ORM (Object-Relational Mapping)

  • 어플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑하는 것
  • 즉, 객체와 RDB를 매핑해주기 때문에 SQL문을 작성할 필요가 없으며, 어떤 RDB를 사용하여도 무관함
  • 기술적인 의미로는 어플리케이션의 객체를 RDB 테이블에 영속화 해주는 것
  • 이러한 역할을 위해 Java는 JDBC를 지원하는데, 이는 매핑 작업을 개발자가 일일히 수행해야하는 단점이 있기 때문에 ORM을 주로 사용함

1-1. ORM의 장점

  • SQL문이 아닌 Method로 DB를 조작하여 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데에 집중할 수 있음
  • Query와 같은 선언문, 할당 등의 부수적인 코드가 줄어들고, 각종 객체에 대한 코드를 별도 작성하여 코드의 가독성을 높임
  • 객체지향 접근만 고려하여, 객체지향적인 코드 작성이 가능함
  • 매핑하는 정보가 Class로 명시되어 있어 ERD를 보는 의존도를 낮추고, 유지보수 및 리팩토링에 유리함

1-2. ORM의 단점

  • 프로젝트 설계가 잘못된 경우, 속도 저하 및 일관성을 저해할 수 있음
  • 복잡하고 무거운 Query는 속도를 위해 튜닝이 필요하기 때문에 결국 SQL문을 사용해야 할 수 도 있음

2. JPA (Java Persistence API)

  • Java ORM 기술에 대한 API 표준 명세로, 어플리케이션과 JDBC 사이에서 SQL을 호출하고 DB와 통신하는 역할을 함
  • JPA가 제공하는 API를 사용하면 객체를 DB에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하지 않아도 됨
  • JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체가 자동으로 Mapping 됨
  • JPA는 내부적으로 JDBC API를 활용하는데, 개발자가 직접 JDBC API를 활용하면 패러다임 불일치, SQL 의존성 등으로 인해 효율성이 떨어지게됨. 이 때, JPA를 활용한다면 모든 SQL에 대해 개발자 대신 JPA가 자동으로 해결해 준다는 점에서 생산성을 크게 높여줌

※ Hibernate

  • ORM 프레임워크 중 가장 많이 사용되는 오픈소스. Hibernate 기반으로 만들어진 ORM 기술 표준이 JPA이며, 즉, JPA라는 ORM 기술 표준을 구현한 것이 Hibernate이므로, JPA를 사용하려면 Hibernate를 사용하면 된다.

2-1. JPA의 장점

  • 1차캐시, 쓰기지연, 변경감지, 지연로딩을 제공하여 성능상 이점이 있음
  • 코드레벨로 관리되기 때문에, 사용이 편리하고 코드 생산성이 높음
  • RDB에 종속적이지 않으므로, 특정 쿼리를 사용하지 않아 추상적으로 기술 구현이 가능함
  • 컴파일 타임에 오류를 확인할 수 있음
  • 엔티티로 관리되므로 스키마 변경시 엔티티만 수정하게 되면 엔티티를 사용하는 관련 쿼리는 자동으로 변경된 내역이 반영됨
  • 객체지향적으로 데이터를 관리할 수 있음
  • 부족한 부분은 다양한 쿼리 빌더와 호환하여 보안할 수 있음

2-2. JPA의 단점

  • JPA만 사용하여 복잡한 연산을 수행하기에는 다소 무리가 있음 (로직이 복잡하거나 불필요한 쿼리가 발생할 수 있다.)
  • 초기에는 생산성이 높을 수 있으나 점차 사용하다 보면 성능상 이슈가 발생할 수 있음 (N+1, FetchType, Proxy, 연관관계)
  • 고도화 될수록 학습 곡선이 높아질 수 있음 (성능 이슈의 연장선으로 해결 방안에 따라 복잡한 내부 로직을 이해해야 할 필요가 있다)

※ MyBatis (SQL Mapper)

  • SQL Mapper를 지원해주는 프레임워크로, SQL문을 이용하여 RDB에 접근하고 데이터를 객체화시켜줌
  • SQL을 직접 작성하여 Query 수행 결과를 객체와 매핑하고, Query는 xml 파일에 작성
  • Query를 직접 작성하므로 복잡한 Query나 최적화된 Query를 구현할 수 있으나, 스키마 변경 시 Query를 직접 수정해주어야 함
  • 객체와 Query를 모두 관리하고, CRUD 메소드를 직접 구현해야하는 단점이 있음
  • 컴파일 시 오류를 확인 할 수 있는 JPA와 달리, 런타임 시 오류를 확인할 수 있음
  • 학습이 어려운 JPA와 달리, Query를 작성할 수 있다면 상대적으로 학습 난이도가 낮음
profile
공부겅부

0개의 댓글