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로 연결- 소켓 커넥션이 동시성 제어에 적합
 
 - 접속 후 브라우저 클라이언트에서 
membertable 생성 
- 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 는 트랜잭션으로 감싸줘야 함
 
스프링 데이터 JPA#
JPA의
jpql작성을 해야하는 단점을 제거
repository에 구현체 없이 DB CRUD 가 가능하도록 제공
RDB를 사용한다면 필수라고 하심
JPA를 먼저 공부한 후, 스프링 데이터 JPA 를 공부할 것을 권장
스프링 데이터 JPA 기능#
인터페이스를 통한 기본적인 CRUD 를 개발하지 않고 자동으로 제공해줌
id를 제외한 다른 필드는
findByNamefindByUserEmail과 같이 정의해놓으면 자동으로 구현해줌페이징 기능 자동 제공
스프링 데이터 JPA를 기본적으로 사용하되, 복잡한 동적 쿼리는 querydsl 라이브러리를 사용하여 직접 구현 할 수 있음 mybatis, jdbctemplate 과 같이 쿼리를 직접짜는 라이브러리와 같이 사용할 수도 있음