## 71. 트랜잭션 제어 코드를 캡슐화하기: Spring의 TransactionTemplate 모방 구현
- 트랜잭션 제어 코드를 캡슐화하여 반복적인 코드 작업을 줄이는 방법
- Spring의 TransactionTemplate 클래스를 모방하여 내부 메커니즘을 이해하기
=>
ㄴ bitcamp 에 util 이라는 이름의 새로운 패키지를 생성
=>
=>
ㄴ bitcamp.util 패키지에 TranscationTempalte 이라는 이름의 새로운 클래스 파일 생성
https://docs.spring.io/spring-framework/reference/data-access/transaction/programmatic.html
ㄴ 참고하기
=>
util/TransactionTemplate.java
=>
=>
ㄴ bitcamp.util 패키지에 TranscationCallback 이라는 이름의 새로운 인터페이스 파일 생성
=>
util/TransactionCallback.java
util/TranscationTemplate.java
=>
DefaultBoardService.java
ㄴ 해당 코드 복사
=>
util/TransactionTemplate.java
ㄴ 복사한 코드 붙여넣기
=>
util/TransactionTemplate.java
=>
util/TransactionTemplate.java
ㄴ 해당 코드 제거
=>
util/TransactionTemplate.java
ㄴ rv 를 리턴하도록 함
=>
service/DefaultBoardService.java
ㄴ 트랜잭션 처리는 TransactionTemplate 에서 처리하므로 PlatformTransactionManager -> TransactionTemplat 으로 변경
=>
service/DefaultBoardService.java
ㄴ 생성자에서 해당 코드 추가
=>
service/DefaultBoardService.java
ㄴ 트랜잭션 처리는 TransactionTemplate 에서 처리하므로 해당 코드 제거
=>
service/DefaultBoardService.java
ㄴ add 메서드 안에 Mywork 라는 클래스 추가하기
=>
service/DefaultBoardService.java
ㄴ 트랜잭션 처리는 TransactionTemplate 에서 처리하므로 해당 코드 제거
=>
service/DefaultBoardService.java
ㄴ Mywork이라는 내부 클래스를 정의하여 TransactionCallback 인터페이스를 구현
ㄴ 이 내부 클래스의 doInTransaction 메서드에서 게시판 추가와 파일 추가 작업을 트랜잭션 내에서 처리
ㄴ txTemplate.execute(new Mywork())를 호출하여 트랜잭션 내에서 Mywork 콜백을 실행하도록 함
ㄴ 트랜잭션 내에서 작업을 실행하고 결과를 반환하도록 함
util/TransactionCallback.java
ㄴ T 타입으로 변경해주도록 함
=>
util/TransactionTemplate.java
ㄴ T 타입으로 변경해주도록 함
=>
service/DefaultBoardService.java
=>
service/DefaultBoardService.java
=>
service/DefaultBoardService.java
=>
service/DefaultBoardService.java
ㄴ 해당 코드 제거
=>
service/DefaultBoardService.java
ㄴ 해당 코드 제거
=>
service/DefaultBoardService.java
=>
service/DefaultBoardService.java
ㄴ 파라미터 타입 제거
=>
service/DefaultBoardService.java
ㄴ 해당 코드 제거
=>
service/DefaultBoardService.java
ㄴ 해당 코드 제거
=>
service/DefaultBoardService.java
=>
service/DefaultBoardService.java
=>
service/DefaultBoardService.java
ㄴ 해당 코드 제거
=>
service/DefaultBoardService.java
ㄴ 해당 코드 제거
=>
service/DefaultBoardService.java
=>
service/DefaultBoardService.java
=>
service/DefaultBoardService.java
=>
service/DefaultBoardService.java
ㄴ 해당 코드 제거
=>
service/DefaultBoardService.java
ㄴ 해당 코드 제거
=>
service/DefaultBoardService.java
service/DefaultMemberService.java
ㄴ PlatformTransactionManager -> TransactionTemplate 으로 변경
=>
service/DefaultMemberService.java
ㄴ 생성자 변경
=>
service/DefaultMemberService.java
=>
service/DefaultMemberService.java
ㄴ 해당 코드 제거
=>
service/DefaultMemberService.java
=>
service/DefaultMemberService.java
ㄴ 문장 하나이므로 중괄호 제거
=>
service/DefaultMemberService.java
=>
ㄴ 문장 하나이므로 return, 세미콜론(;) 제거
=>
service/DefaultMemberService.java
간결하게 정리
=>
service/DefaultMemberService.java
ㄴ 해당 코드 제거
=>
service/DefaultMemberService.java
=>
service/DefaultMemberService.java
=>
service/DefaultMemberService.java
ㄴ 한 문장으로 만들기
=>
service/DefaultMemberService.java
ㄴ 해당 코드 제거
=>
service/DefaultMemberService.java
=>
service/DefaultMemberService.java
=>
service/DefaultMemberService.java
ㄴ 한 줄로 만들기
service/DefaultBoardService.java
ㄴ 한 줄로 만들기
=>
service/DefaultBoardService.java
ㄴ count 변수 제거하고 return 문에 직접 넣기
=>
service/DefaultBoardService.java
ㄴ 다른 메서드 처럼 rv -> count 로 변경
=>
ㄴ App 실행
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
전체적으로 테스트 정상적으로 실행됨을 확인