-
12 서비스 계층의 분리와 @Transactional(1)Spring/02 Spring DI와 AOP 2023. 7. 8. 21:57반응형
서비스 계층의 분리와 @Transactional(1)
1) 서비스 계층(Layer)의 분리 비즈니스 로직의 분리
1-1) 서비스 계층(Layer)의 분리 비즈니스 로직의 분리
- 1)그림에서 UserHistoryDao의 추가하면 → RegisterController(userHistoryDao생성)변경해야된다
- 1-1)그림처럼 UserHistoryDao와 비즈니스 로직을 처리하는 UserService를 생성한다
>> 장점1) RegisterController는 UserService만 호출해주면
영속계층이 늘어나도 RegisterController는 에는 영향이 없다
장점 2) Tx 처리, UserService에 Tx 처리가 적합하다
RegisterController도 Tx처리가 가능하나 너무 복잡해진다
>> @Component는 @Controller, @Service, @Repository를 포함하기 때문에
<Context:component-scan>으로 자동 스캔이된다
2) TransactionManager란?
- DAO의 각 메서드는 개별 Connection을 사용
>> ex) deleteUser( );를 2번 호출했다고 가정했을 때
①deleteUser( ); ②deleteUser( );은 별도의 deleteUser( );가 호출된다
①번과 ②번을 Tx로 묶을 수 없다(Connection이 하나씩 개별 처리하고 있기 때문에)
>> ①이 커밋되고 ②번이 롤벡 되었을 때, ①번과 ②번 전부 롤벡되어야 한다면?
>> ①번과 ②번이 같은 Connetion을 사용하게 한다(하나의 Tx로 묶기)
>> TransationManager - 같은 Tx의 명령들은 같은 Connetion을 사용하게 한다
2-1) TransactionManager란?
- 같은 Tx내에서 같은 Connetion을 사용할 수 있게 관리
- DAO에서 Connection을 얻거나 반환할 때 DataSourceUtils를 사용해야 한다
3) TransactionManager로 Transaction 적용하기
>> 개별 Connection → 같은 Connection 사용
>> ①번은 직접 입력 ②번은 bean에 등록하는 방법
4) @Transactional로 Transaction적용하기
- AOP를 이용한 핵심 기능과 부가 기능의 분리
- @Transactional은 클래스나 인터페이스에도 붙일 수 있음
>> @Transactional을 붙이면 AOP가 자동으로 부가 기능을 붙여준다
>> 부가 기능 + 핵심 기능 → 부가 기능과 핵심 기능의 분리
4-1) 실습
A1Dao.java
A1DaoTest.java
>> key값이 프라이빗 키로 되어있어 중복을 허용하지 않는다
>> (1,100) (1,200) 중복되브로 첫 번째 (1,100) 값만 입력되었다
4-2) 실습 (Tx적용하기)
A1Dao.java
root-context.xml
① TxManager 생성
② 핵심기능을 try-catch-finally 묶는다
③ tm.commit( )과 tm.rollback( ) 호출하고, 생성된 TxManager(status) 넣어준다
결과 확인
>> A1Dao.java의 conn 콘솔 출력결과 같은 주소를 찍어준다(Tx 적용)
>> 1의 값이 중복이기 때문에 에러
MySQL 에디터
>> 하나라도 에러가 발생하면 rollback( )
반응형'Spring > 02 Spring DI와 AOP' 카테고리의 다른 글
13 서비스 계층의 분리와 @Transactional(2) (0) 2023.07.09 11 AOP의 개념과 용어 (0) 2023.07.07 10 Transaction, Commit, Rollback (0) 2023.07.05 09 DAO의 작성과 적용(2-2) (0) 2023.07.04 09 DAO의 작성과 적용(2-1) (0) 2023.07.03