Persistence(영속성)
데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성
Object Persistence : 메모리 상의 데이터를 파일 시스템, 관계형 데이터베이스 혹은 객체 데이터베이스 등을 활용하여 영구적으로 저장하여 영속성 부여
JDBC, Spring JDBC, Persistence Framework(Hibernate, Mybatis 등)
ORM(Object Relational Mapping)
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것
DB 데이터 ← 매핑 → Object 필드
Persistant API (JPA, Hibernate 등)
❗ 참고 : https://gmlwjd9405.github.io/2019/02/01/orm.html
JPA(Java Persistence API)
Hibernate : ORM 프레임워크, Open Source SW
JPA : 현재 자바 진영의 ORM 기술 표준으로, 인터페이스의 모음
JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate
JPA의 동작과정
JPA는 애플리케이션과 JDBC 사이에서 동작
JPA 사용이유
SQL 중심적인 개발에서 객체 중심으로 개발
생산성
유지보수
성능 최적화 기능
❗ 참고 : https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html
사용법
Dependency추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
Domain 생성 → Repository 생성 → Service 생성 → Controller 생성
properties 설정
<!--application.yml-->
jpa:
database-platform: kr.co.userinsight.ams.dialect.CustomMariadbDialect
hibernate:
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
open-in-view: true
<!--application-local.yml-->
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
JpaRepository
(JpaRepository에서 엄청 많은 기능을 제공)
인터페이스를 상속 받아서 사용하면 된다.(extends)
public interface ItemRepository extends JpaRepository<Item, Long> {
// 비어있음
}
공통 인터페이스 기능
JpaRepository 인터페이스 : 공통 CRUD 제공
<엔티티, 식별자>로 설정
자주 쓰는 정렬 기능을 위해 Sort 삽입 가능
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByName(String username, Sort sort);
}
추가로 페이징을 위한 기능도 존재
public interface MemberRepository extends JpaRepository<Member, Long> {
Page<Member> findByName(String username, Pageable pageable);
}
@Query 어노테이션을 사용해서 직접 JPQL을 지정 가능
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select m from Member m where m.username = ?1")
Member findByUsername(String username, Pageable pageable);
}
Web 페이징과 정렬 기능
/members?page=0&size=20&sort=name,desc
@RequestMapping(value = "/members", method = RequestMethod.GET)
String list(Pageable pageable, Model mobel) {}
❗ JPA를 적용하면 개발자는 인터페이스만 만들면 된다. 알아서 동적으로 객체를 생성해서 주입해줌 ❗
❗ JPA의 한계가 존재한다! 따라서 Querydsl도 연동해서 같이 사용한다.. 다음엔 Querydsl을 확인해야지 ❗