Spring Data는 높은 수준의 Spring Source 프로젝트입니다. 그 목적은 관계형 데이터베이스 시스템과 NoSQL 데이터 저장소 모두에서 다양한 종류의 지속성 저장소를 통합하고 쉽게 액세스하는 것입니다.
새로운 애플리케이션을 구현할 때는 기술적 복잡성과 상용 코드 대신 비즈니스 논리에 초점을 맞춰야 합니다. 이것이 자바 퍼시스턴트 API(JPA) 사양과 스프링 데이터 JPA가 매우 인기 있는 이유입니다.
Spring Data JPA는 JPA 상단에 레이어를 추가합니다. 즉, Spring Data JPA는 JPA 사양에 의해 정의된 모든 기능, 특히 엔티티, 연결 매핑 및 JPA의 쿼리 기능을 사용합니다. Spring Data JPA는 저장소 패턴의 코드 없음 구현 및 메서드 이름에서 데이터베이스 쿼리 생성과 같은 자체 기능을 추가합니다.
스프링 데이터 JPA
Spring Data JPA는 JDBC 기반 데이터베이스 액세스 및 ORM(Object Relational Mapping)의 복잡성을 대부분 처리합니다. JPA에서 요구하는 보일러 플레이트 코드를 줄여줍니다. 이를 통해 지속성 계층을 더 쉽고 빠르게 구현할 수 있습니다.
Spring Data JPA는 필요한 만큼 노력을 줄임으로써 데이터 액세스 계층의 구현을 개선하는 것을 목표로 합니다.
Spring Data JPA의 특징
Spring Data JPA의 주요 기능은 다음과 같습니다.
코드 리포지토리가 없습니다. 이것은 지속성과 관련된 가장 인기 있는 패턴입니다. 이를 통해 비즈니스 코드를 보다 높은 추상화 수준에서 구현할 수 있습니다.
보일러 플레이트 코드가 감소합니다. 리포지토리 인터페이스별로 각 메서드에 대한 기본 구현을 제공합니다. 즉, 더 이상 읽기 및 쓰기 작업을 구현할 필요가 없습니다.
생성된 쿼리: Spring Data JPA의 또 다른 기능은 메서드 이름을 기반으로 데이터베이스 쿼리를 생성하는 것입니다. 쿼리가 너무 복잡하지 않은 경우 저장소 인터페이스에 findBy로 시작하는 이름으로 메서드를 정의해야 합니다. 메서드를 정의한 후 Spring은 메서드 이름을 구문 분석하고 메서드에 대한 쿼리를 만듭니다. 예를 들어 다음과 같습니다.
public interface EmployeeRepository extends CrudRepository < Employee, Long > {
Employee findByName(String name);
}
위의 예에서는 Employee와 Long의 두 가지 제네릭을 사용하는 Crud Repository를 확장했습니다. Employee는 관리할 엔티티이고 Long은 기본 키의 데이터 유형입니다.
Spring은 내부적으로 메서드 이름을 기반으로 JPQL(Java Persistence Query Language) 쿼리를 생성합니다. 쿼리는 메서드 서명에서 파생됩니다. 바인딩 매개 변수 값을 설정하고 쿼리를 실행한 다음 결과를 반환합니다.
다른 기능은 다음과 같습니다.
- 사용자 정의 리포지토리 코드를 통합할 수 있습니다.
- 강력한 저장소이자 사용자 지정 개체 매핑 추상화입니다.
- 투명한 감사를 지원합니다.
- 기본 속성을 제공하는 도메인 기본 클래스를 구현합니다.
- Spring Data JPA, Spring Data MongoDB, Spring Data REST, Spring Data Cassandra 등 여러 모듈을 지원합니다.
Spring 데이터 저장소
Spring Data JPA는 다음과 같은 세 가지 저장소를 제공합니다.
CrudRepository: 표준 생성, 읽기, 업데이트 및 삭제를 제공합니다. findOne(), findAll(), save(), delete() 등의 메서드가 포함되어 있습니다.
페이징 및 정렬 리포지토리: CrudRepository를 확장하고 findAll 메서드를 추가합니다. 페이지화된 방식으로 데이터를 정렬하고 검색할 수 있습니다.
JpaRepository: JPA 전용 저장소이며 Spring Data Jpa에 정의되어 있습니다. CrudRepository와 PagingAndSortingRepository를 모두 확장합니다. 또한 flush()와 같은 JPA별 메서드를 추가하여 지속성 컨텍스트에서 플러시를 트리거합니다.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
스프링 부트 스타터 데이터 JPA
Spring Boot은 Spring 애플리케이션을 관계형 데이터베이스와 효율적으로 연결하기 위한 Spring-boot-starter-data-jpa 의존성을 제공합니다. spring-boot-starter-data-jpa는 내부적으로 spring-boot-jpa 종속성을 사용합니다(Spring-boot 버전 1.5.3 이후).
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
데이터베이스는 테이블/관계로 설계되었습니다. 이전의 접근 방식(JDBC)에는 SQL 쿼리 작성 작업이 포함되었습니다. JPA에서는 객체의 데이터를 테이블에 저장하고 그 반대의 경우도 저장합니다. 하지만, JPA는 다른 사고 과정의 결과로 발전했습니다.
JPA 이전에는 ORM이라는 용어가 이러한 프레임워크를 지칭하는 데 더 일반적으로 사용되었습니다. 이것이 Hibernate가 ORM 프레임워크라고 불리는 이유입니다.
JPA를 사용하면 응용 프로그램 클래스를 데이터베이스의 테이블에 매핑할 수 있습니다.
Entity Manager : 매핑을 정의하면 데이터베이스와의 모든 상호 작용을 처리합니다.
JPQL(Java 지속성 쿼리 언어): 엔티티에 대한 검색을 실행하기 위한 쿼리를 작성하는 방법을 제공합니다. SQL 쿼리와 다릅니다. JPQL 쿼리는 엔티티 간에 정의된 매핑을 이미 이해하고 있습니다. 필요한 경우 추가 조건을 추가할 수 있습니다.
Criteria API: 데이터베이스에 대한 검색을 실행하기 위한 Java 기반 API를 정의합니다.
Hibernate vs JPA
하이버네이트는 JPA의 구현입니다. 이것은 가장 인기 있는 ORM 프레임워크이며, JPA는 사양을 정의하는 API입니다. 하이버네이트는 개체와 테이블 사이에 추가하는 매핑을 이해합니다. 매핑을 기반으로 데이터베이스에서 데이터를 검색/저장합니다. 또한 JPA 상단에 추가 기능을 제공합니다.
스프링 부트 JPA 예
이 예에서는 spring-boot-starter-data-jpa 종속성을 사용하여 H2 데이터베이스와의 연결을 만들 것입니다.
1단계: 스프링 Initializr https://start.spring.io/을 엽니다.
2단계: 그룹 이름을 입력합니다.
3단계: 아티팩트 ID를 제공합니다. spring-boot-jpa-example을 제공했습니다.
4단계: 종속성(Spring Web, Spring Data JPA 및 H2 Database)을 추가합니다.
5단계: Generate 버튼을 클릭합니다. Generate 버튼을 클릭하면 프로젝트를 Jar 파일로 감싸고 로컬 시스템에 다운로드합니다.
6단계: Jar 파일을 추출하여 STS 작업 공간에 붙여넣습니다.
7단계: 프로젝트 폴더를 STS로 가져옵니다.
파일 -> 가져오기 -> 기존 메이븐 프로젝트 -> 찾아보기 -> spring-boot-jpa-example -> finish 폴더를 선택합니다.
8단계: src/main/java 폴더에 com.xxx.controller라는 이름의 패키지를 만듭니다.
9단계: com.xxx.controller 패키지에 ControllerDemo라는 이름으로 Controller 클래스를 생성합니다.
package com.xxx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ControllerDemo {
@RequestMapping("/")
public String home() {
return "home.jsp";
}
}
10단계: src/main/java 폴더에 com.xxx.model이라는 이름의 다른 패키지를 만듭니다.
11단계: com.xxx.model 패키지에 User라는 이름의 클래스를 만듭니다.
package com.xxx.model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "userdata")
public class User {
@Id
private int id;
private String username;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUname() {
return username;
}
public void setUname(String username) {
this.username = username;
}
@Override
public String toString() {
return "User [id=" + id + ", uname=" + username + "]";
}
}
이제 H2 데이터베이스를 구성해야 합니다.
12단계: application.properties 파일을 열고 포트, H2 콘솔 사용, 데이터 소스 및 URL을 구성합니다.
server.port=8085
spring.h2.console.enabled=true
spring.datasource.plateform=h2
spring.datasource.url=jdbc:h2:mem:xxx
13단계: src/main/resources 폴더에 SQL 파일을 만듭니다.
src/main/resources -> New -> File -> Provider the File name -> Finish 폴더를 마우스 오른쪽 버튼으로 클릭합니다.
파일 이름 data.sql을 제공했고 그 안에 다음 데이터를 삽입합니다.
insert into userdata values(101, 'Tom');
insert into userdata values(102, 'Andrew');
insert into userdata values(103, 'Tony');
insert into userdata values(104, 'Bob');
insert into userdata values(105, 'Sam');
14단계: src 폴더에 webapp이라는 이름의 폴더를 만듭니다.
15단계: 컨트롤러 데모에서 반환한 이름으로 JSP 파일을 만듭니다. 컨트롤러 Demo.java에서 home.jsp로 돌아왔습니다.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="addUser">
ID :<br />
<input type="text" name="t1"><br />
User name :<br />
<input type="text" name="t2"><br />
<input type="submit" value="Add">
</form>
</body>
</html>
16단계: SpringBootJpaExampleApplication.java 파일을 실행합니다. 콘솔에서 우리의 애플리케이션이 포트 8085에서 성공적으로 실행되고 있음을 알 수 있습니다.
17단계: 브라우저를 열고 URL http://localhost:8085/h2-console/을 호출합니다. 여기에는 드라이버 클래스, application.properties 파일에서 구성한 JDBC URL 및 기본 사용자 이름 sa가 표시됩니다.
연결 테스트 버튼을 클릭하여 연결을 테스트할 수도 있습니다. 연결에 성공하면 테스트 성공 메시지가 표시됩니다.
18단계: Connect(연결) 버튼을 클릭합니다. User.java에서 정의한 테이블 사용자 데이터의 구조를 보여줍니다.
19단계: 다음 쿼리를 실행하여 data.sql 파일에 삽입한 데이터를 확인합니다.
SELECT * FROM USERDATA;
'SW > Spring Boot' 카테고리의 다른 글
Spring Boot : Spring Boot Starter Test 개념, 예제, 설명 (0) | 2023.03.17 |
---|---|
Spring Boot : Spring Boot Starter Actuator 개념, 예제, 설명 (0) | 2023.03.16 |
Spring Boot : 스프링 부트 스타터 웹 개념, 예제, 설명 (0) | 2023.03.14 |
Spring Boot : 스프링 부트 Starter Parent 설명, 예제, 방법 (0) | 2023.03.13 |
Spring Boot : 스프링 부트 Starters 개념, 설명, 예제, 방법 (0) | 2023.03.12 |