kmsoon 2024. 5. 21. 13:49

Java Persistence API (JPA)는 자바에서 객체와 관계형 데이터베이스 간의 매핑을 관리하기 위한 자바 표준 명세입니다. JPA를 사용하면 개발자는 데이터베이스와의 상호작용을 객체 지향적으로 수행할 수 있으며, 이를 통해 데이터베이스 관련 코드를 간소화하고 유지보수성을 높일 수 있습니다. JPA는 Java EE 및 Java SE 애플리케이션에서 사용할 수 있습니다.

 

Entity: JPA에서 Entity는 데이터베이스 테이블에 매핑되는 자바 객체를 의미합니다. 각 Entity는 데이터베이스의 테이블과 1:1로 매핑되며, 클래스에 @Entity 어노테이션을 붙여 정의합니다.\

 

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // Getters and Setters
}

 

EntityManager: JPA에서 엔티티를 관리하는 주체로, 엔티티의 CRUD(Create, Read, Update, Delete) 작업을 수행합니다. EntityManager는 엔티티를 영구적으로 저장하거나 조회하는 데 사용됩니다.

 

EntityManagerFactory: EntityManager 객체를 생성하기 위한 팩토리입니다. 일반적으로 애플리케이션 당 하나의 EntityManagerFactory를 생성하고, 이를 통해 여러 EntityManager를 생성하여 사용합니다

 

Persistence Unit: JPA 설정을 정의하는 논리적 단위입니다. persistence.xml 파일에 설정되며, 데이터베이스 연결 정보, 관리할 엔티티 클래스 목록 등을 포함합니다.

 

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
    <persistence-unit name="myPersistenceUnit">
        <class>com.example.User</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mydb"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="password"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        </properties>
    </persistence-unit>
</persistence>

 

 

 

Query Language (JPQL): JPA는 객체를 대상으로 하는 질의 언어인 JPQL(Java Persistence Query Language)을 제공합니다. JPQL은 SQL과 유사하지만, 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 질의를 수행합니다.

TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.email = :email", User.class);
query.setParameter("email", "example@example.com");
List<User> users = query.getResultList();

 

 

주요 어노테이션

  • @Entity: 클래스가 JPA 엔티티임을 명시합니다.
  • @Id: 엔티티의 기본 키를 나타냅니다.
  • @GeneratedValue: 기본 키의 생성 전략을 지정합니다.
  • @Column: 엔티티 필드를 데이터베이스 컬럼에 매핑합니다. 이 어노테이션은 생략 가능하며, 생략 시 필드명이 컬럼명으로 사용됩니다.
  • @Table: 엔티티와 매핑되는 데이터베이스 테이블을 지정합니다.
  • @OneToOne, @OneToMany, @ManyToOne, @ManyToMany: 엔티티 간의 관계를 정의합니다.

 

사용 예시

다음은 JPA를 사용하여 간단한 CRUD 작업을 수행하는 예제입니다.

// 엔티티 매니저 팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

try {
    // 트랜잭션 시작
    em.getTransaction().begin();

    // 엔티티 생성 및 저장
    User user = new User();
    user.setName("John Doe");
    user.setEmail("john.doe@example.com");
    em.persist(user);

    // 엔티티 조회
    User foundUser = em.find(User.class, user.getId());
    System.out.println(foundUser.getName());

    // 엔티티 수정
    foundUser.setEmail("john.doe@newdomain.com");
    em.merge(foundUser);

    // 엔티티 삭제
    em.remove(foundUser);

    // 트랜잭션 커밋
    em.getTransaction().commit();
} finally {
    em.close();
    emf.close();
}

 

이 예제에서는 User 엔티티를 생성, 조회, 수정, 삭제하는 과정을 보여줍니다. EntityManager를 통해 트랜잭션을 시작하고, persist, find, merge, remove 메서드를 사용하여 엔티티에 대한 CRUD 작업을 수행합니다.

JPA는 Hibernate와 같은 구현체와 함께 사용되며, 이를 통해 강력하고 유연한 ORM(Object-Relational Mapping) 기능을 제공합니다.