전체 글 563

트랜잭션 적용

서비스를 하나 만들어보자. 계좌이체 - 내 돈을 빼서 다른곳에 넣는 로직을 작성해본다. service 패키지 안에서 MembmerServiceV1 클래스를 만들고 작성해준다. package hello.jdbc.service; import hello.jdbc.domain.Member; import hello.jdbc.repository.MemberRepositoryV1; import lombok.RequiredArgsConstructor; import java.sql.SQLException; @RequiredArgsConstructor public class MemberServiceV1 { private final MemberRepositoryV1 memberRepository; public void ac..

Spring/SpringDB 2022.06.15

DB 락 - 변경 / 조회

DB 락 - 변경 기본 데이터 입력 - SQL set autocommit true; delete from member; insert into member(member_id, money) values ('memberA',10000); 변경과 락 세션1 set autocommit false; update member set money=500 where member_id = 'memberA'; 세션1이 트랜잭션을 시작하고, memberA 의 데이터를 500원으로 업데이트 했다. 아직 커밋은 하지 않았다. memberA 로우의 락은 세션1이 가지게 된다. 세션2 SET LOCK_TIMEOUT 60000; set autocommit false; update member set money=1000 where mem..

Spring/SpringDB 2022.06.15

트랜잭션 - DB 예제 - 계좌이체

계좌이체 예제를 통해서 트랜잭션이 어떻게 사용되는지 살펴보자. 계좌이체 정상 계좌이체 문자 상황 - 커밋 계좌이체 문제 상황 - 롤백 기본 데이터 입력 set autocommit true; delete from member; insert into member(member_id, money) values ('memberA',10000); insert into member(member_id, money) values ('memberB',10000); 기본 데이터 준비 memberA 10000원 memberB 10000원 계좌이체 실행 memberA 의 돈을 memberB 에게 2000원 계좌이체하는 트랜잭션을 실행해보자. 다음과 같은 2번의 update 쿼리가 수행되어야 한다. set autocommit..

Spring/SpringDB 2022.06.15

트랜잭션 - DB 예제 - 트랜잭션 실습

h2 DB console 창 2개 띄워놓는다. 기본 데이터는 아래와 같고 데이터 초기화 SQL을 처음 h2 DB에 실행해준다. //데이터 초기화 set autocommit true; delete from member; insert into member(member_id, money) values ('oldId',10000); 데이터를 초기화하고, 세션1, 세션2에서 아래 쿼리를 실행해서 결과를 확인해보자. select * from member; 신규 데이터 추가 - 커밋 전 세션 1에서 신규 데이터를 추가해보자 - 커밋은 하지 않는다. 신규 데이터 추가 SQL //트랜잭션 시작 set autocommit false; //수동 커밋 모드 insert into member(member_id, money) v..

Spring/SpringDB 2022.06.15

트랜잭션 - DB 예제 2 - 자동 커밋 / 수동 커밋

자동 커밋 트랜잭션을 사용하려면 먼저 자동 커밋과 수동 커밋을 이해해야 한다. 커밋으로 설정하면 쿼리 실행 직후에 자동으로 커밋을 호출 / 커밋이나 롤백을 직접 호출하지 않아도 되는 편리함이 있다. 쿼리를 하나하나 실행할 때 마다 자동으로 커밋이 되어서 원하는 트랜잭션 기능을 제대로 사용할 수 없다. set autocommit true; //자동 커밋 모드 설정 insert into member(member_id, money) values ('data1',10000); //자동 커밋 insert into member(member_id, money) values ('data2',10000); //자동 커밋 => commit, rollback을 직접 호출하면서 트랜잭션 기능을 제대로 수행하려면 자동 커밋..

Spring/SpringDB 2022.06.15

트랜잭션 - 개념 이해

데이터베이스에서 트랜잭션이라 함은 하나의 거래를 안전하게 보장해준 다는 것 트랜잭션 ACID 트랜잭션은 ACID라 하는 원자성 일관성 격리성 지속성을 보장해야 한다. 원자성 : 원자성: 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야 한다. 일관성: 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. 격리성: 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준 (Isolation level)을 선택할 수 있다. 지속성: 트랜잭션을 성공적..

Spring/SpringDB 2022.06.15

DataSource 적용

DataSource를 사용해보자. => 의존관계 주입 받기\ 기존 코드를 유지하기 위해 기존 코드를 복사해서 새로 만들기 MemberRepositoryV0 -> MemberRepositoryV1 MemberRepositoryV0Test -> MemberRepositoryV1Test MemberRepositoryV1과 MemberRepositoryV1Test 두개를 만들어 둔다. DataSource 의존관계 주입 외부에서 DataSource를 주입 받아서 사용 -> 직접 만든 DBConnectionUtil을 사용하지 않아도 됨 DataSource는 표준 인터페이스여서 DriveManagerDataSource에서 HikariDataSource로 변경되어도 해당 코드를 변경하지 않아도 됨 JdbcUtils ..

Spring/SpringDB 2022.06.14

DataSource 예제 - DriverManager

DataSource 예제인 DriverManager를 만들어보자. 실제 커넥션을 각각 가져와 준다. package hello.jdbc.connection; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import static hello.jdbc.connection.ConnectionConst.*; @Slf4j public class ConnectionTest { @Test void driverManager() throws SQLException { Connection c..

Spring/SpringDB 2022.06.14

DataSource 이해

커넥션을 얻는 방법은 앞서 학습한 JDBC DriverManager 를 직접 사용하거나, 커넥션 풀을 사용하는 등 다양한 방법이 존재한다. 커넥션을 획득하는 다양한 방법 DriverManager를 통해 커넥션 획득 우리가 앞서 JDBC로 개발한 애플리케이션 처럼 DriverManager 를 통해서 커넥션을 획득하다가, 커넥션 풀을 사용하는 방법으로 변경하려면 어떻게 해야할까? DriverManager를 통해 커넥션 획득하다가 커넥션 풀로 변경시 문제 예를 들어서 애플리케이션 로직에서 DriverManager 를 사용해서 커넥션을 획득하다가 HikariCP 같은커넥션 풀을 사용하도록 변경하면 커넥션을 획득하는 애플리케이션 코드도 함께 변경해야 한다. 의존관계가 DriverManager 에서 HikariCP..

Spring/SpringDB 2022.06.14