본문 바로가기

개발중/Java Persistence API (JPA)

[JPA] JPA 의 장점이 뭔지 물어봤을 때 잘 대답하지 못했다. . .

728x90
반응형

JPA(Java Persistence API)는 자바 ORM 기술에 대한 API 표준이다.

 

ORM이란 Object Realational Mapping의 약자로 객체와 관계형 데이터베이스를 매핑해주는 것을 말한다.

 

그렇다면 ORM기술은 왜 나왔을까?

JPA를 공부하기 전에 관계형 데이터베이스의 문제점을 먼저 알아보자.

 

상품 데이터를 관리하는 Item 클래스가 있고, 상품 데이터를

관계형 데이터베이스에서 관리하기 위해서 우리는 SQL문을 사용한다.

 

SQL 중심 개발의 문제점은 개발자가 CRUD라고 불리는

INSERT, UPDATE, SELECT, DELETE 문을 작성해서

객체를 관계형 데이터베이스에 넣어주고 가져오는 작업을 하는 것이다.

 

즉, 자바 객체를 SQL을 통해 데이터베이스에 관리하게 하고

데이터베이스에 저장된 데이터를 자바 애플리케이션에서 사용하려면

SQL을 통해 다시 자바 객체로 변환하는 반복적인 작업을 해야한다.

 

개발자가 SQL을 매핑하는 역할을 반복해야 한다는 의미이다.

 

또한 객체와 관계형 데이터베이스의 패러다임의 불일치가 가장 큰 문제이다.

 

자바는 객체 지향 패러다임으로 만들어졌고,

관계형 데이터베이스는 데이터를 정규화해서 잘 보관하는 것을 목표로 한다.

 

객체를 데이터베이스에 넣기 위해서는 SQL문을 통해 변환해서 저장해야하고,

데이터베이스에서 객체를 다시 꺼내오기 위해서는 복잡한 SQL문을 작성해야 한다.

 

결국 객체를 단순히 데이터 전달 목적으로 사용할 뿐 객체지향적으로 프로그래밍을 할 수가 없다.

이는 객체지향과 관계형 데이터베이스 간의 패러다임이 불일치하기 때문이다.

 

이를 해결하기 위해서 나온 기술이 ORM이다.

객체는 객체지향적으로, 데이터베이스는 데이터베이스 대로 설계를 한다.

 

그리고 ORM은 중간에서 2개를 매핑하는 역할을 한다.

이를 통해 개발자는 소스를 조금 더 객체지향적으로 설계하고 비즈니스 로직에 집중할 수 있다.

 

JPA는 위에서 설명한 ORM 기술의 표준 명세로 자바에서 제공하는 API이다.

즉, JPA는 인터페이스고

이를 구현한 대표적인 구현체로 Hibernate, EclipseLink, DataNucleus, OpenJpa, TopLink 등이 있다.

JPA 인터페이스를 구현한 가장 대표적인 오픈소스가 Hibernate(하이버네이트)이다.

실질적인 기능은 하이버네이트에 구현돼 있다.

 

 

JPA 사용 시 장점

  • 특정 데이터베이스에 종속되지 않음
    • 애플리케이션 개발을 위해 데이터베이스로 오라클(Oracle)을 사용하여 개발을 진행했다고 가정해보자.
    • 만약 오라클을 오픈소스인 MariaDB로 변경한다면 데이터베이스마다 쿼리문이 다르기 때문에 전체를 수정해야 한다.
    • 따라서 처음 선택한 데이터베이스를 변경하기 어렵다.
    • 하지만 JPA는 추상화한 데이터 접근 계층을 제공한다.
    • 설정 파일에 어떤 데이터베이스를 사용하는지 알려주면 얼마든지 데이터베이스를 변경할 수 있다.
  • 객체지향적 프로그래밍
    • JPA를 사용하면 데이터베이스 설꼐 중심의 패러다임에서 객체지향적으로 설계가 가능하다.
    • 이를 통해 좀 더 직관적이고 비즈니스 로직에 집중할 수 있도록 도와준다.
  • 생산성 향상
    • 데이터베이스 테이블에 새로운 컬럼이 추가되었을 경우, 해당 테이블의 컬럼을 사용하는 DTO 클래스의 필드도 모두 변경해야 한다.
    • JPA에서는 테이블과 매핑된 클래스에 필드만 추가한다면 쉽게 관리가 가능하다.
    • 또한 SQL문을 직접 작성하지 않고 객체를 사용하여 동작하기 때문에
    • 유지보수 측면에서 좋고 재사용성도 증가한다.

 

JPA 사용 시 단점

  • 복잡한 쿼리 처리
    • 통계 처리 같은 복잡한 쿼리를 사용할 경우는 SQL문을 사용하는 게 나을 수도 있다.
    • JPA에서는 Native SQL을 통해 기존의 SQL문을 사용할 수 있지만
    • 그러면 특정 데이터베이스에 종속된다는 단점이 생긴다.
    • 이를 보완하기 위해서는 SQL과 유사한 기술인 JPQL을 지원한다.
  • 성능 저하 위험
    • 객체 간의 매핑 설계를 잘못했을 때 성능 저하가 발생할 수 있으며,
    • 자동으로 생성되는 쿼리가 많기 때문에 개발자가 의도하지 않는 쿼리로 인해 성능이 저하되기도 한다.
  • 학습 시간
    • JPA를 제대로 사용하려면 알아야 할 것이 많아서 학습하는 데 시간이 오래 걸린다
728x90
반응형