[SpringBoot] 3. Spring Data
스프링 데이터 (Spring Data) : 다양한 데이터 소스에 접근해 데이터를 활용
- 스프링 데이터는 여러 데이터 스토어를 지원하는 개별 프로젝트를 포함하는 상위 프로젝트
- 여러 데이터 소스의 데이터를 다룰 때 일관성 있는 프로그래밍 모델 제공
- 비즈니스 도메인 객체를 특정 데이터 스토어에 저장 가능
- 관계형 데이터베이스와 스프링 데이터
JPA를 사용해서 비즈니스 객체 관리 가능
- 스프링 템플릿 (
Spring Template) : 특정 데이터베이스의 다양한 연산을 수행 가능한 클래스- 템플릿 클래스에서 저장소별 특화된 자원을 관리하고 예외를 변환할 수 있게 해주는 헬퍼 메서드가 포함
스프링 데이터 모듈 (Spring Data Module)
- 스프링 데이터 커먼즈 : 데이터 스토어의 독립적인 기초 컴포넌트로 구성
- 스프링 데이터
JPA의JpaRepository인터페이스는 스프링 데이터 커먼즈 내PagingAndSortingRepository의CRUD, 페이징, 정렬 기능을 상속
- 스프링 데이터
- 스프링 데이터 서브 모듈 : 특정 데이터베이스에 특화된 기능을 포함
스프링부트 어플리케이션 데이터베이스 연동 설정
요구사항 : 스프링부트에 관계형 데이터베이스를 연동하기 위해선, 어플리케이션에 관련 설정 작업을 해야 한다.
application.properties에 데이터베이스 연결 정보를 작성할 수 있음
요구사항 : 어플리케이션을 시작할 때, 데이터베이스 내 스키마를 적절히 초기화해야 한다.
src/main/resources/폴더의.sql파일을 통해 스키마 정의 및 스크립트 실행이 가능
CrudRepository, PagingAndSortingRepository 인터페이스 이해
Repository: 비즈니스 도메인 클래스와 그 식별자로 데이터 소스 접근을 추상화하는 인터페이스- 객체의 런타임 타입 정보만을 알려주는 마커 (
marker) 인터페이스
- 객체의 런타임 타입 정보만을 알려주는 마커 (
CrudRepository:Repository를 상속받아CRUD연산을 포함하는 하위 인터페이스
PagingAndSortingRepository: 페이징 (pagination)과 정렬 (sort) 기능을 포함
요구사항 : 스프링 데이터
JPA를 사용해 도메인 객체를 관계형 데이터베이스에 저장하고 관리한다.
- 엔티티에
@Id,@Column,GeneratedValue어노테이션 추가@Transactional: 메소드 실행 중 발생하는 데이터 작업을 하나의 트랙잭션으로 처리
- 엔티티를 관리하기 위한 레포지토리 인터페이스 작성
쿼리 메소드, @NamedQuery를 통한 스프링 데이터를 사용한 데이터 조회
- 쿼리 메소드 : 리포지토리 인터페이스에 정의하는 메소드 이름을 패턴에 맞춰 작성하면 이름을 파싱해 쿼리 생성
@NamedQuery: 직접 쿼리문을 지정해 데이터를 조회 (2개 이상의 테이블을 조인해 데이터를 조회)@@Modifying:@Query에 정의된 쿼리가 조회가 아닌 수정 작업을 수행한다는 것을 명시
타입 검사, 쿼리 정적 검사를 위한 Criteria API 사용
Criteria API: 쿼리를 단순 문자열이 아닌 프로그램 코드로 작성해 타입 안정성 보장 가능
스프링 데이터 JPA와 QueryDSL
QueryDSL:Criteria API처럼 타입 안정성을 보장하고, 평문형API로 코드 작성량 을 줄임- 쿼리에 포함된 엔티티 타입이 실제로 존재하고, 해당 엔티티를 데이터베이스에 저장 가능
- 쿼리에 포함된 모든 프로퍼티가 엔티티에 실제로 조직하고, 해당 프로퍼티를 데이터베이스에 저장 가능
- 모든
SQL연산자에는 적합한 타입이 사용되며, 최종 쿼리가 문법적으로 올바름
querydsl-apt: 소스 파일의 어노테이션을 컴파일 단계 이전에 먼저 처리하는 어노테이션 처리 도구- 어플리케이션에 포함된 엔티티 클래스를 바탕으로
Q-타입 클래스 생성
- 어플리케이션에 포함된 엔티티 클래스를 바탕으로
querydsl-jpa:JPA를 사용하는 어플리케이션에서QueryDSL을 사용할 수 있게 함apt-maven-gradle: 메이븐의 프로세스 골에서Q-타입 클래스가 생성되는 것을 보장outputDirectory프로퍼티로Q-타입 클래스 파일이 저장될 위치 지정