반응형

 mybatis를 이용해서 간단하게 CRUD를 하는 API를 만드는 도중에, 아래와 같은 이슈가 발생하였습니다.

 

 왜 그랬을까요? 제 DAO 클래스 중 일부분만 보도록 하겠습니다.

 

 


 제가 작성한 DAO 클래스 중 일부만 따 보겠습니다.

 

 

 먼저 UserDAO의 생성자에는 위와 같은 내용이 들어가 있습니다. 다른 건 중요하지 않고, 바로 SqlSessionFactoryBuilder로 들어가 보도록 하겠습니다. 여기서 InputStream 참조 변수 하나만 받는 build 메서드를 찾아보겠습니다.

 

 

 바로 이 메서드군요. 여기서 3개의 인자를 가지는 build를 찾아보겠습니다.

 

 

 이 친구군요. 78번째 줄의 build를 보겠습니다.

 

 

 그러면, 새로 생성된 DefaultSqlSessionFactory 객체를 참조하는 값이 리턴 됩니다. 그러면 실제로 sqlSessionFactory는 어떤 객체를 가리키나요? DefaultSqlSessionFactory를 가리키게 됩니다.

 

 


그러면, sqlsessionfactory.opensession()을 했을 때 흐름을 따라가 보겠습니다.

 

 

 

 정확하게 말하면 이 부분입니다. 여기서 안쪽으로 들어가 보겠습니다.

 

 

 

 

 뭔가 복잡한 것 같지만 Default~ 클래스로 들어왔습니다.

 

 

 this의 autocommit를 보니 false가 눈에 들어옵니다. level은 null로 되어 있는데요. 이는 격리 레벨을 의미합니다.

 

 

 그리고 이것 저것 한 다음에 DefaultSqlSession 객체를 리턴하는 구조인데요. 95번째 줄에 있는, newTransaction 메서드 안으로 들어가 보겠습니다.

 

 

 DataSource와, 격리 레벨, 그리고 Autocommit 여부를 넘겨줍니다.

 

 

 그리고, 내부적으로 JdbcTransaction을 호출합니다. 어찌 되었던, Autocommit 여부를 설정하지 않으면, 자동 커밋이 되지 않는다가 매우 중요합니다.

 


 TransactionIsolation 레벨을 출력해 보겠습니다.

 

 connection 클래스에는 getTransactionIsolation 메서드가 있습니다. 이걸 통해서 격리 레벨을 출력해 보도록 하겠습니다.

 

 

 2네요. Connection.class에 들어가서 해당 숫자가 의미하는 것을 보겠습니다.

 

 

 Read_commited. 이것은 commit되지 않은 데이터는 읽을 수 없다는 것입니다. 그러면, 한 트랜잭션이 실행이 되고, insert를 수행했다고 합시다. 아직 commit이 수행되지 않은 경우에, insert가 된 데이터를 읽을 수 없습니다.

 


 register 메소드를 보겠습니다.

 

 

 되게 어려워 보이지만, 유저의 정보가 들어오면, insert를 해 주는 함수입니다.

 

 

 여기서, insert 쿼리가 성공하면 commit하고, 아니면 rollback 하는 연산을 주석 처리해 보도록 하겠습니다.

 

 

 다음에 usert 테이블에서 user_id와 user_pw만 보도록 하겠습니다. 이 둘은 임의로 설정한 값입니다.

 

 

 그리고, /user/reg에 post로 다음 데이터를 날려보도록 하겠습니다. /user/reg에 post 방식으로 넘겨주면, 내부적으로 UserDAO의 register 메서드를 호출합니다. 그러면 insert 쿼리가 호출이 될 겁니다.

 

 

 다음에 다시 usert 중에서, id와 pw만 뽑아보겠습니다. 변화가 없다는 것을 알 수 있어요. commit이 일어나지 않았기 때문에, 실제 데이터 베이스에도 반영이 되지 않았습니다. 격리 레벨이 read_commit였습니다. 반영되지 않은 결과는 읽을 수 없습니다. 유저가 추가된 이벤트는 '반영'이 된 상태가 아니기 때문에, user가 2명만 있는 데이터가 그대로 나옵니다.

 

 

 그러면 이 경우에는 어떨까요? insert가 성공한 경우에는 commit을 하라고 했습니다.

 

 

 그렇게 때문에 새로 추가된 'chogahui066'이 테이블에 들어갔습니다. 격리 레벨에 관한 이야기는 db 카데고리에서 풀어보도록 하겠습니다.

반응형

댓글을 달아 주세요