백엔드 프레임워크/JPA & Mybatis

[JPA] JPA 기본 사용법

ioh'sDeveloper 2025. 1. 11. 17:22

JPA 기본 사용법

1. JPA란 무엇인가?

JPA(Java Persistence API)는 자바 애플리케이션에서 관계형 데이터베이스를 사용하기 위한 표준 인터페이스입니다. ORM(Object Relational Mapping)을 통해 객체와 데이터베이스 테이블을 매핑하여 객체 지향적인 프로그래밍 패러다임을 유지하면서 데이터베이스 작업을 할 수 있게 해줍니다. JPA의 주요 구현체로는 Hibernate, EclipseLink 등이 있습니다.

주요 용어

  • Entity: 데이터베이스 테이블에 매핑되는 클래스
  • EntityManager: 엔티티를 관리하고 데이터베이스 작업을 수행하는 인터페이스
  • Persistence Context: 엔티티의 상태를 관리하는 공간으로, 영속성 컨텍스트라고도 함

2. JPA 설정

JPA를 사용하기 위해서는 먼저 persistence.xml 파일을 설정해야 합니다. 이 파일은 JPA의 설정 정보를 포함하고 있습니다.

persistence.xml 예시

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <persistence-unit name="myPersistenceUnit">
        <class>com.example.entity.Member</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <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="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

3. 엔티티 클래스 정의

JPA에서는 데이터베이스 테이블에 매핑될 엔티티 클래스를 정의해야 합니다. @Entity 애노테이션을 사용하여 클래스가 엔티티임을 선언합니다.

엔티티 클래스 예시

import jakarta.persistence.*;

@Entity
@Table(name = "member")
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(unique = true)
    private String email;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

4. EntityManager를 활용한 CRUD

JPA에서 엔티티 매니저는 영속성 컨텍스트를 관리하고, 엔티티의 생명주기(등록, 조회, 수정, 삭제)를 관리하는 핵심 인터페이스입니다.

EntityManagerFactory 생성

import jakarta.persistence.*;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();

        try {
            // 엔티티 생성 및 저장
            Member member = new Member();
            member.setName("임나현");
            member.setEmail("nahyun@example.com");
            em.persist(member);

            // 엔티티 조회
            Member findMember = em.find(Member.class, member.getId());
            System.out.println("Found Member: " + findMember.getName());

            // 엔티티 수정
            findMember.setName("임나현 수정");

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

            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
        } finally {
            em.close();
            emf.close();
        }
    }
}

5. 엔티티 상태와 생명주기

엔티티의 상태는 크게 4가지로 나뉩니다.

  1. 비영속 (Transient): 영속성 컨텍스트와 전혀 관계없는 상태
  2. 영속 (Persistent): 영속성 컨텍스트에 저장된 상태
  3. 준영속 (Detached): 영속성 컨텍스트에서 분리된 상태
  4. 삭제 (Removed): 삭제된 상태

생명주기 상태 변화 예시

// 비영속 상태
Member member = new Member();
member.setName("임나현");

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

// 영속 상태
em.persist(member);

// 준영속 상태
em.detach(member);

// 삭제 상태
em.remove(member);

em.getTransaction().commit();

6. JPQL (Java Persistence Query Language)

JPA는 JPQL을 통해 객체를 대상으로 쿼리를 실행할 수 있습니다. JPQL은 SQL과 유사하지만, 테이블이 아닌 엔티티 객체를 대상으로 작성합니다.

JPQL 예시

TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m WHERE m.name = :name", Member.class);
query.setParameter("name", "임나현");
List<Member> resultList = query.getResultList();
for (Member member : resultList) {
    System.out.println("Member Name: " + member.getName());
}

7. 결론

JPA는 객체 지향적인 접근 방식을 통해 데이터베이스와 상호작용할 수 있도록 지원하는 강력한 도구입니다. 엔티티 매핑, CRUD, JPQL과 같은 기본 사용법을 숙지하면, 실무에서 JPA를 효과적으로 활용할 수 있습니다. 앞으로의 개발에서는 JPA의 고급 기능인 연관관계 매핑, 페치 전략, 트랜잭션 관리 등을 심화 학습하는 것이 중요합니다.