[JPA] JPA 시작하기

윤경·2021년 10월 8일
0

JPA

목록 보기
1/22
post-thumbnail

[1] Hello JPA - 프로젝트 생성

1. H2 데이터베이스 설치

(완료)
해당 경로에서 ./h2.sh로 실행

2. 메이븐으로 프로젝트 생성

메이븐

  • 자바 라이브러리, 빌드 관리
  • 라이브러리 자동 다운로드 및 의존성 관리
  • 최근에는 Gradle이 점점 유명. (하지만 아직 메이븐 많이 쓰므로 이번엔 메이븐으로 하신다고 함.)

groupId: jpa-basic
artifactId: ex1-hello-jpa
version: 1.0.0

3. 라이브러리 추가, JPA 설정

JPA 설정할 때 META-INF 디렉토리 만들어서 그 안에 persistence.xml 파일 생성해주기

pom.xml에 코드 추가

    <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>1.4.199</version>
        </dependency>
    </dependencies>

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="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는 특정 데이터베이스에 종속되지 않음
  • 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름
  • 방언: SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능

[2] Hello JPA - 애플리케이션 개발

📌 게시판을 보니 내가 깔아놓은 버전은 오류가 난다고 해서 H2 데이터베이스 버전을 1.4.200 → 1.4.199로 재다운로드함.

JPA 구동 방식

실습

아,, 뭐야,,콱,,;

<?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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <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>1.4.199</version>
        </dependency>
    </dependencies>
</project>

📌 다행히도 build 태그 내용들을 추가해 다시 실행하니 해결
참고

테이블 생성


❌ 문제!! exit code0이 아닌 1로 뜸 → 뭔가 잘못됨
아래와 같이 해결 방법을 알아봄

저는 안돼도 다른 분들은 내가 안 된 방법으로 해결된 경우도 있으니 참고하세요.

⬇️ 참고

1. 안됨

                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
  1. 안됨

  1. 안됨

(일단 저는 안되네요,, 어떡하냐,, 콱,,
해결 방법을 아시는 분은 제발 알려주세요.
일단 실습은 안되는대로 따라하면서 강의 듣겠습니다.)

해결했습니다 😎

위 방법 다 써보고 적용해서 재실행하고 안돼서 껐다 켜서 다시 해봤는데 갑자기 되네요,,^ ^;;,,


등록

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

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        
        Member member = new Member();
        member.setId(1L);
        member.setName("HelloA");
        
        em.persist(member);
        
        tx.commit();
        
        em.close();
        
        emf.close();

삭제

        try {
            Member findMember = em.find(Member.class, 1L);

            em.remove(findMember);

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }

수정

        try {
            Member findMember = em.find(Member.class, 1L);

            findMember.setName("HelloJPA");

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }

JPA를 통해서 엔티티를 가져오면 JPA가 관리를 함. 변경이 됐는지 안됐는지 트렌젝션을 커밋하는 시점에 관리를 해줌. 뭔가 바뀌었다? 싶으면 업데이트 쿼리를 만들어서 날려줌. 그 덕에 우리는 저장하는 코드 없이도 값만 변경해놓고 수정된 결과를 확인할 수 있었음.


@Entity: JPA가 관리할 객체
@Id: 데이터베이스 PK와 매핑

📌

  • 엔티티 매니저 팩토리는 하나만 생성해 애플리케이션 전체에서 공유
  • 엔티티 매니저는 쓰레드간 공유 X(사용하고 버리기)
  • JPA의 모든 데이터 변경은 트랜젝션 안에서 실행

JPA

: 가장 단순한 조회 방법

  • EntityManager.find(`
  • 객체 그래프 탐색(a.getB().getC())

JPQL

  • JPA를 사용하면 엔티티 객체를 중심으로 개발

  • (문제는 검색 쿼리인데) 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색

  • 모든 DB 데이터를 객체로 변환해 검색하는 것은 불가능

  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요

  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공

  • SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원

  • JPQL은 엔티티 객체를 대상으로 쿼리

  • SQL은 데이터베이스 테이블을 대상으로 쿼리

한마디로, JPQL은 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이다.
SQL을 추상화하여 특정 데이터베이스 SQL에 의존하지 않는다.

➡️ 객체 지향 SQL


profile
개발 바보 이사 중

0개의 댓글