Data Base/스프링 DB

스프링 DB 1 - JDBC개발 - 수정, 삭제

Surge100 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