JPA란? JPA 장점, JPA 프로젝트 설정
ORM(Object-reational mpping)
=> 객체 관계 매핑. 객체지향 언어의 이점을 살려서 관계형 데이터베이스 언어에 접근하는 언어
객체는 객체대로 설계, 관계형 DB는 관계형 DB대로 설계가 가능하다.
이 둘 사이를 이어주는건(mapping) JPA가 알아서한다.
JPA(Java Persistence API)
- Java의 ORM 기술표준
- SQL을 한땀한땀 만드는 행동줄임(SQL 중심의 개발에서 객체 중심으로 개발 가능)
JPA의 장점
-> SQL문을 한땀한땀 만들고 수정하지 않아도 된다.
ex) 만약 속성하나 추가 -> 모든 쿼리 수정
-> 객체지향 언어의 성질과 관계형 데이터베이스의 성질의 차이를 극복하기 쉽다.
ex) 자바의 컬렉션 형태의 데이터 처리방법을 그대로 사용하여 DB를 다룰 수 있다면 베스트이지 않을까? -> 대신 객체와 테이블을 제대로 설계하고 매핑할 줄아야한다.
-> JPA와 패러다임의 불일치 해결
단순예시
JPA를 쓰지 않으면 (DB 드라이버를 활용해 데이터를 가져오면)
Member member1 = jpa.find(memberId)
Member member2 = jpa.find(memberId)
member1 != member2
JPA를 쓰면
Member member1 = jpa.find(memberId) // SQL
Member member2 = jpa.find(memberId) // 캐시
member1 == member
왜?? JPA는 자바의 collection에서 꺼내온 것처럼 동일한 트랙잭션에서 조회한 엔티티는 같음을 보장하기 때문에
JPA의 성능 최적화 기능
-> 1차 캐시와 동일성 보장
-> 트랙잭션을 지원하는 쓰기 지연
알아야할 것
- 객체와 테이블의 적절한 설계와 매핑
- 객체와 테이블을 제대로 설계하고 매핑하는 방법을
- 기본키와 외래키 매핑
- 1:N, N:1, 1:1, N:M 매핑
- JPA의 내부 동작 방식 제대로 이해
- JPA가 어떤 SQL을 만들어내는지
- JPA가 언제 SQL을 실행하는지
JPA와 CRUD
저장: jpa.persist(member)
조회: Member member = jpa.find(Member.class, memberId)
수정: member.setName("변경할 이름")
삭제: jpa.remove(member)
JPA 프로젝트 설정
1. 의존설정
pom.xml에서
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.13.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
</dependencies>
를 추가하고 메이븐 프로젝트 새로고침(인텔리제이의 경우 우측 상단에 아주 조그만 표시가 뜬다)을 한다.
hibernate는 jpa의 의존설정으로, h2databse는 데이터베이스 및 드라이버 의존설정으로 알아두자.
hibernate의 버전은 자신이 사용하는 springboot의 버전과 연동되는 버전으로 하는 것이 좋고, h2databse의 버전도 확인 해서 의존설정 해주는 것이 좋다.
2. JPA 설정
resource디렉토리 안에 META-INF라는 디렉터리를 생성한다. 그리고 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>
를 복붙한다. JPA 표준을 설정하는 것으로 이해하자.
필수속성에는 jdbc.driver 설정을 h2로 하고 h2에서 설정한 user, password, 경로와 Dialect를 설정해준다.
+"JPA는 특정 DB에 종속하지 않는다" 는 장점이 있다.
=> 가능이유: 각각의 DB에는 특정 방언(SQL 표준을 지키지 않는 특정 DB언어의 고유한 기능) 이 있는데 해당 DB에 따라 Dialect를 설정하면 JPA가 각 DB에 해당하는 Dialect를 생성해서 호환의 문제로 부터 자유로울 수 있다.
이 게시물은 '자바 ORM 표준 JPA 프로그래밍' 강의를 수강하고 정리한 내용임을 밝힙니다.
출처: https://www.inflearn.com/course/ORM-JPA-Basic#
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔
www.inflearn.com