enginner_s2eojeong
[자바 ORM 표준 JPA 프로그래밍] 02.JPA 시작 본문
1. 프로젝트 생성
H2 데이터베이스 설치 및 실행
- 최고의 실습용 DB
- 별도의 툴 없이 웹 브라우저에서 간편하게 SQL 실행 가능
- 시퀀스(Sequence), 자동 증가(AUTO INCREMENT) 기능 지원
프로젝트 생성
- Java 8 이상 (Java 8 권장)
- Maven 설정
- groupId: jpa-basic
- artifactId: ex1-hello-jpa
- version: 1.0.0
라이브러리 추가
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jpa-basic</groupId>
<artifactId>ex1-hello-jpa</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.3.232</version>
</dependency>
</dependencies>
</project>
이때 H2 데이터베이스 version은 현재 다운받은 버전으로 통일시켜준다.
내가 다운 받은 버전은 2.3.232라서 <version>2.3.232</version> 으로 수정해주었다.
JPA 설정하기
파일 위치: src/main/resources/META_INF/persistence.xml
persistence.xml
<?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="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.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="create" />-->
</properties>
</persistence-unit>
</persistence>
데이터베이스 방언이란?
- JPA(Java Persistence API)는 특정 데이터베이스에 종속되지 않게 설계되어 있지만 실제로 각 데이터베이스는 각자 다른 SQL 문법과 고유한 기능을 제공한다. 이를 "데이터베이스 방언(Dialect)"이라고 부른다.
- 예시:
- 가변 문자:
- MySQL은 VARCHAR
- Oracle은 VARCHAR2
- 문자열 자르기 함수:
- SQL 표준은 SUBSTRING()
- Oracle은 SUBSTR()
- 페이징 처리:
- MySQL은 LIMIT
- Oracle은 ROWNUM
- 가변 문자:
데이터베이스 방언 설정 방법
- JPA 설정 파일인 persistence.xml에서 hibernate.dialect 속성을 사용하여 지정해준다.
- 파일 위치: src/main/resources/META_INF/persistence.xml
현재는 H2 데이터베이스를 사용하기 때문에 value="org.hibernate.dialect.H2Dialect" 으로 설정해주었지만,
사용하는 데이터베이스 종류에 따라 value 값을 바꿔주면 된다.
value="org.hibernate.dialect.MySQLDialect"
value="org.hibernate.dialect.Oracle10gDialect"
2. JPA 애플리케이션 개발
JPA 실행 방식
JPA를 사용하려면 EntityManager를 활용해야 한다.
EntityManagerFactory에서 EntityManager를 생성하여 사용하자.
엔티티(Entity) 생성 및 매핑
JPA에서는 객체와 데이터베이스 테이블을 매핑해야 한다.
@Entity
public class Member {
@Id
private Long id;
private String name;
// Getter, Setter …
}
Member 테이블 생성
CREATE TABLE Member (
id bigint not null,
name varchar(255),
primary key (id)
);
3. 실습 - 회원 저장
1. 회원 등록
id가 "1"이고 name이 "HelloA"라는 member를 생성 해보자.
H2 데이터베이스로 쿼리문을 날려보면 회원 정보가 잘 저장된 것을 확인할 수 있다.
이번에는 id가 "2"이고 name이 "HelloB"인 member를 생성해보자.
두 memebr 모두 잘 저장된 것을 확인할 수 있다.
2. 회원 수정
id가 "1"인 회원의 name을" HelloJPA" 로 수정 해보자.
- JPA는 트랜잭션이 종료될 때, JPA는 내부적으로 엔티티가 변경된 상태임을 감지한다.
- 상태가 달라진 엔티티가 있으면 자동으로 UPDATE 문을 생성하여 데이터베이스에 반영하는데, 이를 Dirty Checking이라고 한다.
- 따라서 persist()나 update() 등의 메서드를 호출할 필요 없이 객체의 상태만 변경하면 된다.
3. 회원 조회
JPQL 쿼리를 통해 회원 조회를 해보자.
createQuery의 parameter로는 "query"와 조회하고자하는 엔티티의 "type"을 넣어주면 된다.
for 문으로 조회된 엔티티를 로그로 찍어보면 "HelloJPA", "HelloB"가 잘 출력되는 것을 확인할 수 있다.
🚨 JPA 사용 시 주의할 점
1. 엔티티 매니저 팩토리는 애플리케이션 전체에서 공유
2. 엔티티 매니저는 쓰레드 간에 공유하면 안 된다
3. JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
JPQL 소개
- JPQL은 객체 지향 쿼리 언어로 엔티티 객체를 대상으로 쿼리를 작성하는 방식
- 데이터베이스 SQL 방언(Oracle, MySQL, PostgreSQL 등)에 독립적
'Backend > Database' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 04.엔티티 매핑 (1) | 2025.03.26 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 03.영속성 관리 (1) | 2025.03.19 |
[자바 ORM 표준 JPA 프로그래밍] 01.JPA 소개 (2) | 2025.03.14 |
Full Text Search를 이용한 DB Optimization (0) | 2025.02.14 |
JPA에서 Index 설정하는 방법 (feat. 쿼리 속도 향상 시키기) - 2편 (0) | 2025.02.13 |