ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 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

     

    스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의

    백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 백엔

    www.inflearn.com

     

    댓글

Designed by Tistory.