728x90
h2데이터베이스를 켠다.
연결한다. URL과 사용자명, 비밀번호는 기억해뒀다가 프로젝트 설정 파일에 넣어줄거다.
maven 프로젝트를 생성한다.
src/main/resources 밑에 META-INF/persistence.xml 파일을 만들어준다.
<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>
- h2 데이터베이스를 사용
- h2 데이터베이스와 관련된 user이름, password, url을 기입해줌
- h2 데이터베이스를 사용해야하므로, jpa가 알 수 있게 diralect를 H2로 설정해준다. 방언은 SQL 표준을 지키지 않는 H2나 mysql 등의 특정 dbms만의 고유한 기능을 말한다.
- show_sql, format_sql, use_sql_comments는 JPA에서 생성하는 sql문을 볼 수 있게 해주는 설정이다.
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>
<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 하이버네이트 -->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.14.Final</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- H2 데이터베이스 -->
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
- 하이버네이트를 사용할 것이니 하이버네이트를 넣어준다.(나중에 spring 사용할 거 고려한 버전을 사용하는 것이 좋음)
- H2 데이터베이스는 최신 버전인 2.1.214를 깔아주었다.
- Maven Repository: Search/Browse/Explore (mvnrepository.com) 여기서 h2랑 하이버네이트 검색해서 복붙해오면 된다.
src/main/java/hellojpa/JpaMain.java를 만들어준다.
데이터베이스에 Member 테이블을 만들 것이기 때문에 Member class를 만들어준다.
package hellojpa;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Member {
@Id
private Long id;
private String name;
}
- @Entity: jpa를 사용한다고 알려주는 애너테이션. jpa가 이 클래스를 관리한다.
- @Id: id가 Member 테이블의 primary key라는 것을 알려준다.
- 여기에 getter setter도 만들어준다(lombok을 사용하면 더 좋음)
<JpaMain.java> 회원 추가
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member);
em.close();
emf.close();
}
}
- 가장 기본적인 코드다.
- EntityManagerFactory: 데이터베이스를 연결하는 것이라고 생각. 애플리케이션 로딩 시점에 딱 한 번만 만든다.
- EntityManager: 회원 조회 등 데이터베이스에 접근할 때마다 만드는 애.
- em.persist: 데이터베이스에 저장하는 것
- 앱이 종료할 때 EntityManagerFactory를 close해줘야한다.
<JpaMain.java> transaction의 추가
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member);
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
- JPA는 모든 데이터 변경은 트랜잭션 안에서 실행되어야한다.
- 트랜잭션 commit 시점에 변경사항이 데이터베이스에 반영되기 때문
회원 찾기 코드
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember = " + findMember);
System.out.println("findMember.getName() = " + findMember.getName());
회원 삭제 코드
em.remove(findMember);
회원 수정 코드
findMember.setName("HelloS");
전체 회원 조회 코드(JPQL 사용)
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.setFirstResult(1) // 페이징
.setMaxResults(10)
.getResultList();
- 전체 회원 조회는 JPQL을 사용한다.
- JPQL은 객체를 대상으로 한 쿼리문이다. 데이터베이스 테이블과는 관련이 없다. 테이블 관련은 JPA가 알아서 해주니까 신경 안써도 됨.
- 페이징도 저렇게만 해주면 oracle, mysql, h2 상관없이 알아서 JPA가 해준다. (database 독립적)
인프런의 [자바 ORM 표준 JPA 프로그래밍 - 기본편] 강의를 참고하였습니다😀😀
728x90
'Backend > JPA' 카테고리의 다른 글
[JPA] 영속성 전이 (0) | 2023.01.19 |
---|---|
[JPA] 즉시 로딩과 지연 로딩 (0) | 2023.01.18 |
[JPA] 프록시 강의 정리 (4) | 2023.01.18 |
JPA 상속관계 매핑 (0) | 2023.01.18 |
JPA 강의 정리1 (0) | 2023.01.16 |