실습용 프로젝트를 만들어보는 시간이다.
H2 데이터베이스
실습용으로 사용하기에 좋은 가벼운 DB이다.
웹용 쿼리툴을 제공하기에 데이터를 빠르게 확인할 수 있다.
https://www.h2database.com/html/main.html
H2 Database Engine
H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2.5 MB jar file size Supp
www.h2database.com
JPA 설정 파일
persistence.xml 파일로, JPA 구현체와 데이터베이스의 상호작용을 구성하는 데 사용된다.
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> <persistence-unit name="hello"> <properties> <!-- 필수 속성 --> <property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/> <property name="jakarta.persistence.jdbc.user" value="sa"/> <property name="jakarta.persistence.jdbc.password" value=""/> <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <!-- 옵션 --> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <property name="hibernate.hbm2ddl.auto" value="update" /> </properties> </persistence-unit> </persistence>
몇 가지만 알아보자
- name="hello": 영속성 유닛의 이름을 정의한다. 이 이름은 애플리케이션 내에서 EntityManagerFactory를 생성할 때 사용된다.
- hibernate.show_sql: SQL 로깅 여부를 결정한다. true일 경우, 콘솔에 SQL 문이 출력된다.
- hibernate.use_sql_comments: SQL에 주석을 추가할지 여부를 결정한다.
- hibernate.hbm2ddl.auto: 데이터베이스 스키마 자동 생성 및 갱신 정책을 설정한다. update 옵션은 데이터베이스를 갱신만 하고, 새로 생성하지는 않는다.
데이터베이스 방언
JPA는 특정 데이터베이스에 종속되지 않는다.
각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다른데, 방언은 SQL 표준을 지키지 않는 특정 DB만의 고유한 기능을 뜻한다.
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
우리는 설정파일 내 이러한 코드를 통해서 JPA에게 "나는 지금 H2Dialect를 사용하고 있어" 라고 알려주고 있는 것이다. 그러면 JPA가 알아서 번역해서 사용한다는 뜻이다.

JPA 구동방식

Persistence 클래스가 persistence.xml 설정 정보를 읽어서 EntityManagerFacotory라는 클래스를 만들고
여기서 필요할 때마다 EntityManager을 만들어내는 것이다.
public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); //code em.close(); emf.close(); }
위 코드는 JPA를 사용하여 엔티티 매니저를 초기화하고 시작하는 기본적인 프로세스를 보여준다.
- EntityManagerFactory: 이 클래스는 EntityManager 인스턴스생성된다.
- EntityManager: 이 인터페이스는 엔티티 객체와 데이터베이스 사이의 상호작용을 관리한다. 엔티티의 생성, 조회, 삭제 및 업데이트 등을 처리하며 각각의 EntityManager 인스턴스는 일반적으로 하나의 비즈니스 트랜잭션을 처리하는 데 사용된다.
- 엔티티: JPA에서 엔티티는 데이터베이스 테이블에 매핑되는 자바 클래스이다. 엔티티 클래스는 @Entity 어노테이션으로 정의되며, 각 인스턴스는 데이터베이스 테이블의 행을 나타낸다.
JPQL
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
SQL과 유사하지만 데이터베이스 테이블이 아닌 엔티티 객체에 기반하여 작성된다.
EntityManager em = emf.createEntityManager(); Query query = em.createQuery("SELECT u FROM User u WHERE u.email = :email"); query.setParameter("email", "user@example.com"); List<User> users = query.getResultList();
이 예제에서 createQuery 메소드는 JPQL 쿼리를 받아 실행하며, User 엔티티에서 이메일 필드가 특정 값과 일치하는 모든 사용자를 검색한다. :email은 이름이 지정된 매개변수로, 실행 시점에 값을 할당받는다.
JPQL은 데이터베이스의 테이블과 컬럼을 직접 다루는 것이 아니라, 엔티티 클래스와 그 필드를 사용하여 쿼리를 작성한다. 예를 들어, 데이터베이스에 'users' 테이블이 있고 이 테이블을 대표하는 User 엔티티가 있다면, JPQL 쿼리는 User 엔티티를 직접 참조한다.
이는 JPA가 특정 데이터베이스에 종속되지 않는 점과도 연관된다. JPQL은 데이터베이스에 독립적인 언어로, 다양한 데이터베이스 시스템에 걸쳐 동일한 JPQL 쿼리를 사용할 수 있는 것이다.
사실 아직 엔티티 매니저 팩토리, 엔티티 매니저..등등 JPA의 작동원리를 완벽하게 이해했다고는 못 하겠다.
아직 강의가 많이 남았으니 천천히 정리하며 알아가야겠다.
'백엔드 > Spring' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 04. 엔티티 매핑 (0) | 2025.03.03 |
---|---|
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 03. 영속성 관리 (0) | 2025.02.28 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 01. JPA 소개 (1) | 2025.02.26 |
[실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 도메인 분석 설계 (1) | 2025.01.18 |
객체지향 & TDD (5) | 2024.09.16 |