H2 데이터베이스
개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공 (실무에선 MySQL, Oracle 많이씀)
✓설치 및 실행
H2 Database Engine (redirect)
H2 Database Engine Welcome to H2, the free SQL database. The main feature of H2 are: It is free to use for everybody, source code is included Written in Java, but also available as native executable JDBC and (partial) ODBC API Embedded and client/server mo
www.h2database.com
1. 설치 후 "설치폴더>bin"경로로 터미널 열기
2. 권한 주기
chmod 755 h2.sh
3. 실행
./h2.sh //(Mac)
h2.bat //(Window)
4. H2콘솔창 뜨면 끝

✓데이터베이스 파일 생성
1. 위사진대로 연결(JDBC URL:jdbc:h2:~/[db이름] 최초 한번)
2. 터미널로 홈에 파일 '~/test.mv.db' 생성됐는지 확인
3. 이후 부턴 JDBC URL: jdbc:h2:tcp://localhost/~/[db이름] 로 접속 (파일 직접 접근아닌 소켓통한 접근) 이래야 여러곳에서 접근가능
설정
메이븐
0. 프로젝트 생성

1. 라이브러리 추가
-pom.xml
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.4.2.Final</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
</dependency>
</dependencies>
2. JPA 설정
-resources/META-INF/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"> //JPA 설정묶음 구분 이름
<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>
❗️hibernate.dialect ➡︎ SQL 방언(dialect) 지정
디비마다 문법,함수가 조금씩 다른데 (ex. 페이징: MySQL은 LIMIT , Oracle은 ROWNUM)
JPA는 특정 데이터베이스에 종속 X → hibernate.dialect 속성으로 SQL 방언(dialect) 지정
- H2 : org.hibernate.dialect.H2Dialect
- Oracle 10g : org.hibernate.dialect.Oracle10gDialect
- MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
Hello JPA -애플리케이션 개발
JPA 구동 방식

JPA는 Persistence클래스에서 시작
여기서 persistence.xml 설정 정보를 읽어서 EntityManagerFactory 인터페이스 생성
EntityManagerFactory에서 뭔가 필요할 때마다 EntityManager를 생성해서 사용
사용 - JPA 동작 확인
0. emf, em, fx
-main/java/hellojpa/JpaMain.java
public class JpaMain {
public static void main(String[] args) {
//웹서버실행시점 딱 하나만 생성해 애플리케이션 전체 공유 //persistence.xml 설정 name
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
//em 통해 db작업. 트랜잭션 또는 요청(request) 단위로 생성, 쓰레드간에 공유X(사용하고 버려야함)
EntityManager em = emf.createEntityManager();
//JPA의 모든 데이터 변경은 트랜잭션 안에서 실행!
EntityTransaction tx = em.getTransaction();
tx.begin();
//오류생겨도 close는 되게 try-catch 추가
try {
//code
} catch (Exception e){
tx.rollback();
} finally {
em.close(); //em 내부적으로 디비커넥션을 물고 있기때문에 사용하면 꼭 버려주자
}
emf.close();
}
}
1. 객체와 테이블을 생성하고 매핑하기
-main/java/hellojpa/Member
@Entity //Jpa가 관리할 엔티티 클래스
//@Table(name = "USER") 데이터베이스의 USER 테이블과 매핑(테이블명 다를 경우)
public class Member {
@Id //Pk와 매핑
private Long id;
//@Column(name = "username") 디비와 컬럼명 다를경우
private String name;
//getter,setter..
}
Member member = new Member(); → JPA의 엔티티 객체
💡
엔티티 : 디비 테이블과 매핑되는 클래스
엔티티 객체 : 그 클래스를 new 해서 만든 실제 자바 객체
db
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
)
2. 회원 등록, 수정, 삭제, 조회
try {
//회원 등록
Member member = new Member();
member.setId(1L);
member.setName("Jack");
em.persist(member);
//조회
Member findMember = em.find(Member.class, 1L);
//em.remove(findMember); //삭제
//수정
findMember.setName("HelloJPA"); //jpa가 커밋직전 관리객체 뭔가 바뀌면 업데이트 쿼리 날림
tx.commit();
}catch (Exception e){
tx.rollback();
} finally {
em.close();
}
수정 에서 값만 바꿨는데 업데이트됨. 자바 컬렌션 다룬다는 것처럼 생각하자❗️
≒ Map에서 객체를 꺼내 그 객체의 필드를 직접 바꾸는 것.
Map에 찾은 한 키밸류(Entry 객체)의 주소값(영속성)에 직접 접근해 값넣은 것
//persistenceContext 영속성
Map<Long, Member> persistenceContext = new HashMap<>();
Member findMember = persistenceContext.get(1L);
findMember.setName("HelloJPA");
JPQL (Java Persistence Query Language)
엔티티 객체를 대상으로 하는 객체지향 쿼리 언어 (테이블X, 클래스O)
💡
JPQL: 엔티티 객체를 대상으로 쿼리
SQL: 테이블을 대상으로 쿼리
만약, 특정 조건 회원을 검색하고 싶다면?(검색 쿼리)
//em.createQuery("JPQL문", 엔티티타입.class)
List<Member> result = em.createQuery("select m from Member m", Member.class)
.setFirstResult(5)
.setMaxResults(8)
.getResultList();
for (Member member : result) {
System.out.println(member.getName());
}
tx.commit();
1. 모든 DB 데이터를 객체로 변환해 검색은 불가능 → 쿼리 필요
2. SQL과 문법 유사 (SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원)
3. SQL을 추상화하여 특정 DB에 의존하지 않음
후에 자세히 알아보자.
'JPA' 카테고리의 다른 글
| [JPA] 다양한 연관관계 매핑 (0) | 2025.04.03 |
|---|---|
| [JPA] 연관관계 매핑 (0) | 2025.03.31 |
| [JPA] 엔티티 매핑 (0) | 2025.03.29 |
| [JPA] 영속성 관리 - 내부 동작 방식 (0) | 2025.03.26 |
| [JPA] 개요 (0) | 2025.03.19 |