✍️
이런 걸
배워요!
JPA의 기본기를 탄탄하게 다질 수 있습니다.
JPA의 내부 동작 방식을 이해할 수 있습니다.
객체와 DB 테이블을 올바르게 설계하고 매핑할 수 있습니다.
실무에서 자신있게 JPA를 사용할 수 있습니다.
인프런 강의 : https://www.inflearn.com/course/ORM-JPA-Basic
소스 :https://github.com/braverokmc79/ex1-hello-jpa-common
강의 자료 :
https://github.com/braverokmc79/jpa-basic-lecture-file
[1] JPA 소개
1. Hello JPA - 프로젝트 생성
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21684&tab=curriculum
pom.xml
<?xml version="1.0"?> <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> <parent> <groupId>jpa-basic</groupId> <artifactId>ex1-hello-jpa</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>ex1-hello-jpa-common</artifactId> <dependencies> <!-- JPA 하이버네이트 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.6.15.Final</version> </dependency> <!-- H2 데이터베이스 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </dependency> </dependencies> </project>
resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1"> <persistence-unit name="simple-jpa-application"> <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" /> <!-- 옵션 --> <!-- 콘솔에 하이버네이트가 실행하는 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" /> <!-- JPA 표준에 맞춘 새로운 키 생성 전략 사용 --> <property name="hibernate.id.new_generator_mappings" value="true" /> <!-- 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성 --> <property name="hibernate.hbm2ddl.auto" value="create" /> <!-- 이름 매핑 전략 설정 - 자바의 카멜 표기법을 테이블의 언더스코어 표기법으로 매핑 ex) lastModifiedDate -> last_modified_date --> <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" /> </properties> </persistence-unit> </persistence>
2. Hello JPA - 애플리케이션 개발
강의 ;
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21685&tab=curriculum
Member
package hellojap; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity //@Table(name="USER") public class Member { @Id private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
JpaMain
package hellojap; import java.util.List; 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(); //JPA 의 모든 데이터 변경은 트랜잭션 안에서 실행 되어야 한다. EntityTransaction tx=em.getTransaction(); tx.begin(); try { /*생성 Member member =new Member(); member.setId(2L); member.setName("HelloB"); em.persist(member); */ /*조회 Member findMember =em.find(Member.class, 1L); System.out.println("findMember = "+ findMember.getId()); */ /* 삭제 Member findMember =em.find(Member.class, 1L); em.remove(findMember); */ /*수정 */ Member findMember =em.find(Member.class, 1L); findMember.setName("JH"); List<Member> reuslt=em.createQuery("select m from Member as m " , Member.class) .setFirstResult(5) .setMaxResults(8) .getResultList(); for(Member member : reuslt) { System.out.println("member.name = " + member.getName()); } tx.commit(); }catch(Exception e) { tx.rollback(); }finally { em.close(); } emf.close(); } }
• 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에 서 공유
• 엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야 한다).
• JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
JPQL 소개
• 가장 단순한 조회 방법
• EntityManager.find()
• 객체 그래프 탐색(a.getB().getC())
• 나이가 18살 이상인 회원을 모두 검색하고 싶다면?
실습 - JPQL 소개
• JPQL로 전체 회원 검색
• JPQL로 ID가 2 이상인 회원만 검색
• JPQL로 이름이 같은 회원만 검색
• JPQL에 대해 자세한 내용은 객체지향 쿼리에서 학습
JPQL
• JPA를 사용하면 엔티티 객체를 중심으로 개발
• 문제는 검색 쿼리
• 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
• 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
• 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검
색 조건이 포함된 SQL이 필요
JPQL
• JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
• SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY,
HAVING, JOIN 지원
• JPQL은 엔티티 객체를 대상으로 쿼리
• SQL은 데이터베이스 테이블을 대상으로 쿼리
JPQL
• 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
• SQL을 추상화해서 특정 데이터베이스 SQL에 의존X
• JPQL을 한마디로 정의하면 객체 지향 SQL
• JPQL은 뒤에서 아주 자세히 다룸
[2] .영속성 관리 - 내부 동작 방식
3.영속성 컨텍스트 1
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21686&tab=curriculum
영속성 컨텍스트
• JPA를 이해하는데 가장 중요한 용어
• “엔티티를 영구 저장하는 환경”이라는 뜻
• EntityManager.persist(entity);
4.영속성 컨텍스트 2
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21687&tab=curriculum
5.플러시
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21688&tab=curriculum
플러시 발생
• 변경 감지
• 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
• 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
(등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 플러시하는 방법
• em.flush() - 직접 호출
• 트랜잭션 커밋 - 플러시 자동 호출
• JPQL 쿼리 실행 - 플러시 자동 호출
플러시는!
• 영속성 컨텍스트를 비우지 않음
• 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
• 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨
6.준영속 상태
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21689&tab=curriculum
준영속 상태로 만드는 방법
• em.detach(entity)
특정 엔티티만 준영속 상태로 전환
• em.clear()
영속성 컨텍스트를 완전히 초기화
• em.close()
영속성 컨텍스트를 종료
7.정리
강의 :
https://www.inflearn.com/course/lecture?courseSlug=ORM-JPA-Basic&unitId=21690&tab=curriculum
댓글 ( 4)
댓글 남기기