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 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
![](https://blog.kakaocdn.net/dn/ZecZG/btr36G4T0LI/4zyKxfuVamY3PZrv2KKSYk/img.png)
1)hibernate.dialect 속성에 지정
![](https://blog.kakaocdn.net/dn/dxUZq3/btr33xVuXdg/Vcw0lC72IdgnRR9O4LEXK1/img.png)
- H2 : org.hiberante.dialect.H2Dialect
- Oracle 10g : org.hibernate.dialect.Oracle10gDialect
- MySQL : org.hibernate.dialect.MySQL5lnnoDBDialect
→ 하이버네이트는 40가지 이상의 데이터베이스 방언 지원!
5. JPA 구동 방식
![](https://blog.kakaocdn.net/dn/bbIUkB/btr35wIjcZn/84sFMf36cdRojBrFu8vBVK/img.png)
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) 클래스 생성
![](https://blog.kakaocdn.net/dn/lhC8a/btr34aFWqhs/wx89tnGKzGTax7GE91yB70/img.png)
b) 매핑
![](https://blog.kakaocdn.net/dn/dkC8ho/btr38o3JsVj/HSZQESKL59WOwmPj36enD1/img.png)
c) getter and setter 생성(control + enter)
![](https://blog.kakaocdn.net/dn/n9TiJ/btr38pVU3xd/sdUKhxhnscaK1AGQjU0mL0/img.png)
d) persistence - createEntitiyManagerFactory를 통하여 엔티티 매니저 팩토리 생성
→ 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
![](https://blog.kakaocdn.net/dn/dD86GM/btr4bllj72g/u6LiHDnfw0VfvEQ9TEwII0/img.png)
e) createEntityManger를 통하여 엔티티 매니저 생성
→ 엔티티 매니저는 쓰레드간에 공유하지 않음, 사용하고 버려야 한다.
![](https://blog.kakaocdn.net/dn/kX9qF/btr38KFJb5D/p9qE22G5CNHLIQq1k28XWK/img.png)
f) h2 데이터베이스 실행
![](https://blog.kakaocdn.net/dn/cN3eOS/btr36GRmmhr/CbueG0k2NC1rL9JxmW7ZQ1/img.png)
참고로 내 iterm2는 실행 시 기본적으로 python으로 실행되는데 이 창에서 나가는 방법은 ctrl + z 이다. 위와 같은 일련의 과정을 거쳐서 ./h2.sh 를 통해 h2 데이터베이스인 localhost:8082 에 접속한다.
g) h2 데이터베이스 연결
![](https://blog.kakaocdn.net/dn/bQx9bg/btr35EMZvS0/g0cEZ5wcAr7JtRx3pa2zf0/img.png)
실행하면 위와 같은 창이 나온다. 참고로 나는 처음에 한글로 설정되어 있으니 에러가 뜨고 실행이 되지 않았는데 English로 바꾸니 문제가 해결되었다. Generic H2 (Server)로 설정하고 연결을 누른다.
h) JPA와 연결
![](https://blog.kakaocdn.net/dn/cgtYL6/btr32vp5lwi/qyre3xfEHmQpCe937K6Us1/img.png)
value에 JDBC URL에 해당하는 주소값을 넣으면 JPA와 연결된다.
i) h2 데이터베이스
![](https://blog.kakaocdn.net/dn/bpJWB1/btr34Ca78GF/ZBSQIBvCttWpUJNc7tkLnK/img.png)
연결 시 위의 창이 나온다. 미리 만들어둔 MEMBER 테이블이 존재하는데 삭제하고 다시 만들어보겠다.
삭제는 DROP TABLE 테이블명;으로 삭제가 가능하다.
j) h2 데이터베이스에 MEMBER 테이블 생성하기
![](https://blog.kakaocdn.net/dn/bJowhv/btr35F6dREV/SPurOrRhcpPWRac89unWK0/img.png)
위와 같이 생성되고 id와 name 속성이 들어간 것을 알 수 있다. pk는 id로 설정되었다.
k) getTransaction을 통해 트랜잭션 생성
→ JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
DB에 (1L, “HelloA”), (2L, “HelloB”) 추가
![](https://blog.kakaocdn.net/dn/bPBorw/btr4bkzXYPQ/c6QsAAlMbQtfe60cU3Dkk0/img.png)
DB에서 SELECT로 조회 시 추가된 것을 확인 가능
l) 에러 발생을 조심하기 위해 try - catch 구문 활용
![](https://blog.kakaocdn.net/dn/tQxl6/btr38OnM2zk/CzA8nfT0tqNu8PYgGfTm21/img.png)
m) 수정
![](https://blog.kakaocdn.net/dn/bCgV8k/btr34aFWweJ/YCWQEbpgfpXOaSN5YJkOpK/img.png)
출력 결과
![](https://blog.kakaocdn.net/dn/ZSAM4/btr38Ldx8LE/vbCfUxk3kGL0nmds6fwjf1/img.png)
n) 삭제
![](https://blog.kakaocdn.net/dn/kIDT3/btr34ccGXbx/FhurPd7Fue0bVnJ6GCAaVk/img.png)
o) 수정
- 따로 저장하지 않아도 됨 → JPA를 통해서 엔티티를 가져오면 JPA가 관리함. 바뀔 시 자동으로 UPDATE 쿼리가 동작
![](https://blog.kakaocdn.net/dn/vevAW/btr35FFbno8/0SCNjK4IOZ7luLbbdBmzlK/img.png)
- 출력 결과
![](https://blog.kakaocdn.net/dn/y5H60/btr32vcwJsO/jYtOyQtqb5wlicVLdwkUGk/img.png)
- DB 결과
![](https://blog.kakaocdn.net/dn/bZg3nl/btr4aLdj6mp/4wjcfPqyFzWrDKgAUtKyCk/img.png)
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 |