728x90
MemberRepositoryV0 - Update, Delete
public void update(String memberId, int money) throws SQLException {
String sql = "update member set money = ? where member_id=?";
Connection con = null;
PreparedStatement pstmt = null;
try {
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, money);
pstmt.setString(2, memberId);
int resultSize = pstmt.executeUpdate();//쿼리 실행
log.info("resultSize = {}" , resultSize);
} catch (SQLException e) {
log.error("db error", e);
throw e;
} finally {
close(con, pstmt, null);
}
}
public void delete(String memberId) throws SQLException {
String sql = "delete from member where member_id = ?";
Connection con = null;
PreparedStatement pstmt = null;
try {
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1, memberId);
pstmt.executeUpdate();
} catch (SQLException e) {
log.error("db error", e);
throw e;
} finally {
close(con, pstmt, null);
}
}
Test
@Test
void crud() throws SQLException {
//save
Member member = new Member("memberV0", 10000);
repository.save(member);
//findById
Member findMember = repository.findById(member.getMemberId());
log.info("findMember={}", findMember);
log.info("findMember == member {} ", findMember == member);
log.info("findMember == member {} ", findMember.equals(member));
assertThat(findMember).isEqualTo(member);
//update : money : 10000 -> 20000
repository.update(member.getMemberId(), 20000);
Member updateMember = repository.findById(member.getMemberId());
assertThat(updateMember.getMoney()).isEqualTo(20000);
//좋은 테스트 방식이 아니다
// 테스트 데이터를 지우기 전에 오류가 발생하게 되면 데이터가 삭제되지 않기 떄문에 데이터가 남게 된다.
//delete
repository.delete(member.getMemberId());
assertThatThrownBy(() -> repository.findById(member.getMemberId())).isInstanceOf(
//조회 할 수 없고, 오류가 발생한다.
//반복 테스트가 가능해 졋다
NoSuchElementException.class);
}
- Update가 잘되어 10000 -> 20000으로 잘 변경된 것을 확인할 수 있다.
- pstmt.executeUpdate()의 결과가 1인 것을 확인할 수 있다. 이것은 해당 SQL에 영향을 받은 로우 수가 1개라는 뜻이다.
- 회원을 삭제한 다음 findById() 를 통해서 조회한다. 회원이 없기 때문에 NoSuchElementException 이 발생한다. assertThatThrownBy는 해당 예외가 발생해야 검증에 성공한다
참고
마지막에 회원을 삭제하기 때문에 테스트가 정상 수행되면, 이제부터는 같은 테스트를 반복해서 실행할 수 있다. 물론 테스트 중간에 오류가 발생해서 삭제 로직을 수행할 수 없다면 테스트를 반복해서 실행할 수 없다.
트랜잭션을 활용하면 이 문제를 깔끔하게 해결할 수 있는데, 자세한 내용은 뒤에서 설명한다
728x90
'스프링 DB 1편(데이터 접근 핵심 원리)' 카테고리의 다른 글
| Ch02. 커넥션풀과 데이터소스 이해 - DataSource 이해 (0) | 2022.04.24 |
|---|---|
| Ch02. 커넥션풀과 데이터소스 이해 - 커넥션 풀 이해 (0) | 2022.04.24 |
| Ch01. JDBC 이해 - JDBC 개발(조회) (0) | 2022.04.23 |
| Ch01. JDBC 이해 - JDBC 개발(등록) (0) | 2022.04.23 |
| Ch01. JDBC 이해 - 데이터베이스 연결 (0) | 2022.04.23 |