05. Hello JPA - 애플레이션 개발

김성수·2023년 4월 3일
0

⚡ 생각대로 살지 않으면 사는대로 생각한다.

⚡ 나는 어차피 잘 될 놈이다. 이미 잘 되고 있고, 계속해서 잘 되고 있다.


JPA 구동 방식

PersistenceMETA-INF/persistence.xml애서 설정 정보를 조회하고, EntityManagerFactory를 통해서 EntityManager를 생성한다.

❗혹시 자바 버전을 11로 설정하고, 강의 진행처럼 되지 않으면서 문제가 생긴다면, 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.0</version>
    <dependencies>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <!-- 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>1.4.199</version>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
</project>

✅JPA에는 트랜잭션 단위가 굉장히 중요하다!

  • 데이터를 변경하는 모든 작업은 트랜잭션 안에서 작업해줘야 한다.

persistance의 옵션

<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
  • show_sql : SQL 쿼리를 보여준다.
  • format_sql : SQL쿼리를 일정한 형태로 포매팅해서 예쁘게(?) 표시해준다.
  • use_sql_commnets : 주석과 같은 의미.
    • 아래의 /* */부분이 생기는 이유.


필수 애너테이션

  • @Entity
    • Persistance의 Entity 표시
    • class 레벨
  • @Id
    • PK를 알려줌
    • field 레벨
  • @Table
    • 어떤 테이블과 매핑할건지 지정
    • field 레벨
  • @Column
    • 속성과 컬럼을 매핑해줌.
    • field 레벨

createEntityManagerFactory의 매개변수에는 persistence.xmlpersistance unit name을 지정하여 EntityManagerFactory 인스턴스를 생성한다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

EntityManagerFactory를 통해서 EntityManager를 생성한다
EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유


EntityManager는 트랜잭션 단위마다 만들어줘야 한다.

EntityManager em = emf.createEntityManager();

EntityManager는 쓰레드간에 공유하면 안 된다.

  • 요청이 올 때마다 썻다가 close()메서드로 닫고 버려줘야한다.

JPA의 모든 데이터 변경은 트랜잭션 안에서 수행되어야 한다.
트랜잭션을 얻는 코드

EntityTransaction tx = em.getTransaction();

트랜잭션을 시작하는 코드

tx.begin();

트랜잭션을 커밋하는 코드

tx.commit();

트랜잭션을 롤백하는 코드

tx.rollback();

JPA에 저장할 때

em.persist(인스턴스);

조회할 때,

em.find(Member.class, 1L); // 클래스이름, PK(기본키, @Id)

삭제할 때

em.remove(인스턴스);

수정

Member  findMember = em.find(Member.class, 1L); // 멤버 찾고,
findMember.setName("HelloJPA"); // 찾은 멤버 수정
// 이 때, persist하지 않아도 된다!

애플리케이션 종료시, 반드시 얻어온 EntityManager를 버려야한다.

애플리케이션이 끝나면, EntityManager를 꺼줘야한다. EntityManager가 내부적으로 데이터베이스 커넥션을 물고 동작하는데, 어쨌든 반드시 사용을 끝내줘야한다.

em.close();

웹 어플리케이션이라면, WAS가 내려갈 때, 애플리케이션이 종료될 때, EntityManagerFactory를 닫아줘야한다.

emf.close();

JPQL

  • JPQL의 대상은 테이블을 대상으로 하는 것이 아니라, 객체를 대상으로 한다.
  • 설정된 방언(Dialect에 맞게 쿼리를 날린다.
  • JPA를 사용하면 엔티티 객체를 중심으로 개발을 하는데, 문제는 검색 쿼리다.
    • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색하고, 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.
  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
  • SQL과 문법 유사
    • SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.
  • JPQL은 엔티티 객체를 대상으로 쿼리
    • SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
    • JPQL은 객체 지향 SQL이라고 볼 수 있다.
  • SQL은 데이터베이스 테이블을 대상으로 쿼리함.

-끝-

profile
쌩수 Git >> https://github.com/SsangSoo?tab=repositories

0개의 댓글