[스프링과 JPA] – ORM, JPA 동작 원리, H2 DB, 영속성 컨텍스트 완벽 가이드

[스프링과 JPA] – ORM, JPA 동작 원리, H2 DB, 영속성 컨텍스트 완벽 가이드

목차

  1. JPA & 스프링의 연관성
  2. DB 연동 기술 분류 (JDBC vs. ORM)
  3. JPA(Java Persistence API)란?
  4. JPA의 동작 원리
  5. H2 데이터베이스 설치 & 특징
  6. 영속성 유닛(Persistence Unit)과 EntityManagerFactory
  7. 영속성 컨텍스트(Persistence Context)
  8. 마무리 & 요약

1. JPA & 스프링의 연관성

최근 스프링 부트(Spring Boot) 환경에서 데이터베이스 연동을 가장 편리하게 하는 방법 중 하나가 바로 JPA(Java Persistence API)입니다. 스프링 부트는 스프링 데이터 JPA(Spring Data JPA)를 통해 JPA를 쉽고 간단하게 적용할 수 있도록 돕습니다.

  • 스프링 데이터 JPA는 JPA 표준 인터페이스에 스프링의 철학을 더해, 자동 리포지토리 생성메서드 네이밍 전략 등을 제공하여 CRUD 로직을 매우 빠르게 구현할 수 있게 해줍니다.

2. DB 연동 기술 분류 (JDBC vs. ORM)

1) SQL을 직접 다루는 기술

  • JDBC, Spring JDBC, iBATIS, MyBatis 등이 대표적입니다.
  • 특히 iBATIS나 MyBatis 같은 SQL 매퍼(SQL Mapper)는 XML 파일에 SQL을 등록해 사용하는 방식으로, SQL 작성이 자유롭고 제어가 용이합니다.
  • 하지만 코드 곳곳에서 SQL을 직접 관리해야 하므로, 대규모 프로젝트나 유지보수 시 SQL 관리 부담이 커질 수 있습니다.

2) SQL을 직접 다루지 않는 기술 (ORM)

  • 대표적인 예: 하이버네이트(Hibernate)
  • ORM(Object Relational Mapping) 프레임워크에서는 객체(엔티티)와 DB 테이블을 매핑하여 프레임워크가 SQL을 자동 생성합니다.
  • ORM은 SQL 작성량을 크게 줄여주며, 객체 중심의 코딩에 집중할 수 있게 해줍니다.
  • ORM 기술들이 급속히 발전했고, 이를 표준화한 것이 바로 JPA입니다.

3. JPA(Java Persistence API)란?

1) JPA의 탄생 배경

  • 과거 EJB(Enterprise Java Beans) 엔티티 빈이 갖는 복잡한 문제들을 해결하기 위해 등장한 하이버네이트(Hibernate)가 큰 인기를 끌었습니다.
  • 이후 하이버네이트를 중심으로 여러 ORM 프레임워크들이 등장했고, 이들을 통합 표준화한 것이 바로 JPA입니다.

2) 스프링 부트와 하이버네이트

  • JPA는 표준 인터페이스이며, 실제로는 JPA 구현체가 동작합니다.
  • 대표적인 구현체로 하이버네이트, EclipseLink, DataNucleus 등이 있는데, 스프링 부트는 기본적으로 하이버네이트를 사용합니다.

4. JPA의 동작 원리

1) 객체와 테이블 매핑

  • JPA는 자바 애플리케이션과 JDBC 사이에서, 컬렉션(리스트, 맵 등)에 저장된 자바 객체(엔티티)를 DB 테이블의 로우(ROW)로 매핑합니다.
  • 예를 들어, 클래스 이름을 기준으로 테이블을 결정하고, 필드(멤버 변수) 이름을 컬럼과 매핑하여 획일화된 SQL을 생성합니다.

2) CRUD SQL 자동 생성

  • 대부분의 CRUD(Create, Read, Update, Delete) 작업은 테이블마다 기본적으로 유사한 형태의 SQL을 사용합니다.
  • 이런 반복적인 SQL을 JPA가 알아서 생성해주므로, 개발자는 비즈니스 로직 구현에 집중할 수 있습니다.

5. H2 데이터베이스 설치 & 특징

1) H2 Database란?

  • H2 Database자바로 만들어진 경량 DB로, 인메모리(In-memory) 모드와 서버(Server) 모드를 지원합니다.
  • 설치 용량이 작고, 성능도 우수하며, 별도의 환경 없이 단일 JAR 파일로 동작 가능해 테스트용 DB로 많이 사용됩니다.

2) 장점

  • JDBC 호환: 자바 프로젝트에서 손쉽게 JDBC로 접근 가능.
  • 브라우저 기반 콘솔: SQL 작성, 테이블 확인 등 편리한 GUI 환경 제공.

3) 스프링 부트와 연동

  • spring-boot-starter-data-jpa와 com.h2database:h2 의존성을 pom.xml에 추가하면, 애플리케이션 실행 시 자동으로 H2를 구성해 줍니다.

6. 영속성 유닛(Persistence Unit)과 EntityManagerFactory

1) 영속성 유닛(Persistence Unit)

  • JPA를 사용해 DB에 접근하려면 EntityManager가 필요한데, 이 EntityManager는 EntityManagerFactory에서 생성됩니다.
  • 전통적으로는 persistence.xml 파일에 <persistence-unit>을 지정해 데이터 소스 정보, JPA 설정, 엔티티 클래스 매핑 등을 설정해야 합니다.

2) 스프링 부트 자동 설정

  • 스프링 부트를 사용하면, application.properties(또는 application.yml)에 DB 관련 설정을 기입하고 @Entity가 선언된 엔티티 클래스들을 자동으로 스캔하여 EntityManagerFactory를 구성합니다.
  • 별도의 persistence.xml 없이도, 스프링 부트가 JPA 환경 설정을 자동화해 주므로 편리합니다.

7. 영속성 컨텍스트(Persistence Context)

1) 개념

  • 영속성 컨텍스트는 JPA에서 엔티티를 관리하는 일종의 캐시 영역(혹은 컨테이너)입니다.
  • EntityManager를 생성하면 자동으로 영속성 컨텍스트가 만들어지며, 엔티티의 생명주기를 추적합니다.

2) 엔티티 생명주기

  • 비영속(New): 영속성 컨텍스트에 관리되지 않는 새로운 객체 상태
  • 영속(Managed): 영속성 컨텍스트에서 관리되는 상태
  • 준영속(Detached): 한때 영속상태였으나, 현재는 컨텍스트에서 분리된 상태
  • 삭제(Removed): 영속성 컨텍스트에 의해 삭제로 표시되어, DB에서 삭제될 예정이거나 이미 삭제된 상태

EntityManager를 통해 영속성 컨텍스트에 엔티티를 등록하고, 변경내용을 반영하거나 제거하는 과정에서 이 네 가지 상태가 발생합니다.


8. 마무리 & 요약

  1. 스프링과 JPA
    • 스프링 부트에서는 스프링 데이터 JPA를 통해 구현체(하이버네이트 등)를 손쉽게 적용 가능.
  2. DB 연동 기술
    • SQL 매퍼(iBATIS, MyBatis)와 ORM(Hibernate, EclipseLink)로 구분되며, JPA는 ORM의 표준 인터페이스.
  3. JPA 동작 원리
    • 엔티티와 테이블의 매핑을 통해, 반복적인 CRUD SQL을 자동 생성해 개발 효율성을 높임.
  4. H2 Database
    • 자바 기반의 경량 DB로, 테스트 환경에서 간편하게 사용 가능.
  5. 영속성 유닛 & 엔티티 매니저
    • EntityManagerFactory와 EntityManager를 통해 JPA를 활용.
  6. 영속성 컨텍스트(Persistence Context)
    • 엔티티의 생명주기를 관리하는 핵심 개념.

스프링 부트와 JPA를 연동하면, 번거로운 SQL 작성과 매핑 작업에서 해방되어 비즈니스 로직 구현에 더욱 집중할 수 있습니다. 또한 H2 DB를 사용하면 빠르고 간편한 테스트 환경을 구성할 수 있으니, 꼭 한 번 실습해 보시기 바랍니다.


  • 스프링 부트(Spring Boot)
  • JPA(Java Persistence API)
  • 스프링 데이터 JPA
  • 하이버네이트(Hibernate)
  • iBATIS, MyBatis
  • ORM(Object Relational Mapping)
  • H2 Database
  • 영속성 유닛(persistence.xml)
  • EntityManager, EntityManagerFactory
  • 영속성 컨텍스트(Persistence Context)
  • 엔티티 생명주기(New, Managed, Detached, Removed)

위 내용을 참고하여 스프링 + JPA 환경에서 효율적인 데이터베이스 연동을 구현하고, 빠른 개발 및 유지보수를 경험해보세요. 궁금한 점은 언제든 댓글로 문의해 주시면 추가 안내해 드리겠습니다!

Leave a Comment