개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공
https://www.h2database.com/html/download-archive.html
drop table if exists member CASCADE;
create table member
(
id bigint generated by default as identity,
name varchar(255),
primary key (id)
);
값 넣기
insert into member(name) values('spring')
insert into member(name) values('spring2')
값 조회하기
SELECT * FROM MEMBER
20년전 개발자
고대의 방식
이런게 있다는 것을 알필요가 있지 배울 필요는 X
build.gradle
plugins {
id 'org.springframework.boot' version '2.7.2'
id 'io.spring.dependency-management' version '1.0.12.RELEASE'
id 'java'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
application.property
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
코드에 대해서 그냥 듣기만 할 것 -> 현재는 사용이 되지 않고 있다.
다음과 같이 memberService에서 레퍼지토리를 다양하게 바꿀수 있다.-> 나중에는 JPA로 바꾸자
@Transactional
이걸 이용하면 여러번 테스트가 가능하다.
DB 연결 테스트를 하는 법에 대해서 잘 설명을 해주셨다.
이것이 가능하도록 할 것
@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.
@Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고,
테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지
않는다
스프링이 JDBC를 중복을 없앤
순수 JDBC와 동일한 환경ㅅ겅절ㅇ을 하면된다.
스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서ㅓ 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야 한다.
생성자 하나일 경우 @AutoWired 생략 가능
이랬던 코드가
이렇게 짧게 변한다.
이거는 현재 잘 쓰이고 있다.
혁신적인 방법 SQL을 DB 삭제 쿼리 같은 것을 해주는
jpa는 인터페이스 중 hibernate
ORM 관계형 데이터베이스 매핑을 한다.
간단하다. createQuery를 통해 SQL문을 사용한다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;
public class JpaMemberRepository implements MemberRepository {
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
@Override
public Member save(Member member) {
em.persist(member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
@Override
public Optional<Member> findByName(String name) {
List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
}
JPA를 활용한 스프링에서 하는 JPA를 편리하게 사용할 수 있도록 감싸준것
스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다. 여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링데이터 JPA가 모두 제공합니다.
지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다.
실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수 입니다.
| 주의 : 스프링데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술입니다. 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 합니다.
스프링 데이터 JPA 제공 기능
| 참고 : 시;ㄹ무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리는 Querydsl이라는 라이브러리를 사용하면 도니다. Querydsl을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적 쿼리도 편리하게 작성할 수 있습니다. 이 조합으로 해결하기 어려운 쿼리는 JPA가 제공하는 네이티브 쿼리를 사용하거나, 앞서 학습한 스프링 JdbcTemplate를 사용하면 된다.