트랜잭션 처리

아기코딩단2·2022년 4월 6일
0

트랜잭션 처리

트랜잭션이 필요한 이유와 다루는 방법
현재 DB의 전화번호 길이는 VARCHAR(20)임 이런 경우 전화번호가 20자리를 초과할 때 => 이런 경우 오류가 발생하고 메서드 호출이 종료된다. 요청처리 중단되지만 그전까지 입력한 값은 그대로 유지된다.
범위를 넘지않는 이름이나 이메일은 성공적으로 들어감

데이터 처리중 오류 발생시 대응방법(정책에 따라 나뉘어짐)

데이터 변경 작업에 대한 처리방법(입력/변경/삭제)은 두가지가 존재한다.
1) 데이터 처리 작업중 일부 작업이 실패하더라도 그전에 수행한 작업은 그대로 승인하는 경우가 존재

2) 데이터 처리 작업중 일부 작업에 오류 발생시 그전에 수행한 작업을 모두 취소해야하는 경우 존재
2-ex) 좌석예약(결제실패 -> 예약취소/일부 좌석 예약 실패 -> 전체예약 취소 => (all or nothing)) 이 경우 트랜잭션 적용이 필요하다.

트랜잭션이란? -> 여러개의 데이터 조작(manipulation(입력/변경/삭제)) 작업을 한 단위로 묶은 것

한 단위로 묶게되면 데이터 처리가 단위별로 수행된다. -> 단위에 묶인 모든 작업이 성공 -> DB에 적용

  1. 트랜잭션 적용 전
    insert /insert/ update(앞의 새게는 한 단위가 아님) -> DBMS -> 즉시 적용 -> 테이블

  2. 트랜잭션 적용 후(APP 클래스에 @EnableTransactionManagement 활성화)
    insert /insert/ update(앞의 세개를 한 단위로 묶어버림) -> 임시DB에 보관하다가 commit 하면 실제 테이블에 적용

스프링프레임워크 문서보는 법
5.2 -> 5.3돠면 클래스나 메서드가 추가됐다는 것임
우리 버전은 현재 5.2니까 5.2.- 사용하면 됨

controller에
@Autowired
TransactionTemplate transactionTemplate;
추가시켜주면 됨

스프링 프레임워크에서 정한 규칙에 따라 적용해야한다
=> implements TransactionCallback 구현

TransactionTemplate 가 작업 실행 및 트랜잭션을 제어한다. 성공적으로 수행되면 commit 호출하고 실패하면 rollback 호출한다.

서비스 객체 도입 => 업무관련 코드와 트랜잭션 관련 코드를 캡슐화
=>ContactController 가 각각의 ContactService 를 호출하도록함(트랜잭션을 사용할지 말지)

component = service 인데 service 객체에 service 애노테이션 붙이면 됨

interface 를 보면 callee 만들 건지 caller 만들 건지 생각해야함

추상메서드가 하나인 인터페이스 => functional interface 라고 부름

람다 문법 적용하려면 funtionlal interface에게 가능

service 안붙으면 spring boot 는 잘 알려주지 못함

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("t1"); => 이게 같은 트랜잭션에 설정하는 것임
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); => 트랜잭션 정책설정
보통은 Required 를 사용함
=> 이 메서드를 호출하는 쪽에서 트랜잭션이 있으면 이 메서드의 작업들도 그 트랜젝션에 소속된다.
=> 이 메서드를 호출하는 쪽에서 트랜젝션이 없다면, 이 메서드에서 새 트랜젝션을 만들어 작업을 수행한다.

spring에는 trasaction 처리가 많음 template,@Transactional, 원초적인 방법(try catch문에 commit, rollback하는 방법/트랜잭션 매니저를 직접 호출하는 방법)) 그래서 조금 번거로울 수 있음

C:\Users\bitcamp\git\0318\bitcamp-20211108\mylist-boot\app\src\main\java\com\eomcs\mylist\service\ContactServiceTrasaction3.java => @Transactional 사용한 거

인터페이스를 적용하게 되면 특정 클래스에 종속되는 것을 줄일 수 있다. ex) ContactController 가 ContactService 인터페이스를 사용하게 되면 직접 클래스를 지정하는 대신에 인터페이스를 지정하면 객체를 교체하기가 쉽다(EX) ContactServiceNonTransaction....)

profile
레거시 학살자

0개의 댓글