기록

[자바 ORM 표준 JPA 프로그래밍] JPA 시작하기: 개발 환경부터 객체 매핑까지(2장) 본문

교육/책

[자바 ORM 표준 JPA 프로그래밍] JPA 시작하기: 개발 환경부터 객체 매핑까지(2장)

zyin 2024. 11. 14. 23:07

시작하면서

이 글은 '자바 ORM 표준 JPA 프로그래밍' 책을 기반으로 정리한 내용입니다. 사이드 프로젝트에서 JPA를 사용하고 있지만, 제대로 활용하고 있는지에 대한 불안감이 있었습니다. 그래서 JPA의 개념을 확실하게 익히고 이해하기 위해 이 책을 읽기로 결심했습니다. 이번 포스팅에서는 "2장. JPA 시작 부분"의 내용을 정리해보았습니다.

1. 객체 매핑 개념

예시 및 참고 자료:

  • @Entity 사용 예시:
  @Entity
  @Table(name = "users")
  public class User {
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;

      @Column(name = "username", nullable = false)
      private String username;
  }

 

이 예제는 User 엔티티를 데이터베이스의 users 테이블과 매핑합니다.

JPA는 자바 객체를 데이터베이스의 테이블과 매핑해주는 도구입니다.

  • @Entity: 해당 클래스가 JPA에서 관리되는 엔티티임을 나타냅니다.
  • @Table: 이 클래스가 매핑될 데이터베이스 테이블 정보를 설정합니다.
  • @Id@Column: 엔티티의 기본 키컬럼 매핑을 지정하는 데 사용됩니다.

이러한 매핑을 통해 객체지향적인 코드로 데이터베이스 테이블과 자연스럽게 상호작용할 수 있게 됩니다.

2. JPA 설정 파일: persistence.xml

예시 및 참고 자료:

  • persistence.xml 예시:
    <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
        <persistence-unit name="examplePU">
            <class>com.example.User</class>
            <properties>
                <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
                <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
                <property name="javax.persistence.jdbc.user" value="sa" />
                <property name="javax.persistence.jdbc.password" value="" />
            </properties>
        </persistence-unit>
    </persistence>
    이 파일은 JPA의 설정을 관리하고, 데이터베이스 연결 정보를 정의합니다.
  • Spring Boot JPA 설정 공식 문서: application.yml을 통한 JPA 설정 방법을 참고하세요.

JPA 설정 파일인 persistence.xml은 JPA에서 필수적인 설정 정보를 담고 있습니다. 이 파일을 통해 데이터베이스 연결 정보, JPA 구현체 설정 등을 정의하게 됩니다. 하지만 꼭 persistence.xml을 사용해야 하는 것은 아닙니다. 저 같은 경우에도 JPA 설정을 application.yml 파일에 명시하여 사용해본 적이 있습니다. Spring Boot를 사용하는 경우, application.yml 파일을 통해 JPA 설정을 관리하는 것이 더 일반적이며, 이는 설정의 통합 관리와 간소화를 가능하게 해줍니다. persistence.xml 대신 yml 파일만으로 JPA를 설정할 수 있습니다.

예시:

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect

이 예시는 Spring Boot의 application.yml 파일에서 데이터베이스 연결 정보와 JPA 설정을 정의하는 방법을 보여줍니다. 이를 통해 프로젝트 전반의 데이터베이스 연결 설정을 한 곳에서 일괄적으로 관리할 수 있습니다.

2.1 데이터베이스 방언 설정

예시 및 참고 자료:

  • 방언 설정 예시:
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
    MySQL을 사용할 경우, 해당 방언을 설정하여 JPA가 올바른 SQL 문을 생성하도록 돕습니다.
  • 주요 방언 예시:
    • H2Dialect: H2 데이터베이스에 맞는 방언.
    • MySQL5InnoDBDialect: MySQL 5 버전의 InnoDB 엔진을 위한 방언.
    • Oracle10gDialect: Oracle 10g 데이터베이스에 맞는 방언.
    • PostgreSQLDialect: PostgreSQL 데이터베이스와 호환되는 방언.
  • Hibernate Dialects 공식 목록: 각 데이터베이스에 맞는 방언 목록과 설명.

JPA는 다양한 데이터베이스와 호환되도록 **데이터베이스 방언(Dialect)**을 사용합니다. 데이터베이스가 변경되더라도 방언 설정만 바꿔주면 JPA는 그에 맞는 SQL을 생성합니다. 예를 들어, H2Dialect, MySQL5InnoDBDialect와 같은 방언 설정을 통해 다양한 DB와 호환됩니다.

3. JPA를 활용한 애플리케이션 개발

이제 본격적으로 애플리케이션 개발을 위한 JPA 설정과 관리 방법에 대해 알아보겠습니다.

3.1 엔티티 매니저 설정

예시 및 참고 자료:

  • EntityManagerFactory 생성 예시:
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit-name");
    EntityManager em = emf.createEntityManager();
    이 코드를 통해 EntityManager를 생성하고 이를 통해 데이터베이스와 상호작용합니다.
  • EntityManager JPA 공식 문서: EntityManager의 역할과 사용법에 대한 설명.

JPA에서 가장 중요한 객체는 EntityManager입니다. EntityManagerFactory를 통해 엔티티 매니저를 생성하게 되며, 이 팩토리는 애플리케이션에서 한 번만 생성하고 공유하는 것이 좋습니다. 다음은 엔티티 매니저 팩토리를 생성하는 코드 예시입니다:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit-name");

이 팩토리를 통해 EntityManager를 생성하고, 이를 이용해 데이터베이스와 상호작용합니다.

3.2 트랜잭션 관리

트랜잭션 관리에서 트랜잭션을 제대로 사용하지 않을 경우, TransactionRequiredException과 데이터 일관성 문제가 발생

 

예시 및 참고 자료:

  • 트랜잭션 사용 예시:
    EntityTransaction tx = em.getTransaction();
    try {
        tx.begin();
        em.persist(entity);
        tx.commit();
    } catch (Exception e) {
        if (tx != null && tx.isActive()) {
            tx.rollback();
        }
    }
    이 코드는 데이터 변경 시 트랜잭션을 시작하고, 예외 발생 시 롤백하는 예제입니다.
  • 트랜잭션 관리 공식 문서: JPA에서 트랜잭션의 중요성과 관리 방법.

JPA에서는 데이터 변경 시 반드시 트랜잭션 내에서 작업해야 합니다. 트랜잭션 없이 데이터베이스에 데이터를 변경하려고 하면 예외가 발생할 수 있습니다. 대표적으로 TransactionRequiredException이 발생할 수 있으며, 이는 데이터베이스에 데이터를 저장하거나 수정할 때 트랜잭션이 필요하다는 점을 명확히 해줍니다. 또한, 트랜잭션 없이 작업이 진행되면 **일관성(consistency)**이 깨져 데이터 손실이나 데이터 무결성 문제를 초래할 수 있습니다. 따라서 모든 데이터 변경 작업은 반드시 트랜잭션 내에서 처리해야 합니다.

3.3 비즈니스 로직과 CRUD 작업

EntityManager를 통해 데이터를 등록, 수정, 삭제, 조회할 수 있습니다.

 

예시 코드:

EntityTransaction transaction = em.getTransaction();
try {
    transaction.begin();

    // 등록
    User newUser = new User();
    newUser.setUsername("john_doe");
    em.persist(newUser);

    // 조회
    User foundUser = em.find(User.class, newUser.getId());
    System.out.println("Found User: " + foundUser.getUsername());

    // 수정
    foundUser.setUsername("john_updated");
    // JPA는 변경 감지(DIRTY CHECK)로 인해, 수정된 값이 자동으로 반영됩니다.

    // 삭제
    em.remove(foundUser);

    transaction.commit();
} catch (Exception e) {
    if (transaction.isActive()) {
        transaction.rollback();
    }
    e.printStackTrace();
}

 

이 코드는 사용자(User) 엔티티에 대해 등록, 조회, 수정, 삭제를 순차적으로 수행하는 예시입니다. 트랜잭션 관리와 함께 CRUD 작업을 수행하는 방법을 보여줍니다.

3.4 JPQL 사용법

JPQL을 사용하면 SQL과 유사한 문법으로 객체를 대상으로 쿼리를 작성할 수 있음.

 

예시 및 참고 자료:

  • JPQL 사용 예시:
    List<Person> persons = em.createQuery("select p from Person p where p.department.name = :name", Person.class)
                             .setParameter("name", "Engineering")
                             .getResultList();
    이 코드는 특정 부서 이름에 해당하는 Person 엔티티를 조회하는 JPQL 예시입니다.
  • JPQL 공식 문서: JPQL의 기본 개념과 사용 방법.

JPA는 단순한 CRUD 작업뿐만 아니라 조건 검색이 포함된 JPQL도 제공합니다. JPQL(Java Persistence Query Language)은 객체를 대상으로 쿼리를 작성하게 해 주며, SQL과 유사하지만 엔티티 객체와 필드를 대상으로 한다는 점에서 차이가 있습니다. 예를 들어 다음과 같은 JPQL을 사용할 수 있습니다:

em.createQuery("select p from Person p where p.department.name = :name", Person.class);

SQL처럼 복잡한 쿼리를 작성할 수 있으면서도 객체지향적인 접근이 가능하다는 것이 JPQL의 장점입니다.

4. 정리

이번 글에서는 JPA 개발을 위해 필수적인 환경 설정과 기본 개념들을 다뤄봤습니다. 이클립스 설치, H2 데이터베이스 세팅, 엔티티 매핑, 트랜잭션 관리 등 JPA를 시작하는 데 필요한 전반적인 과정을 살펴보았습니다. 직접 코드를 작성해보면서 각 개념을 체득해보는 것이 중요합니다.

Comments