localhost:8080으로 들어가서, 회원 목록을 클릭하면 다음과 같이 JDBC 데이터베이스에 들어있는 회원 정보가 나타난다.
구현 클래스 추가 이미지
스프링 설정 이미지
* 개방-폐쇄 원칙 (OCP, Open-Closed Principle)
: 확장에는 열려있고, 수정, 변경에는 닫혀있다.
* 스프링의 DI(Dependencies Injection)을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다.
* 회원을 등록하고 DB에 결과가 잘 입력되는지 확인하자.
* 데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다.
🏃🏻♀️ 스프링 통합 테스트
스프링 컨테이너와 DB까지 연결한 통합 테스트를 진행해보자.
test/.../service 패키지 아래에 MemberSerivceTest를 복사한 MemberServiceIntegrationTest를 생성한다.
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
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;
importstatic org.assertj.core.api.Assertions.assertThat;
importstatic org.junit.jupiter.api.Assertions.assertThrows;
// 아래 어노테이션들을 보내야 함@SpringBootTest// 스프링 컨테이너와 테스트를 함께 실행한다.@Transactional// 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다! -> DB에 데이터가 남지 않으므로, 다음 테스트에 영향을 주지 않는다.classMemberServiceIntegrationTest{
// 테스트할 때는 손쉽게 필드 @Autowired 해도 상관 없다.@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Testvoid 회원가입() { // 테스트 코드는 한글로 적어도 됨 (직관적) -> 빌드될 때 테스트 코드는 실제 코드에 포함되지 않음// given 무언가가 주어지고
Member member = new Member();
member.setName("spring");
// when 실행됐을 때
Long saveId = memberService.join(member);
// then 이런 결과가 나와야 함
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
/**
* 중복 회원 예외도 테스트해줘야 한다!
*/@Testpublicvoid 중복_회원_예외() {
// given
Member member1 = new Member();
member1.setName("Spring");
Member member2 = new Member();
member2.setName("Spring");
// when
memberService.join(member1);
/**
* 방법 1
* try - catch 사용
*//*
try {
memberService.join(member2);
fail("예외가 발생해야 합니다.");
} catch (IllegalStateException e) {
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
*//**
* 방법 2
* assertThrows 사용
*/
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));// member2를 join하면 IllegalStateException이 발생해야 한다는 뜻!
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// then
}
}
@SpringBootTest와 @Transactional 어노테이션을 붙여준다.
@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행
@Transactional : 테스트 케이스에 이 어노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.