Spring 55

스프링 예외 추상화 적용 & JDBC 반복 문제 해결 - JdbcTemplate

package hello.jdbc.repository; import hello.jdbc.domain.Member; import hello.jdbc.repository.ex.MyDbException; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.JdbcUtils; import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator; import org.springframework.jdbc.support.SQLExceptionTranslator; im..

Spring/SpringDB 2022.07.04

스프링 예외 추상화 이해

아래와 같이 스프링 데이터 접근 예외 계층에 대한 그림을 보자. 스프링이 제공하는 예외 변환기는 아래와 같은 코드이다. => SQL ErrorCode를 직접 확인하는 방법 SpringExceptionTranslatorTest의 코드는 아래와 같다. @Slf4j public class SpringExceptionTranslatorTest { DataSource dataSource; @BeforeEach void init() { dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD); } @Test void sqlExceptionErrorCode() { String sql = "select bad grammer"; try { Connection ..

Spring/SpringDB 2022.07.04

체크 예외와 인터페이스 / 런타임 예외 적용

서비스 계층은 가급적 특정 구현 기술에 의존하지 않고 순수하게 유지하는 것이 좋다. MemberRepository 인터페이스를 도입해서 구현 기술을 쉽게 변경할 수 있게 해본다. 인터페이스를 도입하면 MemberService는 MemberRepository 인터페이스에만 의존하면 된다. 구현 기술을 변경하고 싶으면 DI를 사용해서 MemberService 코드의 변경 없이 구현 기술을 변경할 수 있다. MemberRepository 인터페이스 package hello.jdbc.repository; import hello.jdbc.domain.Member; public interface MemberRepository { Member save(Member member); Member findById(Stri..

Spring/SpringDB 2022.06.28

트랜잭션 적용

서비스를 하나 만들어보자. 계좌이체 - 내 돈을 빼서 다른곳에 넣는 로직을 작성해본다. 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