6. 스프링 DB 접근 기술
이때까진 메모리에 그냥 저장함, DB로 하는 방법 고고
#
H2 데이터베이스 설치- 교육용으로 좋음, 인메모리용
- 설치 링크
- All Platforms 로 설치
- terminal로 압축해제된 곳에
./bin
경로로 들어감 - 아래를 실행시 h2 브라우저 도구가 열림
- 임의의 ip로 브라우저 도구가 열리게 되는데 ip 부분을 제거하고
localhost
로 domain 부분을 변경 - 최초로 db 파일을 만들 땐
jdbc:h2:~/test
설정 유지 후 연결 ~/test.mv.db
파일 생성됨을 확인- 이후론
jdbc:h2:tcp://localhost/~/test
로 연결- 소켓 커넥션이 동시성 제어에 적합
- 접속 후 브라우저 클라이언트에서
member
table 생성
- row 하나 insert
#
intelliJ 에서 h2 연결하기- h2.sh 로 먼저 실행시켜 놔야함
- intelliJ에 DB 기능이 있다면 연결해서 사용 가능
- database 연결 설정시 h2로 시작
- 위에서 생성했을 때 지정해놓은 계정을 기억해둠 (default: id/sa, pw/없음)
- URL 값으로
jdbc:h2:tcp://localhost/~/test
를 입력
#
순수 JDBC고대의 20년 전 방식
아래 jdbc + h2 커넥션을 위한 패키지 추가
build.gradle
에 다음 코드 추가
application.properties
에 db 설정 추가
JdbcMemberRepository 를 추가하면서 알아두면 좋은 것
#
OCP, 개방-폐쇄의 원칙스프링에서는 DI를 지원해서 기존 코드를 고치지 않고, 설정 코드만으로 수정 가능
- 위와 같이 개발을 진행하면
OCP
를 지키는 것임 - SOLID 중,
개방-폐쇄 원칙
(OCP, Open-Closed Principle)- 확장에는 열려있고, 수정, 변경에는 닫혀있다.
- OOP (interface 와 같은 것) 을 잘 이용하면
- 기존 코드를 수정하지 않고 개발 가능
- 조립하는 코드를 변경하긴 해야함
#
스프링 통합 테스트DB 까지 연결되서 스프링에서 진행되는 통합 테스트
@SpringBootTest
- 스프링 통합 테스트로, 스프링도 같이 띄어서 테스트해야할 시 해당 어노테이션을 사용
- 스프링 컨테이너 + 테스트를 실행
@Transactional
- 테스트는 반복할 수 있어야 함
- 테스트에 해당 노테이션이 붙을 경우, 실행 이후 쿼리들을 롤백해줌
- 단위 테스트, 통합 테스트?
- 순수한
단위 테스트
가 좋은 테스트일 확률이 높음
- 순수한
#
스프링 jdbcTemplate- 스프링 JdbcTemplate 과 MyBatis 같은 라이브러리는 JDBC API 의 반복적인 부분을 제거해줌
- 대신 SQL 은 직접 작성
- 왜 template 인가?
- Template Method Pattern을 사용했기 때문
- 템플릿 메소드 패턴 정리된 좋은 블로그 글
#
JPA- SQL 쿼리까지 자동으로 처리해줌
- 객체 중심의 설계로 패러다임 전화할 수 있음
- 개발 생산성이 크게 증대
appplication.properties
에 추가되는 것들#
spring.jpa.show-sql=true
: 쿼리 날릴때 sql 문 볼래여spring.jpa.hibernate.ddl-auto=none
: JPA를 통한 테이블 생성기능은 사용하지 않겠다.- 이미 만들어져 있으므로
#
JPA 특징JPA interface 에 hibernate 구현체를 사용한다고 보면 됨
- JPA는 ORM 기술에 대한 Java 버전 API 명세
- Java Persistent API
- Object Relation Mapping
- JPA를 쓸려면
EntityManager
를 주입 받아야 함EntityManager
는spring-boot-starter-data-jpa
패키지를 받게 되면 스프링 컨테이너에 자동으로 추가되게 됨
- 단점
- id 로 찾는 경우에는 쿼리(?) 를 작성안해도 되지만,
- id 외, 다른 필드로 crud 할 경우,
jpql
을 작성해야 됨
#
주의사항@Transactional
으로 감싸줘야함- CUD 는 트랜잭션으로 감싸줘야 함
#
스프링 데이터 JPAJPA의
jpql
작성을 해야하는 단점을 제거
repository에 구현체 없이 DB CRUD 가 가능하도록 제공
RDB를 사용한다면 필수라고 하심
JPA를 먼저 공부한 후, 스프링 데이터 JPA 를 공부할 것을 권장
#
스프링 데이터 JPA 기능인터페이스를 통한 기본적인 CRUD 를 개발하지 않고 자동으로 제공해줌
id를 제외한 다른 필드는
findByName
findByUserEmail
과 같이 정의해놓으면 자동으로 구현해줌페이징 기능 자동 제공
스프링 데이터 JPA를 기본적으로 사용하되, 복잡한 동적 쿼리는 querydsl 라이브러리를 사용하여 직접 구현 할 수 있음 mybatis, jdbctemplate 과 같이 쿼리를 직접짜는 라이브러리와 같이 사용할 수도 있음