create table member
(
id bigint generated by default as identity,
name varchar(255),
primary key (id)
);
insert into member(name) values("spring1");
insert into member(name) values("spring2");
/* SpringConfig */
@Configuration
public class SpringConfig {
private final DataSource dataSource;
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
...
@Bean
public MemberRepository memberRepository(){
//return new MemoryMemberRepository();
return new JdbcMemberRepository(dataSource);
개방 폐쇄 원칙 (OCP, Open-Closed Principle)
확장에는 열려있고, 수정에는 닫혀있다.
- 스프링의 DI를 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다.
회원을 등록하고 DB에 결과가 잘 입력되는지 확인하면, 데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다.
참고 ) SOLID 객체지향 5대 원칙
/* MemberServiceIntegrationTest */
@SpringBootTest
@Transactional
// Transaction을 통해 DB를 주기적으로 rollback
class MemberServiceIntegrationTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
void 회원가입(){
//given
Member member = new Member();
member.setName("spring");
Long saveId = memberService.join(member);
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
🔥 TIP 🔥
위의 코드와 같이
@Transactional
과 같은 에노테이션을 이용한 테스트는 통합테스트이고,
@AfterEach / @BeforeEach
를 이용해 단위로 코드를 작성한 것이 단위 테스트다.테스트 케이스를 작성할 때, 순수한 단위 테스트가 성능이 훨씬 좋다.
테스트 케이스 코드를 짤 때 단위 테스트 위주의 코드를 짜는 연습을 하는게 좋다!
단위 테스트 코드 예시
@AfterEach // 모든 메서드가 연산을 수행한 후 동작할 수 있도록 선언 // 콜백 메서드 public void afterEach() { repository.clearStore(); } @Test public void save() { Member member = new Member(); member.setName("spring"); repository.save(member); Member result = repository.findById(member.getId()).get(); assertThat(member).isEqualTo(result); }