DAO(Data Access Object)


데이터에 접근하기 위한 객체인 DAO(Data Access Object)는 DB에 저장된 데이터에 대해 읽기, 쓰기, 삭제, 변경을 수행(CRUD)한다. DB 테이블당 하나의 DAO를 작성(1:1) 한다.

 

ex) LoginController ⇄ UserDao ⇄ DB 

     

위 예처럼 LoginController에서 바로 DB에 접근하지 않고 UserDao를 통해 간접적으로 접근한다. 그 이유는 예를 들어 LoginController에서도 selectUser()라는 메서드가 있고, RegisterController에서도 selectUser()라는 메서드가 있는 상황이라고 가정해보자. 그러면 각 컨트롤러에서 중복해서 사용되는 메서드들이 존재하게 될 것이기 때문에 이를 따로 DAO에 분리하여 관리해주는 것이다.

 

이때 각 계층으로 나눠보자면, 컨트롤러의 경우 Presentation Layer으로써 데이터를 보여주는 계층이 되고, DAO의 경우 Persistence Layer(영속 계층) 혹은 Data Access Layer(데이터 접근 계층)으로써 데이터에 접근하는 계층이 된다. 이때 데이터에 접근하는 계층으로 따로 분리해놓으면 DB가 MySQL을 사용하다 Oracle로 변경하여도 해당 계층만 바꿔주면 되기 때문에 변경에 유리해진다.

 

※ Business Layer도 존재하지만 뒤이어 이후의 글에서도 다루도록 한다.

 

 

 

 

트랜잭션(Transaction) & 커밋(Commit) & 롤백(Rollback)


트랜잭션(Transaction, Tx) => 더 이상 나눌 수 없는 작업의 단위

ex) INSERT, UPDATE, SELECT, 계좌이체(출금과 입금이 하나의 Tx로 묶여야 하나만 실패해도 취소되기 때문)

 

Transaction의 속성 - ACID

 

  ①원자성(Atomicity) - 나눌 수 없는 하나의 작업으로 다뤄져야 한다.

  ②일관성(Consistency) - Tx 수행 전과 후가 일관된 상태로 유지되어야 한다.

  ③고립성(Isolation) - Tx는 독립적으로 수행되어야 한다.

  ④영속성(Durability) - 성공한 Tx의 결과는 유지되어야 한다.

 

Transaction의 Isolation Level - 각 Tx을 고립시키는 정도

 

  ①READ UNCOMMITED - 커밋되지 않은 데이터도 읽기 가능

  ②READ COMMITED - 커밋된 데이터만 읽기 가능

  ③REPEATABLE READ - Tx이 시작된 이후 종료(commit)까지 다른 Tx의 변경은 무시 (default)

  ④SERIALIZABLE - 한번에 하나의 Tx만 독립적으로 수행(Tx의 작업이 끝날 때까지 다른 Tx는 대기. 작업 중인 Tx가 select문을 사용할 경우 다른 Tx도 select는 사용할 수 있음.)

 

 

커밋(Commit)롤백(Rollback)

 

커밋(Commit) - 작업 내용을 영구적으로 DB에 저장

    ①자동 커밋 - 명령 실행 후, 자동으로 커밋 수행. 따라서 롤백 불가

    ②수동 커밋 - 명령 실행 후, 명시적으로 커밋 또는 롤백 수행. ex)계좌이체 같은 경우 수동 커밋을 통해 두 Tx을 하나의 작업 단위로 처리

롤백(Rollback) - 최근 변경사항을 취소(마지막 커밋 즉 최근 커밋으로 복귀)

 

 

 

 

 

 

+ Recent posts