1장: JPA란 무엇인가?
Java Persistence API, 줄여서 JPA는 자바에서 제공하는 ORM(Object-Relational Mapping) 표준 스펙입니다. 이는 객체와 관계형 데이터베이스 간의 맵핑을 지원하여 개발자가 데이터베이스 연동 작업을 보다 편리하게 수행할 수 있게 돕습니다.
JPA의 주요 기능
JPA는 다음과 같은 주요 기능을 제공합니다.
- 엔티티와 테이블 간의 맵핑
- 엔티티 생명주기 관리
- 객체 지향 쿼리 언어 (JPQL, Criteria API)
왜 JPA를 사용해야 하는가?
JPA를 사용하면, SQL 쿼리를 직접 작성하지 않고도 데이터베이스 연동 작업을 수행할 수 있습니다. 이는 개발자가 객체 지향적인 코드를 작성하는 데 집중할 수 있게 해주며, 코드의 가독성과 유지보수성을 향상시킵니다. 또한, JPA는 다양한 데이터베이스 벤더에 대한 호환성을 제공하므로, 벤더에 종속적이지 않은 코드를 작성할 수 있습니다.
2장: JPA를 이용한 데이터베이스 연동 기본 개념
JPA를 이용하면 개발자는 SQL 쿼리를 직접 작성하지 않고도 데이터베이스 연동 작업을 수행할 수 있습니다. 이번 장에서는 JPA를 사용하여 데이터베이스와 연동하는 기본적인 개념과 설정 방법에 대해 알아보도록 하겠습니다.
엔티티 클래스 정의
데이터베이스의 테이블을 객체로 표현하기 위해 우선적으로 엔티티 클래스를 정의해야 합니다.
@Entity public class Member { @Id private Long id; private String name; // getter, setter }
위 코드에서 @Entity는 이 클래스가 엔티티 클래스임을 나타내는 어노테이션입니다. @Id는 이 필드가 테이블의 기본 키(primary key)에 매핑된다는 것을 나타냅니다.
JPA 설정 파일(persistence.xml) 작성
JPA를 사용하기 위해선 설정 파일이 필요합니다. 주로 persistence.xml 파일을 작성하여 사용합니다.
<persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence"> <persistence-unit name="member"> <properties> <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test" /> <property name="javax.persistence.jdbc.user" value="sa" /> <property name="javax.persistence.jdbc.password" value="" /> </properties> </persistence-unit> </persistence>
위의 설정 파일은 H2 데이터베이스를 사용하도록 설정되어 있습니다. 이 파일에는 데이터베이스 연결에 필요한 드라이버, URL, 사용자 이름, 비밀번호 등의 정보가 포함되어 있습니다.
엔티티 매니저 사용
엔티티 매니저는 엔티티의 생성, 조회, 수정, 삭제 등의 작업을 수행합니다. 엔티티 매니저를 사용하려면 EntityManager 인스턴스를 생성해야 합니다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("member"); EntityManager em = emf.createEntityManager();
이제 이 em 객체를 이용하여 데이터베이스 연동 작업을 수행할 수 있습니다.
3장: 실무에서의 JPA 활용
JPA는 실무에서 데이터베이스 연동 작업을 보다 효율적으로 수행하기 위한 도구입니다. 이번 장에서는 실무에서 JPA를 어떻게 활용할 수 있는지에 대해 알아보겠습니다.
트랜잭션 관리
데이터베이스 연동 작업은 대부분 트랜잭션 내에서 이루어집니다. JPA는 이러한 트랜잭션 관리를 위한 API를 제공합니다.
em.getTransaction().begin(); // 트랜잭션 시작 member.setName("Changed Name"); em.getTransaction().commit(); // 트랜잭션 커밋
위 코드에서 em.getTransaction().begin()은 트랜잭션을 시작하고, em.getTransaction().commit()은 트랜잭션을 커밋(완료)하는 코드입니다. 트랜잭션 내에서 수행된 모든 변경 작업은 이 커밋 시점에 데이터베이스에 반영됩니다.
JPQL 사용
JPA는 SQL과 유사한 쿼리 언어인 JPQL(Java Persistence Query Language)을 제공합니다. JPQL을 사용하면, 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 쿼리를 작성할 수 있습니다.
String jpql = "select m from Member m where m.name like :name"; List<Member> resultList = em.createQuery(jpql, Member.class) .setParameter("name", "%Kim%") .getResultList();
위 코드는 이름에 "Kim"이 포함된 모든 회원을 조회하는 쿼리를 실행하는 예제입니다.
4장: JPA 실무 팁
JPA를 실무에서 활용하면서 유의해야 할 점과 팁에 대해 알아보겠습니다.
엔티티 생명주기
엔티티의 생명주기를 이해하는 것은 JPA를 효율적으로 활용하는 데 중요합니다. 엔티티는 '비영속', '영속', '준영속', '삭제'의 4가지 상태를 가집니다. 각 상태는 엔티티 매니저와의 관계에 따라 결정되며, 이를 이해하고 적절하게 활용하면 효율적인 데이터베이스 연동 작업이 가능합니다.
지연 로딩과 즉시 로딩
연관된 엔티티를 로딩하는 방식에는 '지연 로딩'과 '즉시 로딩'이 있습니다. 지연 로딩은 연관된 엔티티를 실제로 사용할 때까지 로딩을 미루는 방식이며, 즉시 로딩은 연관된 엔티티를 즉시 로딩하는 방식입니다. 이 두 가지 방식의 적절한 활용은 애플리케이션의 성능을 크게 좌우할 수 있습니다.
영속성 컨텍스트
영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 말합니다. 영속성 컨텍스트는 엔티티의 동일성을 보장하고, 데이터베이스와의 트랜잭션을 관리합니다. 또한, 변경 감지와 지연 로딩 등의 기능을 제공합니다. 이러한 영속성 컨텍스트의 역할과 기능을 이해하고 활용하는 것은 JPA를 효과적으로 사용하는 데 필수적입니다.