[스프링과 JPA] – ORM, JPA 동작 원리, H2 DB, 영속성 컨텍스트 완벽 가이드
목차
- JPA & 스프링의 연관성
- DB 연동 기술 분류 (JDBC vs. ORM)
- JPA(Java Persistence API)란?
- JPA의 동작 원리
- H2 데이터베이스 설치 & 특징
- 영속성 유닛(Persistence Unit)과 EntityManagerFactory
- 영속성 컨텍스트(Persistence Context)
- 마무리 & 요약
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. 마무리 & 요약
- 스프링과 JPA
- 스프링 부트에서는 스프링 데이터 JPA를 통해 구현체(하이버네이트 등)를 손쉽게 적용 가능.
- DB 연동 기술
- SQL 매퍼(iBATIS, MyBatis)와 ORM(Hibernate, EclipseLink)로 구분되며, JPA는 ORM의 표준 인터페이스.
- JPA 동작 원리
- 엔티티와 테이블의 매핑을 통해, 반복적인 CRUD SQL을 자동 생성해 개발 효율성을 높임.
- H2 Database
- 자바 기반의 경량 DB로, 테스트 환경에서 간편하게 사용 가능.
- 영속성 유닛 & 엔티티 매니저
- EntityManagerFactory와 EntityManager를 통해 JPA를 활용.
- 영속성 컨텍스트(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 환경에서 효율적인 데이터베이스 연동을 구현하고, 빠른 개발 및 유지보수를 경험해보세요. 궁금한 점은 언제든 댓글로 문의해 주시면 추가 안내해 드리겠습니다!