H2 설치
개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공
drop table if exists member CASCADE;
create table member
(
id bigint generated by default as identity,
name varchar(255),
primary key (id)
);
SpringConfig.java
@Configuration
public class SpringConfig {
private DataSource dataSource;
@Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource=dataSource;
}
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
// return new MemoryMemberRepository();
return new JdbcMemberRepository(dataSource);
}
}
- 개방-폐쇄 원칙(OCP, Open-Closed Principle)
확장에는 열려있고, 수정, 변경에는 닫혀있다.- 스프링의 DI (Dependencies Injection)을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경 가능
조립하는 코드만 변경하면 실제 애플리케이션에 관련된 코드들은 변경하지 않아도 됨
- 데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장됨
package hello.hellospring.service;
...
@SpringBootTest //스프링이 테스트할때 사용
@Transactional //테스트 실행 전 트랜잭션을 걸고 DB에 쿼리를 다 날림(롤백됨) -> 한번의 테스트 끝나고 DB를 비울 필요 없음 -> 반복해서 실행 가능
class MemberServiceIntegrationTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
...
@SpringBootTest
스프링 컨테이너와 테스트를 함께 실행@Transactional
테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백함 > DB에 반영이 X단위 테스트
순수하게 자바 코드로 하면서 최소한의 단위로 하는것통합 테스트
스프링 컨테이너, 디비까지 연동 하는것스프링 데이터 JPA 제공 기능
- 인터페이스를 통한 기본적인 CRUD
- findByName() , findByEmail() 처럼 메서드 이름 만으로 조회 기능 제공
- 페이징 기능 자동 제공