-
스프링 DB 1 - JDBC개발 - 수정, 삭제Data Base/스프링 DB 2023. 11. 20. 17:10
JDBC개발 - 수정, 삭제
수정과 삭제는 등록과 비슷하다. 등록, 수정, 삭제 처럼 데이터를 변경하는 쿼리는 executeUpdate()를 사용하면 된다.
MemberRepositoryV0 - 회원 수정 추가
private 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); //영향 받은 row의 숫자를 반환 int resultSize = pstmt.executeUpdate(); log.info("resultSize={}",resultSize); }catch (SQLException e){ log.error("db error",e); throw e; }finally { //Exception이 발생할 경우 finally가 실행x close(con,pstmt,null); } }
executeUpdate()는 쿼리를 실행하고 영향받은 row수를 반환한다. 여기서는 하나의 데이터만 변경하기 때문에 결과로 1반환 된다. 만약 회원이 100이고, 모든 회원의 데이터를 한번에 수정하는 update sql을 실행하면 결과는 100이 된다.
MemberRepositoryV0Test - 회원 수정 추가
package hello.jdbc.repository; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.sql.SQLException; @Slf4j class MemberRepositoryV0Test { MemberRepositoryV0 repository = new MemberRepositoryV0(); @Test void crud() throws SQLException { //save Member member = new Member("memberV5", 10000); repository.save(member); //findById Member findMember = repository.findById(member.getMemberId()); log.info("findMember={}", findMember); Assertions.assertEquals(findMember,member); //update: money: 10000 -> 20000 repository.update(member.getMemberId(),20000); Member updateMember = repository.findById(member.getMemberId()); Assertions.assertEquals(updateMember.getMoney(),20000); } }
회원 데이터 money를 10000 → 20000으로 수정하고, DB에서 데이터를 다시 조회해서 20000으로 변경 되었는지 검증한다.
실행로그
MemberRepositoryV0 - resultSize=1
pstmt.executeUpdate()의 결과가 1인 것을 확인할 수 있다. 이것은 해당 SQL에 영향을 받은 로우 수가 1개라는 뜻이다.
데이터베이스에서 조회하면 memberV0의 money가 20000으로 변경된 것을 확인할 수 있다.
select * from member;
➕참고
이 테스트는 2번 실행하면 PK중복 오류가 발생한다. 이 경우 delete from member 쿼리로 데이터를 삭데한 다음 다시 실행하도록 하자MemberRepositoryV0 - 회원 삭제 추가
package hello.jdbc.repository; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.sql.SQLException; import java.util.NoSuchElementException; @Slf4j class MemberRepositoryV0Test { MemberRepositoryV0 repository = new MemberRepositoryV0(); @Test void crud() throws SQLException { //save Member member = new Member("memberV6", 10000); repository.save(member); //findById Member findMember = repository.findById(member.getMemberId()); log.info("findMember={}", findMember); Assertions.assertEquals(findMember,member); //update: money: 10000 -> 20000 repository.update(member.getMemberId(),20000); Member updateMember = repository.findById(member.getMemberId()); Assertions.assertEquals(updateMember.getMoney(),20000); //delete repository.delete(member.getMemberId()); Assertions.assertThrows(NoSuchElementException.class, ()->repository.findById(member.getMemberId())); } }
회원을 삭제한 다음 findById()를 통해서 조회한다. 회원이 없기 때문에 NoSuchElementException이 발생한다. 그러므로 해당 예외가 발생하는 Test 코드를 Assertions를 활용해서 작성한다.
➕참고
마지막 회원을 삭제하기 때문에 테스트가 정상 수행되면, 이제부터는 같은 테스트를 반족해서 실행할 수 있다. 물론 테스트 중간에 오류가 발생해서 삭제 로직을 수행할 수 없다면 테스트를 반복해서 실행할 수 없다.
트랜잭션을 활용하면 이 문제를 깔끔하게 해결할 수 있는데, 자세한 내용은 뒤에서 설명한다. (⭐테스트에서는 반복해서 테스트를 하는 것이 매우 중요하다.)[출저 - 스프링 DB 1편 - 데이터 접긎 핵심 원리, 김영한]
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
'Data Base > 스프링 DB' 카테고리의 다른 글
스프링 DB - DataSource의 이해 (0) 2023.11.21 스프링 DB 1 - 커넥션 풀 과 데이터 소스 이해 (0) 2023.11.21 스프링 DB - JDBC 개발 - 조회 (0) 2023.11.20 스프링 DB - JDBC개발 - 등록 (1) 2023.11.20 스프링 DB - 데이터베이스 연결 (2) 2023.11.20