Hello JPA - 어플리케이션 개발

숭맹이·2025년 4월 22일

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 정리

JPA 구동 방식과 애플리케이션 개발 흐름

JPA(Java Persistence API)는 ORM(Object-Relational Mapping) 기술의 표준 인터페이스입니다.

JPA의 시작 - Persistence와 EntityManagerFactory

JPA의 구동은 Persistence 클래스로부터 시작합니다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
  • Persistence.xml 파일에 정의한 persistence-unit 이름을 넘겨주어야 합니다.
  • EntityManagerFactory는 데이터베이스 당 하나만 생성해 애플리케이션 전체에서 공유합니다.

EntityManager의 생명주기

EntityManager는 고객 요청 단위로 생성해서 사용하고 종료해야 합니다.

EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
  • 트랜잭션 단위로 EntityManager를 생성합니다.
  • 사용이 끝나면 em.close() 호출로 반드시 반환해야 합니다.
  • Thread-safe 하지 않기 때문에 공유 금지입니다.

객체와 테이블 매핑 - @Entity와 @Id

JPA에서 엔티티 클래스는 데이터베이스 테이블과 매핑됩니다.

@Entity
public class Member {
    @Id
    private Long id;

    private String name;

    // Getter, Setter
}
  • @Entity를 선언해 JPA가 관리하도록 합니다.
  • @Id를 통해 PK(Primary Key)를 지정합니다.

데이터베이스 테이블 생성 예시

CREATE TABLE Member (
    id BIGINT NOT NULL,
    name VARCHAR(255),
    PRIMARY KEY (id)
);

회원 데이터 조작 실습

회원 등록

Member member = new Member();
member.setId(1L);
member.setName("HelloJPA");

em.persist(member);

회원 수정

Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloUpdated");

JPA는 트랜잭션 커밋 시점에 변경 감지를 통해 UPDATE 쿼리를 자동 생성합니다.

회원 삭제

em.remove(findMember);

단건 조회

Member findOne = em.find(Member.class, 1L);

주의사항

  • EntityManagerFactory는 애플리케이션당 하나만 생성해서 공유합니다.
  • EntityManager는 쓰레드 간 공유하지 않고 요청 단위로 생성 후 종료합니다.
  • 데이터 변경은 반드시 트랜잭션 안에서 수행해야 합니다.

JPQL 소개

JPA는 테이블이 아닌 엔티티 객체를 대상으로 쿼리를 작성합니다.

기본 조회

Member member = em.find(Member.class, 1L);

복잡한 조회 - JPQL 사용

List<Member> result = em.createQuery("SELECT m FROM Member m", Member.class)
                         .getResultList();
  • JPQL은 엔티티 객체(Member)를 대상으로 조회합니다.
  • SQL과 문법이 유사하지만, 실제 테이블이 아닌 객체를 다룹니다.
  • DB 방언(Dialect)에 따라 SQL로 변환되어 실행됩니다.

페이징 처리 예시

List<Member> result = em.createQuery("SELECT m FROM Member m", Member.class)
                         .setFirstResult(0)
                         .setMaxResults(10)
                         .getResultList();

방언에 따라 LIMIT OFFSET, ROWNUM 등 적절히 변환됩니다.

JPQL vs SQL

항목JPQLSQL
대상엔티티 객체테이블
목적객체지향 쿼리관계형 데이터 조회
장점DB 독립성 확보, 유지보수 용이세밀한 최적화 가능
profile
👨🏻‍💻 Backend Developer

0개의 댓글