복잡한뇌구조마냥

[JAVA] JPA 기초 개념 본문

BE/JAVA

[JAVA] JPA 기초 개념

지금해냥 2025. 8. 14. 15:05

1. JPA란?

  • JPA(Java Persistence API): 자바 진영의 ORM(Object Relational Mapping) 표준 인터페이스
  • 객체와 테이블 매핑을 도와주는 스펙 (구현체: Hibernate, EclipseLink 등)
  • SQL 직접 작성 대신 객체 중심으로 데이터베이스 다룸

👉 즉, “자바 객체를 DB 테이블과 자동으로 매핑해주는 기술”


2. JPA를 쓰는 이유

  • SQL 작성 줄임 → CRUD 대부분 자동 처리
  • 객체 모델과 테이블 모델의 불일치(패러다임 불일치) 해결
  • 유지보수성, 확장성 향상

📌 전통적인 방식

 
String sql = "INSERT INTO member (id, name) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setLong(1, member.getId());
pstmt.setString(2, member.getName());

📌 JPA 사용

 
Member member = new Member();
member.setId(1L);
member.setName("홍길동");

em.persist(member); // SQL 자동 생성

3. JPA 동작 원리

  1. EntityManagerFactory 생성 (애플리케이션당 하나)
  2. EntityManager 생성 (DB 연결 단위)
  3. EntityTransaction으로 트랜잭션 시작/종료
  4. 엔티티(Entity) → SQL 변환 후 실행

4. 주요 용어

  • Entity: DB 테이블과 매핑되는 클래스
  • EntityManager: 엔티티를 관리하는 핵심 API
  • Persistence Context: 엔티티를 캐싱하고 1차 저장소로 관리하는 영역
  • JPQL(Java Persistence Query Language): 엔티티 객체 중심 쿼리

5. Entity 매핑 예제

 
import jakarta.persistence.*;

@Entity
@Table(name = "members")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 100)
    private String name;

    // Getter/Setter
}
  • @Entity → JPA 엔티티임을 선언
  • @Id → 기본 키(PK)
  • @GeneratedValue → 자동 생성 전략
  • @Column → 컬럼 속성 정의

6. CRUD 예제

 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();
tx.begin();

try {
    // CREATE
    Member m = new Member();
    m.setName("홍길동");
    em.persist(m);

    // READ
    Member findM = em.find(Member.class, 1L);

    // UPDATE
    findM.setName("임꺽정"); // 변경 감지(Dirty Checking)

    // DELETE
    em.remove(findM);

    tx.commit();
} catch (Exception e) {
    tx.rollback();
} finally {
    em.close();
}
emf.close();
  • persist() → 저장
  • find() → 조회
  • remove() → 삭제
  • update는 별도 메소드 없음 → 값 변경 시 자동 반영

7. JPQL 간단 예제

SQL이 아닌, 엔티티 객체를 대상으로 한 쿼리 작성

 
List<Member> result = em.createQuery(
    "SELECT m FROM Member m WHERE m.name LIKE :name", Member.class)
    .setParameter("name", "%길동%")
    .getResultList();
  • SQL: SELECT * FROM members WHERE name LIKE '%길동%'
  • JPQL: SELECT m FROM Member m WHERE m.name LIKE :name
    👉 엔티티(Member)를 대상으로 쿼리

8. JPA의 장단점

✅ 장점

  • 생산성: 반복적인 SQL/CRUD 코드 제거
  • 유지보수: 객체 중심 개발
  • 캐시와 지연 로딩 등 성능 최적화 기능 제공

❌ 단점

  • 러닝 커브 있음
  • 복잡한 쿼리 최적화는 결국 SQL 튜닝 필요
  • DB에 따라 성능 차이 발생 가능

9. 마무리

JPA는 단순 CRUD 이상의 기능(관계 매핑, 캐싱, fetch 전략, JPQL 등)이 강력합니다.
실무에서는 Spring Data JPA와 함께 쓰이며, 그 위에 QueryDSL 등을 얹어 복잡한 쿼리를 처리하기도 합니다.

LIST