[자바 ORM 표준 JPA 프로그래밍 - 기본편] 02. JPA 시작하기

Turtle·2024년 6월 17일
0
post-thumbnail

🙄H2 데이터베이스 설치 및 연동

  • ✔️최초 접속
    • jdbc:h2:~/test
  • ✔️이후 접속
    • jdbc:h2:tcp://localhost/~/test

🙄애플리케이션 개발

  • ✔️설정 정보
    • /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">
        <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="create" />
        </properties>
    </persistence-unit>
</persistence>
  • ✔️데이터베이스 방언
    • JPA는 특정 데이터베이스에 종속X
    • 각각의 데이터베이스가 제공하는 SQL문법과 함수는 조금씩 다름
    • 방언 : SQL표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
  • ✔️JPA 구동 방식
    • 엔티티 매니저 팩토리 생성하기
      • JPA를 시작하려면 persistence.xml의 설정 정보를 사용해서 엔티티 매니저 팩토리를 생성해야 한다. 이 때, Persistence 클래스를 사용하는데 이 클래스는 엔티티 매니저 팩토리를 생성해서 JPA를 사용할 수 있게 준비한다.
      • META-INF/persistence.xml에서 이름이 hello인 영속성 유닛을 찾아서 JPA를 동작시키기 위한 기반 객체를 만들고, JPA 구현체에 따라서는 데이터베이스 커넥션 풀도 생성하므로 엔티티 매니저 팩토리를 생성하는 비용은 아주 크다.
      • 따라서 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다.
    • 엔티티 매니저 생성하기
      • 엔티티 매니저 팩토리에서 엔티티 매니저를 생성한다.
      • 엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록, 수정, 삭제, 조회할 수 있다.
      • 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드 간에 공유하거나 재사용하면 안 된다.
    • 종료
      • 사용이 끝난 엔티티 매니저는 반드시 종료해야하며 애플리케이션을 종료할 때 엔티티 매니저 팩토리도 반드시 종료해야한다.
  • ✔️회원 도메인 작성
@Entity
public class Member {
	@Id
	private Long id;
	private String name;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
  • ✔️트랜잭션 관리
    • JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다.
    • 트랜잭션 없이 데이터를 변경하면 예외가 발생한다.
    • 트랜잭션을 시작하려면 엔티티 매니저에서 트랜잭션 API를 받아와야 한다.
    • 트랜잭션 API를 사용해서 비즈니스 로직이 정상 동작하면 트랜잭션을 커밋하고 예외가 발생하면 트랜잭션을 롤백한다.
  • ✔️메인 클래스 작성
public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction ta = em.getTransaction();
        ta.begin();

        try {
            Member member = new Member();
            member.setId(1L);
            member.setName("Hello");
            em.persist(member);
            ta.commit();
        } catch (Exception e) {
            ta.rollback();
        } finally {
            em.close();
        }
        emf.close();
    }
}
  • ✔️JPQL
    • 하나 이상의 회원 목록을 조회하는 코드
    List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
    • JPA를 사용하면 개발자는 엔티티 객체를 중심으로 개발하고 데이터베이스에 대한 처리를 JPA에 맡긴다. JPA는 엔티티 객체를 중심으로 개발하므로 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색을 해야 한다.
    • 그런데 테이블이 아닌 엔티티 객체를 대상으로 검색하려면 데이터베이스의 모든 데이터를 애플리케이션으로 불러와서 엔티티 객체로 변경한 다음 검색해야하는데 이 과정은 사실상 불가능하다.
    • 애플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 결국 검색 조건이 포함된 SQL을 사용해야 한다. JPA는 JPQL이라는 쿼리 언어로 문제를 해결한다.
    • JPQL은 엔티티 객체를 대상으로 쿼리한다. select m from Member as m와 같이 JPQL을 이용해서 작성하면 회원 엔티티 객체를 대상으로 쿼리한다.
    • JPQL은 엔티티 객체를 대상으로 쿼리를 수행하지만 최종적으로는 SQL로 변환이 되어 데이터베이스에 적용이 된다. JPQL이 엔티티 객체를 대상으로 쿼리를 한다는 것은 JPQL이 데이터베이스의 테이블 구조와 직접적으로 대응하는 SQL과는 달리 애플리케이션의 엔티티 클래스와 그 속성을 기반으로 쿼리를 작성한다는 것을 의미한다.
    • 이 때, Member는 테이블이 아니고 회원 엔티티 객체를 말하는 것이다.
    • JPQL을 사용하려면 em.createQuery() 메서드를 실행해서 쿼리 객체를 생성한 후 쿼리 객체의 getResultList() 메서드를 호출하면 된다.

0개의 댓글