스프링을 활용하여 데이터베이스에 접근하는 방법을 알아본다.
H2 데이터베이스는 자바 기반의 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)이다.
가볍고 편리한 기능으로 개발 단계의 테스트 DB로 많이 사용된다.
웹 화면 역시 제공한다.
h2 db 설치
https://www.h2database.com/html/main.html
위 링크를 들어가서 설치한다.
설치가 완료 되면 터미널을 통해 chmod 755 h2.sh 를 통해 권한을 부여한다.
권한 부여 후 ./h2.sh 로 실행한다.
실행을 하고 나면 위와 같은 창이 뜬다. 이 때 url(이미지의 JDBC URL 아님)을 보면 임의의 url로 돼있는데, 맨 앞 부분을 localhost로 해 준다.
JDBC URL은 최초 생성 시 jdbc:h2:~/test로 해 주고 그 이후로는 jdbc:h2:tcp://localhost/~/test를 통해 접근한다.
그리고 나서 ~/test.mv.db 파일이 생성 되었는지 확인한다.
위와 같은 화면을 통해 DB를 다룰 수 있다.
create table member
(
id bigint generated by default as identity,
name varchar(255),
primary key (id)
);
다음과 같이 테이블을 생성한다.
그리고 나서 select * from member를 통해 테이블의 내용을 조회해 보면 다음과 같은 결과가 나온다.
잘 생성되었는지 확인해 보기 위해 insert into member(name) values('spring')을 해 줘서 테이블에 삽입한 후 위에서 테이블 조회 명령어로 결과 확인해 보면 다음과 같다
jdbc란 자바 언어로 다양한 종류의 관계형 데이터베이스에 접속할 수 있도록 하는 자바 API이다.
jdbc는 데이터베이스에서 자료를 쿼리하거나 업데이트 하는 방법을 제공한다.
옛날에는 jdbc api로 직접 코딩을 하였다고 한다. 코드의 양이 굉장히 많고 반복되는 코드가 존재했다.
이런 방식을 JdbcTemplate 이나 MyBatis 와 같은 라이브러리를 통해 기존의 jdbc api의 반복 코드 대부분을 제거해 줘서 좀 더 쉽게 사용할 수 있게 되었다.
그러나 SQL은 직접 작성해야 한다.
환경설정
build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리를 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'
스프링부트 데이터베이스 연결 설정을 추가한다. (resources/applicatoin.properties)
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
리포지토리 생성
다음과 같이 MemberRepository를 implement하는 리포지토리 클래스를 하나 생성하고 JdbcTemplate 변수와 생성자를 생성해 준다.
데이터베이스에서 원하는 형태의 결과값을 반환하기 위해 RowMapper를 사용한다. 순수 jdbc에서 반복하던 코드를 이 방식을 통해 줄일 수 있다. 이렇게 객체를 통해 반환한 결과를 여러 기능에서 사용할 수 있다.
RowMapper를 통해 얻은 결과를 기능에 맞게 적절히 쿼리 문을 작성하여 활용한다.
save 기능의 경우 데이터를 삽입할 테이블과 테이블의 primary key 값만 알면 되기 때문에 두 값을 활용하여 simplejdbcinsert 클래스를 통해 테이블에 insert를 쉽게 하도록 해 주는 것이다.
스프링 config 변경
jdbctemplate을 이용하도록 스프링 설정을 변경해 준다.
기존의 config에 datasource를 추가해 주고 사용할 리포지토리를 변경시켜준것 뿐이다.
Datasource는 데이터베이스 커넥션을 획득할 때 사용하는 객체이다. 스프링부트는 데이터베이스 커넥션을 바탕으로 datasource를 생성하고 빈으로 등록한다. 그래서 DI를 받을 수 있다.
개방 폐쇄 원칙(OCP)
개방 폐쇄 원칙은 확장에는 열려있고 수정, 변경에는 닫혀있어야 한다. 기능을 변경 또는 확장 할 수 있으면서 그 기능을 사용하는 코드는 수정하지 않아야 한다는 의미이다.
스프링의 DI를 통해 기존의 소스 코드를 전혀 수정하지 않고 설정만으로 구현 클래스를 변경할 수 있다.
메모리를 활용했을 때는 스프링 서버를 다시 실행하면 정보들이 다 사라졌었지만 이렇게 DB를 사용하면 데이터들을 유지할 수 있다.
스프링 컨테이너와 DB를 통합하여 테스트를 진행해 보자.
기존의 서비스 테스트 코드를 활용할 것인데, 기존의 객체를 생성해서 넣어줬던 것과 달리 객체들을 컨테이너에서 @AuitoWired 어노테이션을 활용하여 컨테이너에서 받아올 것이다.
이 때 @SpringBootTest 어노테이션은 스프링 컨테이너와 테스트를 동시에 진행하도록 하는 것이다.
기존 테스트 코드의 @BeforeEach나 @AfterEach를 통해 데이터를 클리어 해 줬던 부분을 @Transactional을 통해 테스트 시작 전에 트랜잭션을 시작하고 테스트 종료 후 항상 롤백하도록 해 준다. 이 방식을 사용하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 끼치지 않는다.
@Commit 어노테이션을 이용하여 테스트 시에도 DB에 등록될 수 있도록 해 줄 수 있다.
출처 : 인프런 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
https://www.inflearn.com/course/스프링-입문-스프링부트/lecture/49598?tab=curriculum