본문 바로가기
JPA

JPA를 배워야 하는 이유

by 왈레 2022. 4. 6.

JPA를 배워야 하는 이유

1. SQL 중심적인 개발의 문제점

  • 지루한 코드를 무한반복 개발해야한다.
  • 자바 객체를 SQL로 SQL을 자바객체로 매핑해주어야 한다
사실상 개발자는 SQL Mapper의 역할을 하게 된다.
class Member {
  private String userId;
  private String username;
}
INSERT INTO MEMBER VALUES (.....)

 

만약 Member 테이블에 필드가 추가되면, Member 테이블과 관련된 모든 쿼리는 수정이 필요하다.

 

 

2. 패러다임의 불일치

객체 vs 관계형 데이터베이스
‘객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.’

 

객체를 영구 보관하는 다양한 저장소로 RDB, NoSQL, File 등이 있지만 현실적인 대안은 관계형 데이터베이스이다.

객체와 관계형 데이터베이스는 근본적으로 차이가 있기때문에 데이터 중심형 개발을 할 수 밖에없다.

JPA는 이 두 사이를 이어주는 다리 역할을 한다.

 

JPA

  • Java Persistence API
  • 자바 진영의 ORM 기술 표준
  • JPA는 반복적인 CRUD 작업을 생략하게 해준다.
  • JPA는 영속성 컨텍스트를 가지고 있다.
  • JPA는 DB와 OOP의 불일치성을 해결하기 위한 방법론을 제공한다.
  • JPA는 유지보수가 용이하다.
  • JPA는 OOP관점에서 모델링을 할 수 있게 해준다.
  • JPA는 자바 컬렉션 다루듯 사용할 수 있다.
  • 방언(Dialect) 처리가 용이하여 Migration하기 좋음 유지보수에도 좋다.

 

 

ORM이란?

  • Object-relational mapping(객체 관계 매핑)
  • 객체는 객체대로 설계
  • 관계형 데이터베이스는 관계형 데이터베이스대로 설계
  • ORM 프레임워크가 중간에서 매핑
  • 대중적인 언어에는 대부분 ORM 기술이 존재

 

영속성 컨텍스트란?

영속성 컨텍스트는 자바와 DB사이에 존재하는 개념이다.

자바쪽에서 컨텍스트에게 어떤 데이터를 요청하면 컨텍스트는 DB로부터 데이터를 받아 컨텍스트에 올린다.

그리고 데이터를 자바쪽으로 넘긴다. 그러면 데이터는 자바, 컨텍스트 두 군데 존재하게 되는데 2개의 데이터는 동기화 되어있다.

자바쪽에 데이터를 변경하면 컨텍스트의 데이터도 변경된다.

그리고 컨텍스트에 존재하는 데이터를 DB 넣으면 DB 데이터가 최종적으로 변경된다.

 

JPA는 애플리케이션과 JDBC 사이에서 동작

 

JPA 표준 명세

 

JPA는 인터페이스고 JPA를 구현하는 구현체중 가장 많이 사용되는 것은 하이버네이트이다.

 

JPA 구동방식 

  • Persistence 클래스에서 시작
  • persistence.xml에서 설정정보를 읽고
  • EnitytyManagerFactory 라는 클래스를 만든다.
  • 그리고 EnitytyManagerFactory EntityManger 만들어낸다.

 

JPA 사용방법

EntityManagerFactory emf = Persistence.createEntityManagerFactory("xml 설정 값");  
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();
tx.begin();

try {
    Member member = new Member();
    member.setId(2L);
    member.setName("B");

    em.persist(member);
    tx.commit();
} catch (Exception e) {
    tx.rollback();
} finally {
    em.close();
}
emf.close();

※ Notes ※

  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
  • 엔티티 매니저는 쓰레드간에 공유X (요청이 들어오면 생성하고 사용하고 바로 버려야 한다).
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

 

JPQL

  • JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어 제공 (SQL을 추상화했기때문에 특정 DB SQL에 의존 x)
  • JPQL은 DB 테이블이 아닌 객체를 대상으로 쿼리를 짠다.
  • JPQL로 쿼리를 짜면 각각의 DB의 방언에 맞게 변환해준다.

 

JPA 가장 문제는 검색 쿼리같은 거다.

• 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. (JPA 사상이 깨지지않기 위해서)

• 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능

• 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요한데 SQL 아닌 JPQL 사용

 

※ 출처: 인프런 김영한 JPA, 이지업 최주호 데어프로그래밍

'JPA' 카테고리의 다른 글

JPA - 필드와 컬럼 매핑  (0) 2022.04.09
JPA - 객체와 테이블 매핑 feat. 데이터베이스 스키마 자동생성  (0) 2022.04.08
JPA - 준영속, 병합  (0) 2022.04.08
JPA - 플러시  (0) 2022.04.08
JPA - 영속성 컨텍스트  (0) 2022.04.07

댓글