나를 기록하다
article thumbnail
반응형

1. 라이브러리 추가 - 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>
        <!-- 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>2.1.214</version>
        </dependency>
    </dependencies>
</project>

 

 

2. JPA 설정하기 - persistence.xml

  • JPA 설정 파일
  • /META-INF/persistence.xml 위치
  • persistence-unit name으로 이름 지정
  • javax.persistence로 시작 : JPA 표준 속성
  • hibernate로 시작 : 하이버네이트 전용 속성
 

 

3. 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>

 

 

4. 데이터베이스 방언

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

 

1)hibernate.dialect 속성에 지정

  • H2 : org.hiberante.dialect.H2Dialect
  • Oracle 10g : org.hibernate.dialect.Oracle10gDialect
  • MySQL : org.hibernate.dialect.MySQL5lnnoDBDialect

→ 하이버네이트는 40가지 이상의 데이터베이스 방언 지원!

 

 

5. JPA 구동 방식

 

 

 

6. 실습 - JPA 동작 확인

1) JpaMain 클래스 생성, 동작 확인

package hellojpa;

public class JpaMain {
    public static void main(String[] args) {
    }
}
// 결과
/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/bin/java -javaagent:/Users/prao/Library/Application Support/JetBrains/Toolbox/apps/IDEA-C/ch-0/223.8836.41/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=59670:/Users/prao/Library/Application Support/JetBrains/Toolbox/apps/IDEA-C/ch-0/223.8836.41/IntelliJ IDEA CE.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/charsets.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/crs-agent.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/legacy8ujsse.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/openjsse.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/jce.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/jfr.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/jsse.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/management-agent.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/resources.jar:/Users/prao/.sdkman/candidates/java/8.0.292-zulu/zulu-8.jdk/Contents/Home/jre/lib/rt.jar:/Users/prao/Desktop/DEV.PRAO/JPA/ex1-hello-jpa/target/classes:/Users/prao/.m2/repository/org/hibernate/hibernate-entitymanager/5.3.10.Final/hibernate-entitymanager-5.3.10.Final.jar:/Users/prao/.m2/repository/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/Users/prao/.m2/repository/org/hibernate/hibernate-core/5.3.10.Final/hibernate-core-5.3.10.Final.jar:/Users/prao/.m2/repository/org/javassist/javassist/3.23.2-GA/javassist-3.23.2-GA.jar:/Users/prao/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar:/Users/prao/.m2/repository/org/jboss/jandex/2.0.5.Final/jandex-2.0.5.Final.jar:/Users/prao/.m2/repository/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/Users/prao/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar:/Users/prao/.m2/repository/org/dom4j/dom4j/2.1.1/dom4j-2.1.1.jar:/Users/prao/.m2/repository/org/hibernate/common/hibernate-commons-annotations/5.0.4.Final/hibernate-commons-annotations-5.0.4.Final.jar:/Users/prao/.m2/repository/javax/persistence/javax.persistence-api/2.2/javax.persistence-api-2.2.jar:/Users/prao/.m2/repository/net/bytebuddy/byte-buddy/1.9.5/byte-buddy-1.9.5.jar:/Users/prao/.m2/repository/org/jboss/spec/javax/transaction/jboss-transaction-api_1.2_spec/1.1.1.Final/jboss-transaction-api_1.2_spec-1.1.1.Final.jar:/Users/prao/.m2/repository/com/h2database/h2/2.1.214/h2-2.1.214.jar hellojpa.JpaMain

Process finished with exit code 0

 

 

2) 객체와 테이블을 생성하고 매핑하기

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

 

a) 클래스 생성

 

 

b) 매핑

 

 

c) getter and setter 생성(control + enter)

 

 

d) persistence - createEntitiyManagerFactory를 통하여 엔티티 매니저 팩토리 생성

→ 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유

 

 

e) createEntityManger를 통하여 엔티티 매니저 생성

→ 엔티티 매니저는 쓰레드간에 공유하지 않음, 사용하고 버려야 한다.

 

f) h2 데이터베이스 실행

참고로 내 iterm2는 실행 시 기본적으로 python으로 실행되는데 이 창에서 나가는 방법은 ctrl + z 이다. 위와 같은 일련의 과정을 거쳐서 ./h2.sh 를 통해 h2 데이터베이스인 localhost:8082 에 접속한다.

 

g) h2 데이터베이스 연결

 

실행하면 위와 같은 창이 나온다. 참고로 나는 처음에 한글로 설정되어 있으니 에러가 뜨고 실행이 되지 않았는데 English로 바꾸니 문제가 해결되었다. Generic H2 (Server)로 설정하고 연결을 누른다.

 

h) JPA와 연결

value에 JDBC URL에 해당하는 주소값을 넣으면 JPA와 연결된다.

 

i) h2 데이터베이스

연결 시 위의 창이 나온다. 미리 만들어둔 MEMBER 테이블이 존재하는데 삭제하고 다시 만들어보겠다.

삭제는 DROP TABLE 테이블명;으로 삭제가 가능하다.

 

j) h2 데이터베이스에 MEMBER 테이블 생성하기

 

위와 같이 생성되고 id와 name 속성이 들어간 것을 알 수 있다. pk는 id로 설정되었다.

 

k) getTransaction을 통해 트랜잭션 생성

→ JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

 

DB에 (1L, “HelloA”), (2L, “HelloB”) 추가

 

DB에서 SELECT로 조회 시 추가된 것을 확인 가능

 

l) 에러 발생을 조심하기 위해 try - catch 구문 활용

 

m) 수정

출력 결과

 

n) 삭제

 

o) 수정

  • 따로 저장하지 않아도 됨 → JPA를 통해서 엔티티를 가져오면 JPA가 관리함. 바뀔 시 자동으로 UPDATE 쿼리가 동작

 

  • 출력 결과

 

  • DB 결과

HelloJPA로 변경된 것을 확인 가능

김영한님의 자바 ORM 표준 JPA 프로그래밍 강의를 보고 복습용으로 작성한 블로그 포스팅이다.

반응형

'Java > JPA' 카테고리의 다른 글

[JPA] Getter and Setter  (0) 2023.04.02
[JPA] 객체와 테이블, 조인 전략  (0) 2023.04.02
[JPA] Flush  (0) 2023.03.19
[JPA] JPQL의 기초  (0) 2023.03.16
[JPA] JPA 용어 및 개요  (0) 2023.03.15
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...