[JPA] Hello JPA

2025. 3. 24. 23:29·JPA

H2 데이터베이스


개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공 (실무에선 MySQL, Oracle 많이씀)

✓설치 및 실행

0. http://www.h2database.com/

 

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
'JPA' 카테고리의 다른 글
  • [JPA] 연관관계 매핑
  • [JPA] 엔티티 매핑
  • [JPA] 영속성 관리 - 내부 동작 방식
  • [JPA] 개요
Naah
Naah
  • Naah
    blueprint
    Naah
  • 전체
    오늘
    어제
    • 분류 전체보기 (106)
      • Java (28)
      • Kotlin (0)
      • TypeScript (7)
      • React (22)
      • Next.js (1)
      • Spring (22)
      • JPA (12)
      • Spring Data JPA (6)
      • Querydsl (1)
      • Error (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • manage
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Naah
[JPA] Hello JPA
상단으로

티스토리툴바