| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 백준문제
- 별 찍기
- 티스토리 블로그
- jsp
- Ajax
- 이클립스단축기
- 스프링
- 인터페이스
- 공부
- 오류
- 오라클
- 설정
- ORA-02292
- ORA-01407
- MSI
- 오류모음
- 이클립스
- 환경설정
- 자바
- 전화번호부
- 백준문제풀이
- spring
- 순환문
- 백준
- for문
- 깃허브 블로그
- while
- 파워서플라이
- Oracle
- 무결성 제약조건
Archives
- Today
- Total
danDevlog
[Spring Boot] 스프링 통합 테스트 / JdbcTemplate 본문
728x90
순수 JDBC를 이용해서 만든 결과물을 스프링 컨테이너와 DB까지 연결한 통합테스트로 진행해본다.
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.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
// 테스트는 한 번뿐이아니라 여러번도 실행할 수 있어야한다.
// 하지만 회원가입을 두번 테스트하면 이미 존재하는 회원으로 에러가 발생한다
// 그러면 또 AfterEach로 초기화를 시켜줘야하는가?
// Transactional을 사용하면 테스트를 실행 한 후, 마지막에 RollBack을 발생시켜
// 데이터베이스에 저장되지 않게해준다!(반영안됨)
@Transactional
class MemberServiceIntegrateTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
void 회원가입() {
//given
Member member = new Member();
member.setName("spring10");
//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);
//then
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// try{
// memberService.join(member2);
// fail("예외가 발생해야 합니다.");
// }catch (IllegalStateException e){
// assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// }
}
}
@SpringBootTest 는 스프링 컨테이너와 테스트를 함께 실행한다는 뜻
-스프링 JdbcTemplate-
마찬가지로 repository 패키지 안에 생성해준다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class JdbcTemplateMemberRepository implements MemberRepository{
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateMemberRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Member save(Member member) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", member.getName());
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
member.setId(key.longValue());
return member;
}
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id);
return result.stream().findAny();
}
@Override
public Optional<Member> findByName(String name) {
List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
return jdbcTemplate.query("select * from member", memberRowMapper());
}
private RowMapper<Member> memberRowMapper(){
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
};
}
}
스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 순수 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL 쿼리는 직접 작성해야 한다.
이후 마찬가지로 SpringConfig에서 return new JdbcTemplateMemberRepository(dataSource); 로 변경해준다.
'Spring 입문' 카테고리의 다른 글
| [Spring Boot] AOP(Aspect Oriented Programming) (0) | 2022.03.27 |
|---|---|
| [Spring Boot] 스프링 DB 접근 기술 - JPA / 스프링 데이터 JPA (0) | 2022.03.27 |
| [Spring Boot] 스프링 DB 접근 기술 - H2 데이터베이스 / 순수JDBC (0) | 2022.03.27 |
| [Spring Boot] 회원 관리 예제 - 회원 웹 기능(홈 화면, 등록, 조회 기능) (0) | 2022.03.26 |
| [Spring Boot] 자바 코드로 직접 스프링 빈 등록하기 (0) | 2022.03.26 |
Comments