본문 바로가기
개발공부/개념정리

JPA(Java Persistence API)

by parkman

1. JPA

  • 자바 진영에서 ORM(Object - Relational Mapping) 기술 표준으로 사용되는 인터페이스 모음
  • 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크(실제적으로 구현 X)
  • JPA를 구현한 대표적인 오픈소스로는 Hibernate가 있다.

# ORM(Object - Relational Mapping)

  • 객체와 관계형 데이터베이스의 데이터를 자동으로 Mapping 시켜주는 것을 의미 한다.
  • 객체지향프로그래밍(클래스 사용) / 관계형데이트베이스(테이블 사용)
    객체 모델과 관계형 모델간의 존재하는 불일치를 ORM을 통해 객체간의 관계를 바탕으로
    SQL을 자동으로 생성하여 불일치를 해결한다.

2. 동작 과정

  • 애플리케이션과 JDBC 사이에서 동작한다.
  • JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신

3. 사용하는 이유

  • SQL 중심적인 개발에서 객체중심적인 개발이 가능하다.
  • 생산성이 증가
    - DDL문 자동생성
    - 간단한 메서드로 CRUD 가능
    - SQL을 작성하고 JDBC API를 사용하여 반복적인 일을 대신 처리해준다.
  • 유지보수가 쉽다
    - 기존 : 필드 변경 시 모든 SQL 수정
    - JPA : 필드만 추가하면 되고, SQL은 JPA가 처리한다.
  • RDBMS 종류와 무관한 코딩
    - 객체 중심으로 동작하기 때문에 Oracle, Mysql, Mssql과 같이 서로 다른 벤더사 데이터베이스를 사용하려고 할 때
      문법을 바꿔줘야하는 수고를 줄일 수 있다. 
  • Object와 RDB간의 패러다임 불일치 해결
    - 상속 / 연관관계 / 객체 그래프 탐색 / 비교하기 같은 패러다임 불일치를 해결한다.
    - Java의 존재하는 상속관계에서 객체의 상속관계를, 지원하지 않는 데이터베이스에서 JPA는 아래의 방식으로 해결

 

4. 장 / 단점

  • 장점
    1. SQL문이 아닌 메서드를 통해 DB 조작이 가능하기 떄문에, 개발자는 객체 모델을 이용하여 비지니스 로직을 구성하
        는데만 집중이 가능하다.
    2. Query와 같이 필요한 선어문 / 할등 등의 부수적인 코드가 줄어들어 각종 객체에 대한 코드를 별도로 작성하여 코드
        의 가독성을 높일 수 있다.
    3. 객체지향적인 코드 작성이 가능하다.
    4. 유지보수 및 리팩토링이 유리하다.
  • 단점
    1. 프로젝트의 규모가 크고 복잡하며 설계가 잘못된 경우에는 속도 저하 및 일관성을 무너뜨리는 문제점이 발생할 수
        도 있다.(개발자가 의도하지 않는, 자동으로 생성된 Query로 인해 성능이 저하되기도 함)
    2. 복잡하고 무거운 Query문은 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL 문을 쓰는게 나은 상황이 발생
        할 수도 있다.
    3. 학습비용이 비싸고 학습시간이 오래걸린다.
    4. JPA는 통계처리와 같이 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화되어 있다. 물론 JPA에서 제공하는 Native query기능을 사용할 수 있지만, 통계처럼 복잡하고 미세하게 쿼리 작업이 필요하다면 Mybatis와 같은 Mapper 방식을 사용하는 것이 더 효율적일 수 있다.
    Spring에서 JPA와 Mybatis를 혼용해서 사용할 수 있기 때문에 필요에 따라 적절한 방식으로 선택해가면서 사용하면 될 것 같다.


5. 스프링에서 흔히 사용하는 JPA는 JPA를 이용하는 Spring-data-jpa 프레임워크이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

https://baby9235.tistory.com/67

728x90
반응형
LIST

'개발공부 > 개념정리' 카테고리의 다른 글

데드락(DeadLock)  (0) 2022.06.19
TDD(Test-driven development)  (0) 2022.06.18
Spring - AOP?  (0) 2022.06.17
JAVA 제네릭(Generic)  (0) 2022.06.16
OAuth  (0) 2022.06.16