JAVA 진영의 ORM 표준 JPA

김종하·2021년 3월 14일
0

JPA

목록 보기
2/10

JPA?

JPA 는 Java Persistence API 의 준말로 자바 진영의 ORM 기술 표준이다.
앞선 포스팅에서 ORM 에 대해서 설명했지만 추가적으로 말하자면 ORM 은
Object-Relational Mapping 의 준말로 말그대로 객체와 관계형 데이터베이스 사이를 이어주는 역할을 하는 것을 의미한다.

JPA의 동작 예시

이해를 돕기 위해 JPA가 동작하는 과정을 살펴보도록 하자.
요구사항 : 회원정보 저장

  1. 입력받은 정보를 바탕으로 회원정보를 생성한 후, 저장하는 코드 작성한다.

  2. 코드를 JPA가 분석해 INSERT 쿼리를 생성한다.
    (코드는 객체지향적으로 작성되었고, 이런 객체지향적 코드는 관계형 DB의 패러다임과는 다르지만 이를 해결해준다.)

  3. JPA 는 작성한 쿼리를 JDBC API 를 사용해 DB 에 보내면

  4. 회원정보가 RDB 에 저장된다.

JPA 의 발전사

자바 ORM 표준의 시작은 EJB 의 엔티티 빈 이였다. 성능도 좋지 않았고 사용하기 쉬운 API 가 아니였고 Gavin King 이라는 개발자가 이를 대체할만한 ORM 프레임워크인 하이버네이트를 만들어냈다. 오픈소스로 만들어진 이 프레임워크가 인기를 끌면서 준표준처럼 사용되면서 자바진영에서 Gaving King 을 데려와 하이버네이트 코드를 따와서 거의 유사하게 만들어 낸 표준이 바로 JPA 이다.

JPA 를 왜 사용해야 하는가?

뛰어난 생산성

CRUD 를 한다면 다음과 같이 사용할 수 있을 것이다.
저장 : jpa.persiste(member)
조회 : Member member = jpa.find(memberId)
수정 : member.setName("변경할 이름")
삭제 : jpa.remove(member)

SQL 직접 작성하지 않고 인터페이스가 제공하는 메소드만 사용하면 된다. 당연히 코드를 작성하는 시간이 줄어든다.

유지보수에 유리

기존에는 필드 변경시 모든 SQL을 수정해야 했다면,
JPA를 사용하면 필드만 추가하면 된다. 왜? 우리가 SQL 을 작성하는게 아니라 JPA가 우리의 코드를 기반을 SQL을 작성해주까

성능최적화

JPA는 일종의 인터페이스임을 설명했었다. 서로 다른 세계를 이어주는 계층이 생겨나면 이전에 직접적으로 연결되었을 때에 비해 계층을 거쳐가야 하니, 성능이 떨어지지 않을까라는 지극히 합리적인 의심이 들 수 있다. 그러나 이렇게 새로운 계층이 생겨나면 그 계층을 버퍼와 캐시로 활용할 수 있다. 그리고 이를 통해 오히려 성능을 향상시키는 것이 가능하다.
CPU 와 메모리 사이에 '캐시'라는 계층이 있다는 것을 상기해보면 이해가 쉬울 것이다.

즉시로딩과 지연로딩

추후에 이어질 포스팅에서 자세히 다루겠지만, 즉시로딩은 SQL 의 JOIN 을 활용해 한번에 연관된 객체까지 조회하는 것을 의미하고 지연로딩은 필요시에 SQL을 날려 로딩시키는 것을 의미하는데 이를 활용해서 경우에 따라 다른 로딩방법을 사용해 성능최적하가 가능하다.

객체와 RDB의 패러다임 불일치를 해결해주는 JPA

Item 을 상속한 Book 이라는 객체가 있다고 생각해보자.
자바는 extends 키워드만 사용하면 상속이 완료되지만 RDB 에서는 이런 자바의 상속을 어떻게 구현할 수 있을까?

안타깝게도 그런 방법은 존재하지 않는다. 둘 간의 패러다임이 완전히 다르기 때문에 RDB 세상에서의 상속이라는 개념이 없는 것이다. 다만, 여러가지 방법들로 마치 상속을 사용하는 것 처럼 RDB를 활용하는 방법이 있다.
추후에 자세히 설명하겠지만, JPA가 제공하는 방법은

  1. 조인전략
  2. 단일 테이블 전략
  3. 구현 클래스마다 테이블을 생성하는 전략

위와 같은 방법으로 Java 에서 사용하는 상속이란 개념을 RDB에서 구현해낸다.

조인전략을 사용한다는 가정아래 Book 이라는 객체를 저장하게 되면
사용자는 jpa.persiste(book) 코드만 작성했을 뿐인데,
JPA 는 Item 테이블과 Book 테이블에 각각 INSERT 쿼리를 만들어 보낸다.

상속 말고도 객체와 RDB 사이에는 많은 이격이 존재한다. 그리고 JPA는 사용자가 객체지향적인 코드로 작성한 코드를 분석하고 올바르게 RDB 에 영속화 될 수 있도록 도와준다.

해당 포스팅은 김영한님의 '자바 ORM 표준 JPA 프로그래밍' 강의를 참고하여 작성된 내용입니다.

0개의 댓글