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메서드만 실행시키고 싶다면?

 


참고 :

남궁성, 스프링의 정석

+ Recent posts