์์ JDBC
ํ๊ฒฝ ์ค์
build.gradle
ํ์ผ์ jdbc, h2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'
์คํ๋ง ๋ถํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค์ ์ถ๊ฐresource/application.properties
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
jdbc ๊ด๋ จ ์ฝ๋ ์๋ต.. (์ ์ ๊ฑด๊ฐ์ ์ํด ๋์ด๊ฐ๋ค)
์คํ๋ง ํตํฉ ํ ์คํธ ๋ง๋ค๊ธฐ
ํ์ ์๋น์ค ์คํ๋ง ํตํฉ ํ ์คํธ
package iseunghan.iseunghanspring.service;
import iseunghan.iseunghanspring.domain.Member;
import iseunghan.iseunghanspring.repository.MemberRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
@SpringBootTest
@Transactional //transaction rollBack์ ํ๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ์ ์๋จ๋๋ค.
class MemberServiceIntegrationTest {
@Autowired MemberRepository memberRepository;
@Autowired MemberService memberService;
@Test //test ๋ฉ์๋ ์ด๋ฆ์ ๊ณผ๊ฐํ๊ฒ ํ๊ธ๋ก ์ ์ด๋ ๋๋ค.
void ํ์๊ฐ์
() {
//given
Member member = new Member();
member.setName("spring100");
//when
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
public void ์ค๋ณต_ํ์(){
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
//๊ธฐ๋ณธ ์ ๊ณตํ๋ ๋ฉ์๋
IllegalStateException e = assertThrows(IllegalStateException.class, () -> {
memberService.join(member2);
});
assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
/*
try {
memberService.join(member2);
fail("์์ธ๊ฐ ๋ฐ์ํด์ผ ํฉ๋๋ค.");
}catch (IllegalStateException e){
assertThat(e.getMessage()).isEqualTo("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");
}
*/
//then
}
@Test
void findMember() {
}
@Test
void findOne() {
}
}
์ฌ์ค์ ์ด์ ์ ํ๋ ํ ์คํธ๋ค์ ์์ํ java์ฝ๋๋ค๋ก๋ง ํ ์คํธํ๊ฒ์ด๋ผ JVM์์์ ๋๋ฌ๋๋ฐ,
@SpringBootTest
, @Transactional
์ ๋
ธํ
์ด์
์ด ๋ถ์ผ๋ฉด ์ค์ ์คํ๋ง์ ๋์์ ํ
์คํธ๋ฅผ ์์์ ํ ์ ์๋ค.
transactional ์ ๋ ธํ ์ด์ ์ ๊ฐ ํ ์คํธ๊ฐ ๋๋๋ฉด ๋กค๋ฐฑ ์์ผ์ db์ ๋ฐ์ดํฐ๋ค์ ์ด๊ธฐํ๋ฅผ ์์ผ์ค๋ค.
๊ทธ๋์ ์ด์ ์ ์์ฑํ ์ฝ๋์ค์
@AfterEach
public void afterEach(){
memberRepository.clearStore();
}
์ด ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ง ์์๋ , ์ ๋ ธํ ์ด์ ํ์ค๋ง ์์ผ๋ฉด ๊ฐ๋จํ๊ฒ ์ฌ์ฉ ํ ์ ์๋ค.
@SpringBootTest
: ์คํ๋ง ์ปจํ
์ด๋์ ํ
์คํธ๋ฅผ ํจ๊ป ์คํํ๋ค.@Transactional
: ํ
์คํธ ์ผ์ด์ค์ ์ด ์ ๋
ธํ
์ด์
์ด ์์ผ๋ฉด, ํ
์คํธ ์์ ์ ์ ํธ๋์ญ์
์ ์์ํ๊ณ , ํ
์ค ํธ ์๋ฃ ํ์ ํญ์ ๋กค๋ฐฑํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด DB์ ๋ฐ์ดํฐ๊ฐ ๋จ์ง ์์ผ๋ฏ๋ก ๋ค์ ํ
์คํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์คํ๋ง ์ปจํ ์ด๋ ์ฌ๋ฆฌ๊ณ , db ๋ ๊ฐ์ด ์ฌ๋ ค์ ํ๋ ํ ์คํธ๋ ์ฌ์ค์ ์ข์ ํ ์คํธ์ ์๋ ์๋๋ค. ์ด๋ฐ ํ ์คํธ๋ฅผ ํตํฉ ํ ์คํธ๋ผ๊ณ ํ๋๋ฐ, ์์ ๋จ์๋ก ์ชผ๊ฐ์ ํ๋ ๋จ์ ํ ์คํธ๊ฐ ๋ ์ข์ ํ ์คํธ์ผ ํ๋ฅ ์ด ๋๋ค. ์์ผ๋ก ํ ์คํธ๋ฅผ ์งค๋, ์์ํ ์๋ฐ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ํ๋ ๋จ์ ํ ์คํธ์ ์ข ๋ ์ค์ ์ ๋๊ณ ํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.