-
[JPA] 2. JPA 시작ComputerScience/JPA 2022. 6. 6. 20:53
이제 프로젝트를 생성해보겠습니다.
사용도구
사용된 프로그래밍 도구(?)는 다음과 같습니다.
H2 Database
H2 Database Engine (redirect)
H2 Database Engine Welcome to H2, the free SQL database. The main feature of H2 are: It is free to use for everybody, source code is included Written in Java, but also available as native executable JDBC and (partial) ODBC API Embedded and client/server mo
www.h2database.com
2. 최고의 실습용 DB
3. 비교적 가볍다.
4. 웹용 쿼리툴 제공
5. MySQL, ORACLE DB 시뮬레이션 기능
6. 시퀀스, AUTO INCREMENT 기능 지원
Maven
Maven – Welcome to Apache Maven
Welcome to Apache Maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. If you
maven.apache.org
2. 자바 라이브러리, 빌드 관리
3. 라이브러리 자동 다운로드 및 의존성 관리
참고로 Gradle을 사용하려 했으나, 강의에선 Maven으로 진행하고 있었습니다.
Maven을 한번 사용해보는 것도 좋은 것 같아서 그대로 Maven으로 공부를 진행했습니다.
Java 11
Java 8 대비 11의 향상된 버전은 다음 링크에서 확인 가능합니다.
https://livenow14.tistory.com/81
[Java] Java8과 Java11의 특징
정리 java8의 특징은 이전 포스트에 다뤘어요. 이번엔 java 11을 다뤄보려 해요. Java 10은 라이선스 없이 상업적으로 사용할 수 있는 마지막 무료 Oracle JDK 였어요. JAva 11부터는 Open JDK 를 무료로 사용
livenow14.tistory.com
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
org.hibernate.dialect (Hibernate JavaDocs)
An SQL dialect for MariaDB 10.3 and later, provides sequence support, lock-timeouts, etc.
docs.jboss.org
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