JPA란 무엇일까?

2025. 7. 1. 00:00·탐구하기

JPA(Java Persistence API)는 자바에서 객체와 관계형 데이터베이스를 매핑하기 위한 ORM(Object-Relational Mapping) 표준 인터페이스입니다. 즉, 자바 클래스(객체)를 데이터베이스의 테이블과 자동으로 매핑해주는 기술입니다.

📌 JPA는 “표준”, Hibernate는 그 구현체 중 하나입니다.


🔶 1. JPA란?

  • Java EE의 표준 ORM 기술
  • 자바 객체를 관계형 데이터베이스의 테이블과 매핑
  • SQL을 직접 작성하지 않아도 데이터를 저장/조회 가능
  • 대표적인 구현체: Hibernate, EclipseLink, OpenJPA 등

🔶 2. 주요 개념

용어 설명

Entity DB 테이블과 매핑되는 자바 클래스
EntityManager JPA의 핵심 인터페이스로, DB에 대한 CRUD 수행
Persistence Unit JPA 설정 정보 묶음 (persistence.xml)
JPQL 객체 지향 쿼리 언어 (SQL과 비슷하지만 테이블이 아닌 객체 기준으로 작성)

🔶 3. 기본 예제

📌 Entity 클래스

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

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

    private String name;

    private int age;
}

📌 데이터 저장

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

Member member = new Member();
member.setName("홍길동");
member.setAge(30);

em.persist(member); // INSERT 실행

em.getTransaction().commit();

🔶 4. JPA의 주요 기능

기능 설명

persist() 엔티티 저장 (INSERT)
find() 기본키로 엔티티 조회 (SELECT)
remove() 엔티티 삭제 (DELETE)
merge() 엔티티 수정 (UPDATE)
JPQL 객체지향 쿼리 작성 (SELECT m FROM Member m)
자동 더티 체킹 엔티티 값 변경 → 트랜잭션 커밋 시 자동 UPDATE

🔶 5. JPA의 장점

장점 설명

✅ SQL 작성 최소화 대부분의 작업은 SQL 없이 처리
✅ 객체 중심 개발 DB가 아닌 객체 위주로 설계
✅ 트랜잭션, 캐시 등 지원 1차 캐시, 지연 로딩, 더티 체킹 등 고급 기능 제공
✅ 유지보수 용이 DB 변경 시 자바 코드에만 집중

🔶 6. 단점

단점 설명

❗ 초기 학습 곡선 개념이 많고 익숙해지기까지 시간이 필요
❗ 복잡한 쿼리는 JPQL로 한계 SQL 튜닝이 필요한 경우 Native Query 필요
❗ 성능 최적화 필요 지연 로딩(N+1 문제), 캐시 등 사용 주의

🔶 7. JPA vs MyBatis

항목 JPA MyBatis

SQL 작성 거의 안 함 (자동 생성) 직접 작성
쿼리 제어 낮음 (자동 처리) 높음
학습 난이도 높음 낮음
유지보수 쉬움 SQL 변경 시 부담
성능 튜닝 제한적 (JPQL/Native Query 필요) 자유로움
객체 중심 설계 가능 (ORM) 불편 (수동 매핑)

🔶 8. 스프링에서 JPA 사용 흐름

  1. @Entity로 도메인 클래스 정의
  2. @Repository로 JPA Repository 생성
  3. @Transactional로 트랜잭션 처리
  4. JpaRepository 인터페이스 상속으로 기본 CRUD 자동 생성
public interface MemberRepository extends JpaRepository<Member, Long> {
    List<Member> findByName(String name); // 메서드 이름만으로 쿼리 자동 생성
}

✅ 정리

  • JPA는 자바 ORM 기술의 표준 인터페이스
  • 객체 중심의 개발이 가능하고, SQL을 줄여 개발 생산성과 유지보수를 높임
  • 복잡한 쿼리 처리나 성능 튜닝이 필요한 경우에는 QueryDSL, Native Query, 또는 MyBatis와 함께 사용하기도 함

Spring Boot와 JPA를 같이 사용하는 이유는 개발 생산성과 유지보수를 높이기 위함입니다. Spring Boot는 개발 편의성을 극대화한 프레임워크이고, JPA는 객체 중심의 데이터베이스 접근 방식을 제공하는 ORM 기술이기 때문에 둘을 결합하면 반복 작업이 줄고 코드가 깔끔해집니다.


✅ Spring Boot + JPA를 같이 사용하는 이유

1. 🔧 설정 자동화 (Spring Boot의 강점)

  • application.yml이나 application.properties만 설정하면 JPA가 자동으로 설정됨
  • 별도 XML 설정 없이 빠르게 시작 가능
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 1234
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

2. 🧾 복잡한 SQL 없이도 CRUD 가능 (JPA의 강점)

  • JpaRepository를 상속하면 기본적인 CRUD는 자동으로 생성됨
public interface MemberRepository extends JpaRepository<Member, Long> {
    List<Member> findByName(String name);
}
  • 위처럼 메서드 이름만으로도 SELECT * FROM member WHERE name = ? 쿼리 자동 생성

3. 📦 도메인 중심의 설계 가능 (객체지향 설계)

  • 객체와 DB 테이블을 직접 매핑할 수 있어 DB 설계에 덜 의존
  • Entity 클래스 중심으로 설계 가능
@Entity
public class Member {
  @Id @GeneratedValue
  private Long id;
  
  private String name;
}

4. 🧠 트랜잭션 처리, 더티 체킹, 지연 로딩 등 고급 기능 지원

  • @Transactional을 통해 선언적 트랜잭션 처리
  • 엔티티 수정 시 em.persist() 없이도 변경 감지(dirty checking)로 자동 업데이트
  • 연관 엔티티는 지연 로딩(Lazy Loading)으로 효율적인 쿼리 실행

5. 🔍 유지보수성, 생산성 향상

  • SQL 수정할 일이 거의 없으므로 비즈니스 로직에 집중 가능
  • 반복되는 DAO 코드를 줄이고 재사용성과 테스트 용이성 증가

🎯 결론: Spring Boot + JPA 조합의 이점

장점 설명

빠른 개발 설정, 서버 실행, CRUD 구현까지 자동화
코드 간결 SQL 없이도 데이터 처리 가능
객체지향 설계 DB 테이블보다 객체 중심으로 비즈니스 모델 설계 가능
유지보수 용이 엔티티 기반 설계로 수정이 쉬움
확장성 QueryDSL, NativeQuery 등으로 복잡한 쿼리도 대응 가능

📌 실무에서의 활용

  • 대부분의 CRUD 작업은 Spring Data JPA로 처리
  • 성능이나 복잡한 쿼리가 필요한 부분은 QueryDSL 또는 Native SQL로 보완
  • JPA + Spring Boot + QueryDSL 조합은 실무에서도 매우 널리 쓰임

 

'탐구하기' 카테고리의 다른 글

@Controller와 @RestController의 차이점  (0) 2025.07.01
JPA와 MyBatis의 차이점  (0) 2025.07.01
MyBatis란 무엇일까?  (0) 2025.06.30
SpringBoot와 Spring, 이 둘의 차이점은 무엇일까?  (1) 2025.06.16
Spring Bean의 생명주기는 어떻게 될까?  (0) 2025.06.13
'탐구하기' 카테고리의 다른 글
  • @Controller와 @RestController의 차이점
  • JPA와 MyBatis의 차이점
  • MyBatis란 무엇일까?
  • SpringBoot와 Spring, 이 둘의 차이점은 무엇일까?
ayinyun
ayinyun
ayinyun 님의 블로그 입니다.
  • ayinyun
    ayinyun 님의 블로그
    ayinyun
  • 전체
    오늘
    어제
    • 분류 전체보기 (75)
      • SQL 개발 공부 (8)
      • JAVA 개발 공부 (4)
      • JavaScript(JS) (1)
      • React (1)
      • 탐구하기 (38)
      • KPT회고록 (14)
      • SpringBoot (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ayinyun
JPA란 무엇일까?
상단으로

티스토리툴바