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을 확인해야지 ❗
'Web > Spring' 카테고리의 다른 글
[Util] ControllerNameInterceptor (0) | 2021.07.30 |
---|---|
[배경] Querydsl (0) | 2021.07.28 |
[배경] Maven (0) | 2021.07.27 |
[배경] Template Engine (0) | 2021.07.27 |
[배경] Spring Security (0) | 2021.07.27 |