스프링 DB 1 - JDBC개발 - 수정, 삭제
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
스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의
백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 백엔
www.inflearn.com