스프링

 

 

✍️
이런 걸
배워요!

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

사랑받는 일은 불타오름에 지나지 않으나 사랑하는 것은 마르지 않는 기름에 의해 빛남을 말한다. 그러므로, 사랑받는 것은 사라져 버리지만 사랑하는 것은 오랫동안 지속한다. -릴케

댓글 ( 4)

댓글 남기기

작성