- H2.bat 파일 실행 초기화면
*연결이 안된다면
1. C:\Users\OMG(계정명) 하위에 텍스트 파일 생성
2. 텍스트 파일을 열고(내용x) 다른 이름으로 저장
3. 파일 이름을 test2.mv.db, 파일형식을 모든 파일로 설정
4. h2.bat 파일을 실행 후 아래와 같이 JDBC URL입력
- 연결 후 테이블 생성
create table member
(
id bigint generated by default as identity,
//id 값을 세팅하지 않으면DB가 자동으로 id 값을 채워줌
name varchar(255),
primary key (id)
);
- insert 후 결과 확인
JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API
- build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가
- 스프링 부트 데이터베이스 연결 설정 추가
- JdbcMemberRepository 생성
JdbcMemberRepository
- SpringConfig 수정
SpringConfig
private DataSource dataSource;
@Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
스프링 부트가 appication.properties 설정해논 파일을 보고 데이터베이스와 연결할 수 있는 dataSource를 만들어줌
스프링 컨테이너와 DB까지 연결한 통합 테스트
MemberServiceIntegrationTest
- test->service->MemberServiceIntegrationTest 생성
- @SpringBootTest ,@Transactional 어노테이션 달기
@Transactional
테스트는 반복할 수 있어야한다.
데이터베이스는 기본적으로 트랜잭션 개념이 있는데 DB에 데이터를 insert하고 commit을 해줘야 DB에 반영이 된다.
트랜잭션 실행 -> DB에 데이터 insert -> 테스트 -> rollback
기존처럼 지우는 코드를 넣지 않아도 다음 테스트를 반복해서 실행할 수 있음
*트랜잭션(Transaction)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.
- 순수 Jdbc와 동일한 환경설정
- JdbcMemberRepository 생성
JdbcMemberRepository
- SpringConfig 수정
SpringConfig
JPA(Java Persistence API)
ORM 맵핑을 어떻게 하느냐?
멤버클래스 위에 @Entity 추가 -> JPA가 관리하는 엔티티가 됨
DB에 값을 넣으면 DB가 ID를 자동생성해주는 것을 아이덴티티라고 함
Member
뭔말인지 제대로 이해가 안감@GeneratedValue(strategy = GenerationType.IDENTITY)
@어노테이션을 사용함으로써 DB랑 맵핑을 함(Insert,delete,select문 만들기가 가능해짐!)
- JpaMemberRepository 생성
JPA는 EntityManager로 모든 게 동작하는데 data-jpa라이브러리를 설정해놈으로써 스프링부트가 자동으로 EntityManager를 생성해주는데 우리는 그것을 인젝션 받으면 됨
간단하게 JPA 쓰려면 EntityManager를 주입 받아야함
JpaMemberRepository
*JPA를 쓸 때 항상 @Transactional이 있어야함
- MemberServiceIntegrationTest 통합 테스트 실행
-> DB에 spring값이 잘 들어감
스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술
리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있음
SpringDataJpaMemberRepository 인터페이스 생성(구현체는 따로 X)
원리
- 스프링 데이터 JPA가 SpringDataJpaMemberRepository 를 스프링 빈으로 자동
- springdata가 만들어논 스프링빈에 등록된 구현체를 인젝션해서 받음
- JpaRepository는 findById, findAll, save 같은 기본 CRUD, 메소드들을 제공해줌(공통된 것들은 존재)
*name 같은 것들은 비즈니스가 다 다르기 때문에 불가능
ex) 주문 할 때 주문번호로 조회한다던가 상품이름으로 조회한다던가.- findByName해줌
-> JPQL select m from Member m where m.name = ? (SQL로 번역돼서 실행됨)
- 스프링 데이터 JPA 제공 클래스
간단정리