1. Transaction이란?
더이상 나눌수없는 작업 단위
예) 계좌 이체의 경우, 출금과 입금이 하나의 Tx로 묶여야 됨. (Tx = Transaction )
김모씨 이체 → 박모씨 조회. 만약 이체는 됬지만 조회가 안된다면 ? 이체한돈은 증발 ?
그래서 이체 및 조회 둘다 성공해야지만 최종 성공. 하나라도 실패시 roll back.\
둘 이상의 작업은 Transaction으로 묶어야함.
2. Transaction의 속성 - ACID
원자성 (Atomicity) : 나눌수 없는 하나의 작업으로 다뤄줘야한다. ( 이체 + 조회 를 하나의 작업으로 묶음 )
일관성 (Consistency) : Tx수행 전과 후가 일관된 상태를 유지해야 한다.
고립성 (Isoation) : 각 Tx는 독립적으로 수행되어야 한다. ( 각 Tx는 서로 영향을 안끼치도록 )
영속성 (Durability) : 성공한 Tx의 결과는 유지되어야한다.
3. 커밋(commit)과 롤백 (rollback)
커밋(commit) : 작업내용을 DB에 영구적으로 저장
롤백(rollback) : 최근 변경사항을 취소하고, 마지막 커밋으로 복귀
4. 자동 커밋과 수동커밋
자동커밋(Auto-commit) : 명령실행후, 자동으로 커밋이 수행 ( rollback qnfrk)
수동커밋(Manual-commit) : 명령실행후, 명시적으로 commit 또는 rollback 입력 ( Transaction에서는 수동필요 )
5. Transaction의 Isoation(고립성) 레벨 : 각 Tx을 고립시키는 정도
각 Transaction을 고립시키는 정도.
① Read Uncommited : 커밋되지 않은 데이터도 읽기가능 ( dirty read : 누군가 손댄걸 읽음)
② Read Commited: 커밋된 데이터만 읽기가능 ( phantom read : 다른 Tx에서 커밋되자 갑자기 나타남)
③ Repetable Read: Tx이 시작된 이후 변경은 무시됨. ( default )
Tx중에는 변하지 않고 그대로 반복
④ Serializable : 한번에 하나의 Tx만 독립적으로 수행. ( 고립도 최상 )
작업이 직렬화되있음
@Test
public void transactionTest() throws Exception{ // 사용자 정보를 user_info테이블에 저장하는 메서드
Connection conn = null;
try {
deleteAll();
conn = ds.getConnection(); // ① DB에 데이터를 넣기위해 연결
conn.setAutoCommit(false); // 트랜잭션을 위해 오토커밋 false. setAutoCommit기본값은 true
// flase로 함으로써 여러개의 문장을 하나로 묵음
//② 실행할 sql문 작성
String sql = "insert into user_info values (?, ?, ?, ?, ?, ?, now())";
// 매개변수로 받은 User 객체값을 user.getID() 할수도있지만 '," 실수 할수있고 길고 복잡.
// 그래서 값들 대신에 자리수에 맞게 ? 표로 일단 채워줌.
PreparedStatement pstmt = conn.prepareStatement(sql);
// ③ psmt.setString에 ? 에 들어갈 값을 순서대로 채운다.
pstmt.setString(1, "asdf"); // ( 첫번째물음표, 넣을값 )
pstmt.setString(2, "1234");
pstmt.setString(3, "홍길");
pstmt.setString(4, "aaa@aaa.com");
// pstmt.setDate이 util타입 → slq타입으로 변환필요
pstmt.setDate(5, new java.sql.Date(new Date().getTime()));
pstmt.setString(6, "kakaotak");
// ④ 다채웠으니 실행
int rowCnt = pstmt.executeUpdate(); // executeUpdate() 반환값이 int. 즉, sql문을 실행한결과로 몇개의 행이 영향을 받았는가?)
// executeUpdate()는 insert, update, delete에만 사용 ( 성공시 1, 실패시 0 반환 )
// executeQuery()는 select시 사용함
pstmt.setString(1,"asdf");
rowCnt = pstmt.executeUpdate(); // insert문 2번째 실행
conn.commit();
} catch (Exception e) {
conn.rollback(); // 에외 발생시 인설트 하나는 성공했더라도 무효화됨
e.printStackTrace();
} finally {
}
}
AOP의 개념과 용어
1. 공통 코드의 분리
여러 메서드에 공통 코드를 추가해야한다면?
만약 수정이 필요하다면, 일일이 다고쳐야함. 이 공통 중복코드를 처리하는게 AOP
2. 코드를 자동으로 추가한다면, 어디에?
Advice = 자동 추가할 코드를 말함 | ||
메서드 시작부분에 자동코드를 추가한다면 ? | Befor Advice | |
메서드 마지막부분에 자동코드를 추가한다면 ? | After Advice | |
Befor + After 두 위치 모두 추가한다면 ? | Aroud Advice |
※ 중간에 넣을순없음!
3. AOP (Aspect Oriented Programming)란?
관점지향 프로그래밍.
부가기능(advice)을 동적으로 추가해주는 기술.
메서드의 시작 또는 끝에 자동으로 코드(advice)를 실행중에 추가
공통적으로 사용하는것 ( Logging, Transaction, Security )
4. AOP 관련용어
5. Advice의 종류
Advice의 설정은 XML과 어노테이션, 두 가지 방법으로 가능
6. pontcut expression
advice가 추가될 메서드를 지정하기 위한 패턴
AOP 사용을 위해 필요한 라이브러리 추가 ( pom.xml )
<!-- AspectJ 라이브러리-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!--Spring AOP 라이브러리-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!--AspectJ Weaver » 1.9.7 라이브러리-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
<scope>runtime</scope>
</dependency>
만약 add메서드만 실행시키고 싶다면?
참고 :
남궁성, 스프링의 정석
'Spring의 정석' 카테고리의 다른 글
게시판만들기 ( MyBatis 소개와 설정 )1~2 (0) | 2023.03.27 |
---|---|
Spring_DI와 AOP(Transactional)_19~21 (0) | 2023.03.26 |
Spring_DI와 AOP(Spring 으로 DB연결)_14~16 (0) | 2023.03.24 |
Spring_DI와 AOP(Spring 으로 DB연결)_13 (0) | 2023.03.23 |
Spring_DI와 AOP(워크벤치 사용법, SQL 기초)_11 (0) | 2023.03.22 |