JPA는 가벼운 퍼시스턴스 객체를 이용하는 방식으로, 하이버네이트와 이클립스 톱링크(Eclipse TopLink)같은 구현체가 유명하다.
처음부터 JPA를 도입한 스프링 프레임워크는 여러 유틸리티와 추상화 클래스를 제공하여 개발자에게 짐을 덜어주는 역할을 담당했다.
spring init -d=data-jpa,h2 -g=com.apress.spring -a=simple-jpa-app --package-name=com.apress.spring -name=simple-jpa-app -x
javax.persistence 패키지에 들어있는 @Entity, @Id, @Transient 등 JPA 명세에 속한 애노테이션으로, 엔티티를 선언하고 그 엔티티를 DB 테이블(Journal) 및 필드(@Transient를 붙인 필드는 제외하고 게터와 세터를 정의한 모든 프라이빗 필드)와 연결한다.
Long 타입의 id프로퍼티는 @Id 및 @GeneratedValue를 붙여 Journal테이블의 PK 필드임을 명시한다.
JpaRepository는 spring-data-jpa 소속 인터페이스고, DB에서 실행 가능한 액션 메서드를 모두 구비한다.
중요한건 개발자가 이 메서드를 다 구현할 필요 없이 원하는 만큼 확장해서 쓰면 된다.
JpaRepository 자체도 PagingAndSortingRepository라는 상위 인터페이스를 확장하는 구조라서 필요시 추가 기능을 바로 쓸수 있다.
이들 메서드를 다이나믹 프락시 dynamic proxy로 구현하는 일은 스프링 프레임워크와 spring-data 기술의 몫이다.
반복적인 일반 액션은 개발자가 직접 구현하지 말고 spring-data가 대신 처리하게 맡긴다.
생성, 수정, 삭제 같은 일상적인 DB 작업을 코드 한 줄 추가하지 않고도 다를 수 있다.
데이터를 검색시에는 프로퍼티 명명 규칙에 따라 JpaRepository를 확장한 클래스에서 '쿼리'메서드를 만들어 사용하면 된다.
예)
public List<Journal> findByTitleContaining(String word);
-> select * from JOURNAL where title like '%스프링%'
public List<Journal> findByCreatedAfter(Date date);
-> select * from JOURNAL where created > 1
임의의 쿼리를 사용하고 싶을 경우
@Query("select j from journal j where j.title like %1%")
List<Journal> findbyCustomQuery(String word);
@Query는 JPQL을 구문을 받는 어노테이션이다.
(클래스패스 루트에 있는) schema.sql과 data.sql 두 파일로 DB 스키마를 생성하고 데이터를 밀어 넣을 수 있는 것도 스프링 부트 spring-data만의 특징이다.
미리 준비한 데이터 덤프 파일로 DB를 초기화할 때 아주 편리한 기능이다.
기존 서비스에서 insertData 부분을 들어내고 Insert 쿼리문을 data.sql 파일에 넣어두면된다.
applicatoin.properties
spring.jpa.show-sql=true
추가하면 JPA/하이버네이트 엔진이 실제로 실행하고 있는 SQL문을 볼 수 있다.
NoSQL 데이터베이스
기존 관계형 DB의 테이블 저장방식과 다르다.
컬럼: 카산드라, HBase 등
문서: 카우치디비, 몽고디비 등
키-값: 레디스, 리악 등
그래프: Neo4J, 버투소 등
다중모델: 오리엔트디비, 아랑고디비 등
여러가지 DB를 사용할 수 있는데, 요즘 추세는 확장성이 우수하고 수백만 개에 달하는 레코드를 쉽게 처리 가능한지 여부가 중요한 판단 기준이 된다.
spring init -d=data-mongodb,h2 -g=com.apress.spring -a=simple-mongo-app --package-name=com.apress.spring -name=simple-mongo-app -x
spring-data의 하위 프로젝트인 spring-data-mongodb 라이브러리르 쓰고 있어서 몽고디비에서 자주 쓰는 액션이 정의된 MongoRepository 인터페이스를 확장할 수 있다.
이 인터페이스는 id가 포함된 Document 객체(Journal 클래스)와 String 객체를 받는다.
Spring-data와 Spring-data-mongodb의 추상화 코드를 가져오기 때문에 '쿼리'메서드를 만들 수 있다.
db.journal.find({"title": /.*?*/})로 자동변환된다.
mongo 클라이언트 쉘에서 스프링 부트가 문서 컬렉션을 생성하는 testdb에 직접 접속할 수 있다.
이 문서 컬렉션이 바로 자바 클래스 Journal이다.
전체 데이터는 db.journal.find()로 쿼리한다.
기본 DB명을 다른 이름으로 바꾸려면 application.properties에 추가한다
spring.data.mongodb.database=myjournal
MongoRepository가 myjournal이라는 DB를 생성하고 여기에 jouranl 컬렉션을 만들 것이다.