오태림 2018. 12. 29. 17:10


실무에서 JPA를 사용하고 있는데 올바르게 사용하고 있는지 확신이 들지않아 최근에 공부를 시작했습니다. "JPA 프로그래밍 입문"이란 책을 읽고 공부하며 제가 이해한 내용을 정리하는 곳이니 참고용으로만 봐주시면 감사할 것 같습니다. 


JPA(Java Persistence API)란 무엇인가? 

JPA란 DB 테이블과 자바 객체 사이의 매핑을 처리해주는 ORM[각주:1]이란 기술의 표준입니다. 따라서 JPA에는 객체와 DB 사이의 매핑을 어떻게 설정하고 어떻게 동작해야하는지 기술하고 있습니다. 즉 자바의 클래스와 DB의 테이블을 매핑하는 기술이란 뜻입니다.


JPA를 살펴보다면 하이버네이트(hibernate)란 말을 많이 접하게 됩니다. 그렇다면 하이버네이트란 무엇일까요?


JPA 프로바이더

하이버네이트란 JPA 프로바이더의 한 종류입니다. JPA 프로바이더는 JPA의 표준을 실제로 구현하고 있습니다. 쉽게 말하자면 JPA는 DB와 자바 객체를 매핑하기 위한 인터페이스(API)를 제공하고 JPA 프로바이더는(하이버네이트) 이 인터페이스를 구현한 것이죠.


JPA 특징

  1. 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성합니다. 보통 JDBC를 사용하여 개발을 하다보면 코드가 비슷한 형태로 반복되게 됩니다.
    DB커넥션을 구하고, 쿼리를 작성하고, 파라미터를 설정하고 실행한 결과를 자바 객체에 설정합니다.
     여기서 문제점은 테이블의 컬럼명이 추가, 삭제, 변경이 된다면 관련되어 있는 모든 쿼리를 수정해야 할 것인데 JPA는 매핑 설정만 변경하면 됩니다.
    또한 실행한 쿼리를 자바 객체에 설정해줘야하는데 JPA는 자바 객체로 매핑하여 검색할 수 있습니다. 즉 유지보수가 쉽습니다.

  2. 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원합니다.

  3. JPA는 성능 향상을 위해 지연 로딩이나 즉시 로딩과 같은 몇가지 기법을 제공하는데 이것을 잘 활용하면 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있습니다. 하지만 잘못이해하고 사용하는 JPA는 성능을 크게 감소시킬 수 있습니다.

JPA 설정

JPA는 기본적으로 클래스패스에 있는 META-INF/persistence.xml 파일을 설정 파일로 사용합니다. 다음은 일반적인 persistence 파일입니다.

<persistence-unit> 태그의 name은 영속 단위를 설정하고 transaction-type은 JPA가 사용할 트랜잭션을 설정합니다. <class> 태그는 영속 관리할 클래스를 지정하며 <exclude-unlisted-classes>속성을 true로 설정하면 <class>태그에서 설정하지 않은 클래스들은 영속 관리 대상에서 제외됩니다. 




JPA 영속성

앞에서부터  "영속성"이란 반복되고 있는데 영속성이란 무엇일까요? JPA에서는 @Entity 애노테이션을 붙인 클래스를 "엔티티"라고 부릅니다. 엔티티는 다음에 자세히 알아보도록 하겠습니다. 

영속 컨텍스트는 엔티티를 담고있는 집합인데 JPA는 이 영속 컨텍스트에 속한 엔티티를 DB에 반영합니다. 즉 프로그램에서는 엔티티를 영속 컨텍스트에 
속한 엔티티를 검색하거나 삭제 또는 추가, 변경하는 작업을 하면 영속 컨텍스트의 내용이 DB에 반영되는 것이죠.


하지만 프로그램에서는 영속 컨텍스트에 직접 접근할 수 없고 EntityManager를 통해서만 영속 컨텍스트에 접근할 수 있습니다. 






  1. Object-Relational Mapping [본문으로]