본문 바로가기

JAVA/Spring Boot

스프링 부트 데이터 액세스

반응형

스프링 부트 데이터 액세스


SQL 데이터베이스


JDBC(Java Database Connectivity) 자바 데이터베이스 연결를 개발자가 일일이 코드 한줄 한줄 신경써서 처리하던 때가 있었다.

알맞는 드라이브러르 내려받고 접속문자열을 매뉴얼에서 찾은 다음 연결을 맺고 끊음, 

SQL문, 결과, 트랜잭션, '결과세트를 객체로 변환'등 잡다한 일련의 과정을 손수 코딩했었다.


그후 캐스터(Castor)XML, 오브젝트 스토어(Object-Store), 하이버네이트(Hibernate)같은 ORM(Object Relational Mapping-객체 관계매핑) 프로엠워크가 잡다한 일을 대행하기 시작했다.

개발자는 그저 도메인 클래스를 작성하고 DB 테이블과 매핑하는 XML파일만 만들면 되었다.

그런데 서서히 이런 프레임워크를 관리하는 일조차 전문가가 아니면 안 될 지경에 이르렀다.


템플릿 디자인 패턴을 잘 살린 스프링 프레임워크는 이런 점에서 큰 도움이 되었다.

메서드 실행 방법을 담은 추상 클래스를 만들고, 개발자가 비즈니스 로직만 전념할 수 있게 DB 부문도 추상화했다.

그 덕에 DB연결(접속, 해제, 풀링), 트랜잭션, 프레임워크와 소통하는 방법 등 버거운 일을 모두 스프링 프레임워크가 대신 처리하는 틀이 마련되었다.


스프링 프레임워크에서 접속할 DB 정보 및 접속하는 방법, 크레덴셜은 몇 몇 인터페이스(예: javax.sql.DataSource)와 클래스에서 가져온다.

트랜잭션 관리를 하려면 DataSource는 필수인데, 이 객체를 생성하려면 DB접속에 필요한 Driver 클래스, JDBC URL, 사용자 이름, 비밀번호가 필요하다.


1.JDBC 템플릿으로 데이터 액세스

스프링 부트를 쓴 프레임워크에서 JDBC 추상화만으로 데이터에 액세스하는 기본적인 내용으로

스타터 폼은 spring-boot-starter-jdbc를 쓰고 DB는 테스트 용도로 적합한 메모리 DB H2를 사용한다.


spring init -d=jdbc, h2 -g=com.apress.spring -a=simple-jdbc-app --package-name=com.apress.spring -name=simple-jdbc-app -x


JdbcTemplate

DB작업을 주관하는 JdbcTemplate 클래스를 자동으로 연결한다.

JdbcTemplate은 템플릿 디자인 패턴에 기반한 클래스로, 개발자는 데이터에만 집중하고 다른 모든 DB 작업(생성, 삭제)은 템플릿에 맡길수 있게한다.


@SpringBootApplication 자동구성으로 H2 DB 의존체가 걸려있는 걸 보고 우선 올바른 javax.sql.DataSource 구현체를 만든다.

드라이버는 org.h2.Driver 클래스를 가져오고 접속URL은 jdbc:h2:mem:testdb, 사용자 이름은 sa, 비밀번호는 없는 상태로 H2엔진에 접속할 환경을 구성한다.


H2엔진은 테이블과 데이터를 전부 살펴볼수 잇는 콘솔을 기본 제공한다.

이 콘솔은 웹 애플리케이션이다. H2 웹 콘솔을 이용하려면 spring-boot-starter-web이 필요하다.

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>


application.properties

spring.h2.console.enabled=true


접속

http://localhost:8080/h2-console




2.JPA로 데이터 액세스

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 컬렉션을 만들 것이다.

몽고디비 내부는 클라이언트 쉘에서 볼수 있다.

데이터베이스, 컬렉션, 데이터를 조회할 수 있다.


>show databases;


>use myjournal


>show collections


>db.journal.find()




반응형

'JAVA > Spring Boot' 카테고리의 다른 글

스프링부트 웹 개발 (샘플)  (0) 2018.04.06
Spring Data JPA  (0) 2018.04.02
스프링 부트 테스트  (0) 2018.02.09
스프링부트에서 스프링  (0) 2018.02.09
스프링과 스프링 부트 비교  (0) 2018.02.08