-
[JPA] 2. JPA 시작ComputerScience/JPA 2022. 6. 6. 20:53
이제 프로젝트를 생성해보겠습니다.
사용도구
사용된 프로그래밍 도구(?)는 다음과 같습니다.
H2 Database
2. 최고의 실습용 DB
3. 비교적 가볍다.
4. 웹용 쿼리툴 제공
5. MySQL, ORACLE DB 시뮬레이션 기능
6. 시퀀스, AUTO INCREMENT 기능 지원
Maven
2. 자바 라이브러리, 빌드 관리
3. 라이브러리 자동 다운로드 및 의존성 관리
참고로 Gradle을 사용하려 했으나, 강의에선 Maven으로 진행하고 있었습니다.
Maven을 한번 사용해보는 것도 좋은 것 같아서 그대로 Maven으로 공부를 진행했습니다.
Java 11
Java 8 대비 11의 향상된 버전은 다음 링크에서 확인 가능합니다.
https://livenow14.tistory.com/81
IntelliJ
프로젝트 생성
IntelliJ 프로젝트 생성을 통해 Maven기반 프로젝트를 생성하도록 하겠습니다.
1. Maven 설정
- groubId : jpa-basic
- artifactId : ex1-hello-jpa
- version : 1.0.0
2. 라이브러리 추가
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>1.4.199</version> </dependency> </dependencies> </project>
3. JPA 설정하기 - persistence.xml
- JPA 설정파일
- /META-INF/persistence.xml 위치
- META-INF 패키지는 main/resource/ 아래에 생성해준다.
- persistence-unit name으로 이름 지정
- javax.persistence로 시작 : JPA 표준 속성
- hibernate로 시작 : 하이버네이트 전용 속성
<?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 문법과 함수는 조금씩 다릅니다.
- 가변 문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2
- 문자열 나누는 함수 : SQL표준은 SUBSTRING(), ORACLE은 SUBSTR()
- 페이징 : MySQL은 LIMIT, ORACLE은 ROWNUM
이를 데이터베이스 방언이라고 부르며 SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능입니다.
persistence.xml 내 hibernate.dialect 속성에 지정할 수 있습니다.
- H2 : org.hibernate.dialect.H2Dialect
- Oracle 10g : org.hibernate.dialect.Oracle10gDialect
- MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
이 외에도 다양한 데이터베이스 방언이 있습니다.
[참고] https://docs.jboss.org/hibernate/orm/5.3/javadocs/org/hibernate/dialect/package-summary.html
JPA 구동 방식
Persistence에서 META-INF/persistence.xml에서 설정 정보를 조회해서 EntityManagerFactory를 생성합니다.
EntityManagerFactory는 EntityManager라는 클래스를 생성해서 사용합니다.
JpaMain 클래스를 만들어주고 다음과 같이 작성합니다.
JpaMain.class
EntityManagerFactory emf = Persistence.createEntityManager("hello"); EntityManager em = emf.createEntityManager(); //code em.close(); emf.close();
현재 코드는 EntityManagerFactory와 EntityManager는 생성했지만 실제 작동하는 코드는 없습니다. 아래처럼 다음과 같이 객체와 테이블을 생성하고 매핑합니다.
객체와 테이블을 생성하고 매핑하기
Member.class
package hellojpa; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Member { @Id private Long id; private String name; //Getter, Setter … }
- @Entity : JPA가 관리할 객체
- @Id : 데이터베이스 PK와 매핑
JpaMain.class
EntityManagerFactory emf = Persistence.createEntityManager("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Member member = new Member(); member.setId(1L); member.setName("HelloA"); em.persist(member);//생성 Member findMember = em.find(Member.class, 1L);//단건 조회 findMember.setName("HelloJPA");//수정 em.remove(member)//삭제 tx.commit(); } catch(Exception e) { tx.rollback(); } finally { em.close(); } emf.close();
- EntityTransaction tx = em.getTransaction() : 실제 DB는 Transcation내에서 이뤄줘야 합니다. Transaction 객체 하나를 생성해줍니다.
- Member member = new Member() : 테이블에 넣기 전 Member 객체를 생성해줍니다.
- member.setId(1L);
- member.setName("HelloA");
- tx.begin() : transction을 시작해줍니다. 실패 시, tx.rollback()을 수행합니다.
- em.persist(member) : EntityManager를 통해 member를 DB내 생성해주는 코드입니다.
- em.find(Member.class, 1L) : DB내 값을 단건 조회해주는 코드입니다.
- setName("helloJPA") : Member 객체에 setter를 통해 수정을 진행해도 테이블 내 값도 수정됩니다.
- em.remove(member) : DB 내 값 삭제해주는 코드입니다.
주의
- 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유해야 합니다.
- 엔티티 매니저는 쓰레드간에 절대 공유하면 안된다.(사용하고 버려야 한다)
- JPA의 모든 데이터 변경은 트랜잭션 안에서만 실행해야 합니다.
'ComputerScience > JPA' 카테고리의 다른 글
[JPA] 4. 엔티티 매핑 - 1. 객체와 테이블 매핑 / 데이터베이스 스키마 자동 생성 (0) 2022.06.25 [JPA] 3. 영속성 관리 - 플러시, 준영속 (0) 2022.06.19 [JPA] 3. 영속성 관리 - 영속성 컨텍스트 (0) 2022.06.11 [JPA] 1. JPA 소개 - JPA 소개 (0) 2022.06.05 [JPA] 1. JPA 소개 - SQL 중심적인 개발의 문제점 (0) 2022.06.02