프로젝트 설정
application.properties
#port
server.port=9090
#encoding
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force=true
server.servlet.encoding.enabled=true
sqlplus
create user springjpa identified by springjpa;
grant connect, resource to springjpa;
Database : XE
username = springjpa
password = springjpa
<?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="oracle.jdbc.driver.OracleDriver" />
<property name="javax.persistence.jdbc.user" value="springjpa" />
<property name="javax.persistence.jdbc.password" value="springjpa" />
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<!-- 테이블 생성 옵션 ( 필요할 때만 사용 ) -->
<property name="hibernate.hbm2ddl.auto" value="create"/>
<!-- 옵션 -->
<!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
<property name="hibernate.show_sql" value="true" />
<!-- SQL 출력 시 보기 쉽게 정렬 -->
<property name="hibernate.format_sql" value="true" />
<!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
<property name="hibernate.use_sql_comments" value="true" />
</properties>
</persistence-unit>
</persistence>
ㅇ 개념 정리
- SQL문이 아닌 Method를 통해 DB를 조작 할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중 가능
- 선언문, 할당 등의 코드가 줄어들고, 각종 객체에 대한 코드는 별도 작성하여 코드의 가독성이 높음
- 객체지향적인 코드 작성이 가능하기 때문에 생산성이 증가
- 매핑 정보가 class로 명시되기 때문에, ERD 의존도를 낮출 수 있다.
- 데이터베이스가 바뀌어도 쿼리를 수정할 필요가 없다. 유지보수 및 리팩토링에 유리
- 프로젝트 설계가 잘못 된 경우, 속도 저하나 일관성을 무너뜨리는 문제점 발생
- 복잡하고 비즈니스 로직에 종속적인 쿼리의 경우 속도를 위해 별도 튜닝이 필요하기 때문에 결국 SQL문을 써야 할 수 있다.
시작
Member.java
생성@Entity
@Getter @Setter
public class Member {
@Id
private Long id;
private String name;
}
-> create table Member( id number primary key, name varchar(200) };
JpaMain.java
생성public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// Transaction 발생
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member = new Member();
// 데이터 추가 ( 확인용 )
member.setId(1L);
member.setName("userA");
// persist: DB에 저장
em.persist(member);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
emf.close();
}
}
}
콘솔
테이블 생성옵션 ( 테이블 드랍 )
테이블 생성옵션 ( 테이블 생성 )
인서트
JpaMain.java
수정...
Member findMember = em.find(Member.class, 1L);
...
JpaMain.java
수정...
findMember.setName("UpdateUser");
...
JpaMain.java
수정...
em.remove(findMember);
...
JPA는 쿼리를 짤 때 Table을 대상으로 쿼리를 작성하지 않고,
member 객체를 통해서 쿼리를 작성한다.
JpaMain.java
수정...
try {
List<Member> result = em.createQuery("select m from Member as m", Member.class).getResultList();
for(Member member : result) {
System.out.println("member.name = " + member.getName());
}
...
JpaMain.java
수정...
try {
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.setFirstResult(5) // 5번
.setMaxResults(10) // 10개 가져오기
.getResultList();
for(Member member : result) {
System.out.println("member.name = " + member.getName());
}
...