H2 : 개발이나 테스트 용도, 웹 화면 제공해줌
데이터베이스 파일 생성
~/test
내 홈에 있는 test 파일을 직접 접근(최초 한번)
localhost/~/test
로 하면 톰캣을 통해서 접근(이후부터는 이렇게 접속)
테이블 생성하기
H2 데이터베이스에 접근해서 member 테이블 생성
(설명)
long
, SQL에선 bigint generated by default as identity
,
insert into member(name) values('spring')
id값 자동으로 채워지고, name에 spring이 저장됨
(pk의 값에 대한 생성은 DB가 알아서 채워줌)
select *from member
로 조회 기능
조회시 저장했던 spring 나옴
스프링과 DB를 연결하는 작업
회원을 저장하는 역할은 MemberRepository가 해주지만, 구현은 메모리로 할 것이냐? DB에 연결해서 할 것이냐?
환경설정
(Jbdc 회원 리포지토리 구현 생략)
데이터베이스 접근부
.../service/SpringConfig.java
DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체임.
스프링 부트는 데이터베이스 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어 둔다. 그래서 DI를 받을 수 있음.
MemberService는 MemberRepository를 의존함.
MemberRepository는 구현체로 MemoryMemberRepository와 JdbcMemberRepository가 있음.
그런데 스프링 컨테이너에서 설정을 바꿈.
기존에는 memory버전의 memberRepository에 스프링 빈으로 등록을 했다면, 이제는 memory버전을 제외하고 jdbc버전의 memberRepository를 스프링 빈으로 등록함.
-> 구현체 jdbc버전의 memberRepository로 바껴서 돌아감.
회원 등록전 member에 아무것도 없음.
회원 등록을 통해 회원 3명을 등록해줌.
데이터가 DB에 저장되었기 때문에 스프링 서비를 다시 실행해도 데이터가 안전하게 저장됨.
test도 DB와 연결하여 동작하도록 구현함.
이전까지의 test는 스프링과 관련이 없는 순수 자바로만 이루어진 코드로 test를 진행했음.
하지만 지금은 자바 코드로만 test를 할 수 없음!
그래서 스프링 컨테이너와 DB까지 연결된 통합 테스트를 구현할 것임.
MemberServiceTest를 Ctrl+c Ctrl+v해서 MemberServiceIntegrationTest 생성해줌.스프링 테스트를 할땐 @SpringBoot 어노테이션을 써준다.
@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.
이제 필요없는 부분을 전부 지워줄 것임.
먼저 @BeforeEach 부분을 다 지워줌.
-> @BeforeEach 부분은 직접 객체를 생성해서 넣어줬음. 이제는 스프링 컨테이너한테 MemberRepository를 받아야함.
@Autowired 써줌.
-> 간단한 방법으로 @Autowired 사용함.
MemberMemberRepository가 아닌 MemberRepository로 바꿔줌.
구현체는 스프링이 @Configuration(SpringConfig) 부분에서 올라올 것임.
@AfterEach도 필요없으니 삭제.
afterEach()는 메모리 DB에 있는 데이터가 다음 테스트에 영향을 주지않도록 지워주는 역할임. 하지만 @Transactional을 써주면 필요없어짐.
일단 @Transactional을 써주지않고 회원가입 테스트 진행!(member.setName("한지우1");
)
-> 에러발생 (이미 존재하는 회원입니다.)
이유 : DB에 데이터가 남아있기 때문.
DB의 데이터 다 지워주고 회원가입 테스트 진행(@Transactional 아직 안써줌)
delete from member
처음 한번 테스트 실행했을때는 테스트 잘되고,DB에도 잘 들어감.
그런데 테스트는 반복할 수 있어야함.다시 실행하면 오류뜸.(방금전과 같은 오류)
@Transactional 어노테이션을 달아줌.
DB에서 데이터 다 지우고, 테스트 계속 반복해도 오류 나지 않음.
@Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지않는다.
전체 실행! 오류없음 ㅎ
test는 스프링컨테이너가 없는 순수한 단위 test(MemberServiceTest와 같은)가 훨씬 좋은 test임.
컨테이너 올려서 하는 테스트는 잘못됐을 가능성이 있음.